Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «О Ρ‡Ρ‘ΠΌ Π½Π΅ ΠΏΠΈΡˆΡƒΡ‚ Π² ΠΊΠ½ΠΈΠ³Π°Ρ… ΠΏΠΎ DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 112

Автор А. Π“Ρ€ΠΈΠ³ΠΎΡ€ΡŒΠ΅Π²

ВсС строковыС выраТСния, вычислСнныС ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒΡΡ ΠΈΠ· памяти, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π±Ρ‹Π»ΠΎ ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΠ΄, ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‰ΠΈΠΉ эту ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π² эпилог Ρ‚ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΠ»ΠΎΡΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС β€” Π² эпилог локальной ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ DoGetClassInfo.

ΠžΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΠ²ΡˆΡƒΡŽΡΡ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ памяти Π½Π΅ сразу Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ систСмС ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ быстрСС Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ запросС. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ DoGetClassInfo ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ хранится вычислСнноС имя ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ класса (ΠΈ Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ CI.lpszClassName), ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ процСссу, Π½ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ памяти ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ Π΅Π΅ свободной ΠΈ считаСт сСбя Π²ΠΏΡ€Π°Π²Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ ΠΏΠΎ своСму ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ.

Когда присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ S, для размСщСния Π½ΠΎΠ²ΠΎΠΉ строки ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ памяти выдСляСт Ρ‚Ρƒ ΡΠ°ΠΌΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π½Π΅Π΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΎΡΡŒ имя класса. Π’Π°ΠΊ ΠΊΠ°ΠΊ CI.lpszClassName ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ содСрТит этот адрСс, ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ этому полю Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²ΡƒΡŽ строку, которая присвоСна ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ S.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π’ Delphi Π΄ΠΎ 7-ΠΉ вСрсии Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ описанный эффСкт Π½Π°Π±Π»ΡŽΠ΄Π°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΈ любой Π΄Π»ΠΈΠ½Π΅ строки, присваиваСмой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ S, Π² Π±ΠΎΠ»Π΅Π΅ Π½ΠΎΠ²Ρ‹Ρ… вСрсиях Delphi β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли Π΄Π»ΠΈΠ½Π° этой строки находится Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΡ‚ 5 Π΄ΠΎ 11 символов. Π­Ρ‚ΠΎ связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π½ΠΎΠ²Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ памяти, появившийся Π² этих вСрсиях Delphi, с Ρ†Π΅Π»ΡŒΡŽ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅Ρ‚ ΠΊΡƒΡ‡Ρƒ Π½Π° нСсколько областСй, Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… выдСляСт Π±Π»ΠΎΠΊΠΈ памяти, ΡƒΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π΄Π°Π½Π½ΠΎΠΉ области Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² Π±Π»ΠΎΠΊΠΎΠ². Если строка, присваиваСмая ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ S, слишком сильно отличаСтся ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ ΠΎΡ‚ 'TForm1' для этой строки выдСляСтся ΠΏΠ°ΠΌΡΡ‚ΡŒ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ области, ΠΈ ΠΏΠΎΠ΄ΠΌΠ΅Π½Ρ‹ Π½Π΅ происходит.

Если Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½Π΅ Π²Ρ‹Π½ΠΎΡΠΈΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetClassInfo Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ DoGetClassInfo, Π° Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π΅ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΈΠ· Button1Click, описанного эффСкта Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² этом случаС освобоТдСниС памяти, занятой для вычислСнного ΠΈΠΌΠ΅Π½ΠΈ класса, Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² эпилогС Button1Click, ΠΈ Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ присваивания значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ S эта ΠΏΠ°ΠΌΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ занятой, поэтому для S ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ памяти Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΈ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² ΠΎΠ±ΠΎΠΈΡ… случаях (Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetClassInfo ΠΈ ΠΏΡ€ΠΈ присваивании значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ S) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π½Π΅ строковыС Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹, Π° выраТСния, вычисляСмыС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° этапС выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹Π΅ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ компилятором Π² сСгмСнтС ΠΊΠΎΠ΄Π°, ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ Π² GetClassInfo ΠΈ присвоСнныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ S, Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅ Π½Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π° Π½Π° эти Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹, ΠΈ ΠΏΠΎΠ΄ΠΌΠ΅Π½Ρ‹ Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚.

Π˜Π·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ двумя способами. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π½Π΅ слСдуСт ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поля lpszClassName Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ Ρ‚ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±Ρ‹Π»Π° Π²Ρ‹Π·Π²Π°Π½Π° GetClassName. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, имя ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ класса Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ извСстно ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π΄ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° GetClassName. Π›ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρƒ строку, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ хранится это имя, Ρ‡Π΅ΠΌ ΠΏΠΎΠ»Π΅ lpszClassName.

3.4.5. Ошибка EReadError ΠΏΡ€ΠΈ использовании вСщСствСнных свойств

Если Π² сСкции published ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ свойства вСщСствСнного Ρ‚ΠΈΠΏΠ° (Single, Double ΠΈΠ»ΠΈ Extended), Ρ‚ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ проСктирования Ρ„ΠΎΡ€ΠΌΡ‹ этим свойствам Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΏΠΎΠ»Π½Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Π΅ значСния ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ошибкС EReadError ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ рСсурсов Ρ„ΠΎΡ€ΠΌΡ‹ (Ρ‚.Π΅. ΠΏΡ€ΠΈ создании Ρ„ΠΎΡ€ΠΌΡ‹). Для Ρ‚ΠΈΠΏΠΎΠ² Double ΠΈ Extended ошибка Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойства X Π»Π΅ΠΆΠΈΡ‚ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ²:

-1e15 < Ρ… <= MinInt - 1

ΠΈΠ»ΠΈ

MaxInt + 1 <= X < 1e15

НС совсСм понятно, ΠΏΡ€ΠΈ Ρ‡Π΅ΠΌ здСсь значСния MaxInt ΠΈ MinInt, Ссли Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ вСщСствСнных числах, Π½ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° сущСствуСт. Π’ΠΈΠΏΡƒ Single Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ точности, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ значСния MaxInt ΠΈ MinInt Π±Π΅Π· искаТСний. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, с ΠΏΠΎΠΏΡ€Π°Π²ΠΊΠΎΠΉ Π½Π° ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ точности Π³Ρ€Π°Π½ΠΈΡ† Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ², эта ΠΆΠ΅ ошибка Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΈ для свойств Ρ‚ΠΈΠΏΠ° Single. Ошибка Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² случаС тСкстовой Ρ„ΠΎΡ€ΠΌΡ‹ dfm-Ρ„Π°ΠΉΠ»Π° (всС вСрсии Delphi, начиная с пятой, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ эту Ρ„ΠΎΡ€ΠΌΡƒ). ΠŸΡ€ΠΈ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ dfm-Ρ„Π°ΠΉΠ»Π° ошибки Π½Π΅ происходит.

Ошибка ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π° Π² Delphi 5 ΠΈ 6, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π² Delphi 5 ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ввСсти Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ошибкС ΠΈ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ проСктирования, ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ тСкстом модуля ΠΈ Ρ„ΠΎΡ€ΠΌΠΎΠΉ. Π’ Delphi 6 Π±Ρ‹Π»ΠΈ Π·Π°ΠΌΠ΅Ρ‡Π΅Π½Ρ‹ ошибки Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ запускС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ проСктирования ΠΎΠ½ΠΈ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»ΠΈ. Π’ Delphi 7 эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΡƒΠΆΠ΅ Ρ€Π΅ΡˆΠ΅Π½Π°, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ значСния свойств Π½Π΅ приводят ΠΊ ошибкам. Π’ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½ΠΈΡ… вСрсиях Delphi ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, СстСствСнно, Ρ‚Π°ΠΊΠΆΠ΅ отсутствуСт, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² Π½ΠΈΡ… dfm-Ρ„Π°ΠΉΠ» всСгда прСдставляСтся Π² Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅.

Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π½Ρ‹ Π΄Π²Π° способа.

1. ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Delphi Π΄ΠΎ сСдьмой (ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½Π΅ΠΉ) вСрсии.

2. Π’Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ dfm-Ρ„Π°ΠΉΠ»Π°. Для этого Π½ΡƒΠΆΠ½ΠΎ Ρ‰Ρ‘Π»ΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΌΡ‹ΡˆΠΈ Π½Π° Ρ„ΠΎΡ€ΠΌΠ΅ ΠΈ Π² ΠΎΡ‚ΠΊΡ€Ρ‹Π²ΡˆΠ΅ΠΌΡΡ мСню ΡƒΠ±Ρ€Π°Ρ‚ΡŒ Π³Π°Π»ΠΎΡ‡ΠΊΠΈ с ΠΏΡƒΠ½ΠΊΡ‚Π° Text DFM

МоТно Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ присвоСния ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ свойствам Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ проСктирования ΠΈ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

3.4.6. Ошибка List index out of bounds ΠΏΡ€ΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ индСкса

Windows позволяСт с ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строкой списка элСмСнтов управлСния ListBoΡ… ΠΈ ComboBox ΡΠ²ΡΠ·Π°Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ число, Π»ΠΈΠ±ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ (Ρ‚ΠΎΡ‡Π½Π΅Π΅ β€” Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ…Π±Π°ΠΉΡ‚Π½ΡƒΡŽ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ число, ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ Π΅Ρ‰Π΅). Π’ VCL эта Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ обСспСчиваСт привязку ΠΊ строкам списка ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (чСтырёхбайтная Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ трактуСтся ΠΊΠ°ΠΊ TObject). Доступ ΠΊ этим ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ осущСствляСтся Ρ‡Π΅Ρ€Π΅Π· свойства TComboBox.Items.Objects[Index] ΠΈ TListBox.Items.Objects[Index].

Иногда всС-Ρ‚Π°ΠΊΠΈ трСбуСтся ΠΏΡ€ΠΈΠ²ΡΠ·Ρ‹Π²Π°Ρ‚ΡŒ ΠΊ строкам Π½Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π° числа. Для этого ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ явным ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

ComboBox1.Items.Objects[I] := TObject(17);

I := Integer(ComboBox1.Items.Objects[I]);

Если Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ со строкой Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ -1, Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π²ΠΎ всСх вСрсиях Delphi Π΄ΠΎ 7-ΠΉ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ EStringListError с ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅ΠΌ "List index out of bounds". Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ (листинг 3.56. ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ListIndex Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дискС).

Листинг 3.56. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ EStringListError

procedure TForm1.Button1Click(Sender: TObject);

var

 I: Integer;

begin

 ComboBox1.Items.Clear;

 ComboBox1.Items.AddObject('Text', TObject(-1));

 I := Integer(ComboBox1.Items.Objects[0]); { * }

 Label1.Caption := IntToStr(I);

end;

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ строку, ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π½ΡƒΡŽ Π·Π²Π΅Π·Π΄ΠΎΡ‡ΠΊΠΎΠΉ, хотя ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ индСкс Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π΅Π½. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ ошибки, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ осущСствляСтся Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ значСния, привязанного ΠΊ строкС, Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Windows API. Рассмотрим это Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ TComboBox. Для получСния значСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ ΠΎΠΊΠ½Ρƒ ComboBox сообщСниС CB_GETITEMDATA. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ этого сообщСния Π±ΡƒΠ΄Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, связанноС с ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ строкой, ΠΈΠ»ΠΈ CB_ERR, Ссли ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ сообщСния Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ошибка. ΠŸΡ€ΠΈ этом докумСнтация Π½Π΅ уточняСт, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ошибки ΠΌΠΎΠ³ΡƒΡ‚ Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΈ ΠΊΠ°ΠΊ ΡƒΠ·Π½Π°Ρ‚ΡŒ, какая ΠΈΠ· Π½ΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π°.

ΠœΠ΅Ρ‚ΠΎΠ΄ TComboBoxStrings.GetObject, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ читаСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойства Objects, Π² Delphi 7 ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½ΠΈΡ… вСрсиях ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ CB_ERR ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ: Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ EStringListError с ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅ΠΌ "List index out of bounds".

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ константа CB_ERR ΠΈΠΌΠ΅Π΅Ρ‚ числСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ -1. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΈ Π² случаС ошибки, ΠΈ Π² случаС, ΠΊΠΎΠ³Π΄Π° строкС сопоставлСно Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ -1, систСмный ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сообщСния CB_GETITEMDATA Π²Π΅Ρ€Π½Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. И ΠΌΠ΅Ρ‚ΠΎΠ΄ TComboBoxStrings.GetObject ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ ΠΊΠ°ΠΊ ΠΎΡˆΠΈΠ±ΠΊΡƒ. (А Ρ‡Ρ‚ΠΎ Π΅ΠΌΡƒ Π΅Ρ‰Π΅ остаСтся Π΄Π΅Π»Π°Ρ‚ΡŒ?)

Аналогичная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΠΎ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΈ для ListBox (аналогичная ΠΏΠΎ смыслу константа LB_ERR Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ -1). Π­Ρ‚ΠΎ прямоС слСдствиС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… особСнностСй Ρ€Π°Π±ΠΎΡ‚Ρ‹ Windows ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ VCL встрСчаСтся Π²ΠΎ всСх вСрсиях Windows. Π’Π° ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 4 294 967 295, Ρ‚.ΠΊ. Π½Π° Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ это число записываСтся Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠ΅ΠΉ Π±ΠΈΡ‚ΠΎΠ², Ρ‡Ρ‚ΠΎ ΠΈ -1.

ΠŸΡ€ΠΈ использовании свойства Objects ΠΏΠΎ прямому Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, Ρ‚.Π΅. для хранСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ $FFFFFFFF β€” это адрСс самого ΡΡ‚Π°Ρ€ΡˆΠ΅Π³ΠΎ Π±Π°ΠΉΡ‚Π° Π² Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ…Π³ΠΈΠ³Π°Π±Π°ΠΉΡ‚Π½ΠΎΠΌ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΌ адрСсном пространствС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π­Ρ‚Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ адрСсного пространства Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π° систСмой, ΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ памяти Delphi Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² этой области. Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΡ‹Π΅ способы Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹:

1. ΠŸΠ΅Ρ€Π΅ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΈ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ связывания значСния -1 со строками.

2. ΠΠ°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒ CB_GETITEMDATA ΠΎΠΊΠ½Ρƒ ComboBox, Π° ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠ΅ индСкса Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π² листингС 3.57 ΠΊΠΎΠ΄ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ послСдний совСт.