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

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

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

Π‘Ρ€Π°Π²Π½ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚ΠΈΠΏΠ° TMethod ΠΈΠ· модуля SysUtils, объявлСнного ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

TMethod = record

 Code, Data: Pointer;

end;

Π’Π°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ доступ ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ указатСлям, входящим Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄. Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этого Ρ‚ΠΈΠΏΠ° ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ листинг 3.61.

Листинг 3.61. ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ способ сравнСния ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄

procedure TForm1.Button2Click(Sender: TObject);

var

 P1, P2: procedure of object;

begin

 P1 := Button1.Update;

 P2 := Button2.Update;

 // ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ способ сравнСния ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹

 if (TMethod(P1).Data = TMethod(P2).Data) and

  (TMethod(P1).Code = TMethod(P2).Code) then

  Label1.Caption := 'Π Π°Π²Π½ΠΎ'

 else Label1.Caption := 'He Ρ€Π°Π²Π½ΠΎ';

end;

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ явным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ заставляСм компилятор ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠ±Π° указатСля, поэтому ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ НС Ρ€Π°Π²Π½ΠΎ.

3.4.9. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ получСния адрСса свойства

ΠŸΡƒΡΡ‚ΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ класс, описанный ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ (листинг 3.62).

Листинг 3.62. Класс со свойствами, Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌΠΈ ΠΈΠ· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

TSomeClass = class private

 FProp1: Integer;

 function GetProp2: Integer;

public

 property Prop1: Integer read FProp1;

 property Prop2: Integer read GetProp2;

end;

Π’ этом классС Π΄Π²Π° свойства Prop1 ΠΈ Prop2, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… опрСдСляСтся ΠΏΠΎΠ»Π΅ΠΌ FProp1, Π° Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ β€” Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ GetProp2. Оба свойства ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния, Π½ΠΎ для Ρ‚ΠΎΠ³ΠΎ эффСкта, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ здСсь ΠΏΠΎΠΉΠ΄Π΅Ρ‚ Ρ€Π΅Ρ‡ΡŒ, это Π½Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ: свойства, значСния ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ, Π²Π΅Π΄ΡƒΡ‚ сСбя Π² этом ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅. 

ΠŸΡƒΡΡ‚ΡŒ X β€” это пСрСмСнная Ρ‚ΠΈΠΏΠ° TSomeClass. Π›Π΅Π³ΠΊΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ компилятор допускаСт ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ адрСса свойства Prop1, Ρ‚.Π΅. конструкция Π²ΠΈΠ΄Π° @X.Prop1 считаСтся допустимой. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ этого ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° станСт ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠΎΠ»Π΅ FProp1. А Π²ΠΎΡ‚ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ @X.Prop2 компилятор Π½Π΅ допускаСт, Π²Ρ‹Π΄Π°Ρ‘Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ Variable required.

Ошибкой компилятора здСсь являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ допускаСт ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ адрСса Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС, Ρ‚.Π΅. для свойства, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ бСрСтся ΠΈΠ· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π­Ρ‚ΠΎ Π³Ρ€ΡƒΠ±Π΅ΠΉΡˆΠ΅Π΅ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° инкапсуляции, Π»Π΅ΠΆΠ°Ρ‰Π΅Π³ΠΎ Π² основС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ сразу ΠΏΠΎ Π΄Π²ΡƒΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ класса Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π΅Π³ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, Π° здСсь ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ читаСтся свойство, ΠΏΠΎ возмоТности примСнСния ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° @ ΠΊ Π½Π΅ΠΌΡƒ. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ класса Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с Π½ΠΈΠΌ строго Ρ‡Π΅Ρ€Π΅Π· прСдоставлСнный интСрфСйс, Π° Ρƒ нас получаСтся, Ρ‡Ρ‚ΠΎ, ΡƒΠ·Π½Π°Π² адрСс поля FProp1, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ смоТСт ΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΎΠ±Ρ…ΠΎΠ΄ прСдусмотрСнных для этого Π² классС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ².

К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, ситуации, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… эта Π½Π΅Π΄ΠΎΡ€Π°Π±ΠΎΡ‚ΠΊΠ° компилятора ΠΌΠΎΠ³Π»Π° Π±Ρ‹ принСсти ΠΏΠΎΠ»ΡŒΠ·Ρƒ, ΠΊΡ€Π°ΠΉΠ½Π΅ Ρ€Π΅Π΄ΠΊΠΈ. Но Ссли Π²Ρ‹ всС-Ρ‚Π°ΠΊΠΈ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ с Ρ‚Π°ΠΊΠΎΠΉ ситуациСй, Π½Π°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ Π½Π΅ ΠΏΠΎΠ΄Π΄Π°Π²Π°Ρ‚ΡŒΡΡ соблазну ΠΈ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ способы Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. Если класс, ΠΊ полю ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, написан Π²Π°ΠΌΠΈ, Ρ‚ΠΎ это вСский ΠΏΠΎΠ²ΠΎΠ΄ ΠΏΠ΅Ρ€Π΅ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ внСшний интСрфСйс класса, Ρ‚.ΠΊ. ΠΏΡ€ΠΈ Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ скорСС всСго, Π±Ρ‹Π»ΠΈ Π΄ΠΎΠΏΡƒΡ‰Π΅Π½Ρ‹ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Π΅ ошибки. Если это Β«Ρ‡ΡƒΠΆΠΎΠΉΒ» класс, ΠΏΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ вСрсии этого класса Π°Π²Ρ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ рСализация свойства, ΠΈ Ρ‚ΠΎΠ³Π΄Π° ваш ΠΊΠΎΠ΄ откаТСтся ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ.

3.4.10. ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… свойств ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π² дСструкторС

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠΉΠ΄Π΅Ρ‚ Ρ€Π΅Ρ‡ΡŒ Π² этом Ρ€Π°Π·Π΄Π΅Π»Π΅, Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΡˆΠΈΡ€Π΅, Ρ‡Π΅ΠΌ это явствуСт ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°. Однако Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ярко ΠΎΠ½Π° проявится ΠΈΠΌΠ΅Π½Π½ΠΎ Π² этом случаС. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ с этой ситуации, Π° ΠΏΠΎΡ‚ΠΎΠΌ рассмотрим ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π±ΠΎΠ»Π΅Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΎ.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ дСмонстрируСт ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ParentWnd Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дискС. Π’ Π½Π΅ΠΌ создан ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ TWrongCombo, наслСдник TComboBox. Листинг 5.67 содСрТит ΠΊΠΎΠ΄ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°.

Листинг 3.63. ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ TWrongCombo

type

 TWrongCombo = class(TComboBox)

 public

  destructor Destroy; override;

  procedure AddItem(const Title: string);

 end;


destructor TWrongCombo.Destroy;

var

 I: Integer;

begin

 for I := 0 to Items.Count - 1 do

  if Assigned(Items.Objects[I]) then

   Dispose(PDateTime(Items.Objects(I]));

 inherited;

end;


procedure TWrongCombo.AddItem(const Title: string);

var

 P: PDateTime;

begin

 New(P);

 P^ := Now;

 Items.AddObject(Title, TObject(P));

end;

Класс TWrongCombo с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ элСмСнтом, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° AddItem, связываСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° TDateTime, хранящСС врСмя добавлСния элСмСнта. Π’ Ρ€Π°Π·Π΄. 3.4.6 ΠΌΡ‹ ΡƒΠΆΠ΅ познакомились с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ связывания Π΄Π°Π½Π½Ρ‹Ρ… с элСмСнтом списка с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ свойства Items.Objects. Но Ρ‚Π°ΠΊ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ с элСмСнтом Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 4-Π±Π°ΠΉΡ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π° Ρ‚ΠΈΠΏ TDateTime Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ 8 Π±Π°ΠΉΡ‚ΠΎΠ². ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ TDateTime ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² динамичСской памяти, Π° с элСмСнтом свяТСм ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½Π΅Π³ΠΎ.

Π Π°Π· ΠΌΡ‹ Π²Ρ‹Π΄Π΅Π»ΠΈΠ»ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π΅Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°. НаиболСС подходящим мСстом для этого каТСтся дСструктор, ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ Π² Π½Π΅ΠΌ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ ΠΊΠΎΠ΄ освобоТдСния Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ. На Π³Π»Π°Π²Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ParentWnd находится ΠΊΠ½ΠΎΠΏΠΊΠ° Wrong Combo, ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ создаСтся ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Ρ‚ΠΈΠΏΠ° TWrongCombo (листинг 3.64).

Листинг 3.64. РСакция Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Wrong Combo

procedure TForm1.BtnWrongComboClick(Sender: TObject);

begin

 if FWrongCombo = nil then

 begin

  FWrongCombo := TWrongCombo.Create(Self);

  FWrongCombo.Left := 10;

  FWrongCombo.Top := 10;

  FWrongCombo.Parent := Self;

  FWrongCombo.AddItem('One');

  FWrongCombo.AddItem('Two');

  FWrongCombo.AddItem('Three');

 end;

end;

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли Π½Π°ΠΆΠ°Ρ‚ΡŒ эту ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ, Π² дСструкторС TWrongCombo Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ EInvalidOperation с сообщСниСм "Control has no parent window". Если ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ с Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΠΏΡ†ΠΈΠ΅ΠΉ Use Debug DCUs, Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ TWinControl.CreateWnd. Одно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ это способно ΠΎΠ±Π΅ΡΠΊΡƒΡ€Π°ΠΆΠΈΡ‚ΡŒ β€” Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π·Π°Ρ‡Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ создания ΠΎΠΊΠ½Π° вызываСтся ΠΏΡ€ΠΈ Π΅Π³ΠΎ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ?

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρƒ Π²Ρ‹Π·ΠΎΠ²Π° дСструктора ΠΎΠΊΠ½ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΡƒΠΆΠ΅ ΡƒΠ΄Π°Π»Π΅Π½ΠΎ, свойство Handle ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΈ свойство Parent Ρ‚ΠΎΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ nil. ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ свойству Items.Count ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ ΠΎΠΊΠ½Ρƒ сообщСния CB_GETCOUNT. ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° осущСствляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SendMessage, ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ являСтся дСскриптор ΠΎΠΊΠ½Π°, Π² качСствС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ, СстСствСнно, пСрСдаСтся свойство Handle. А это свойство, Π½Π°ΠΏΠΎΠΌΠ½ΠΈΠΌ, ΠΊ этому ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρƒ Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠ»ΡŽ. Π’ Ρ€Π°Π·Π΄. 1.1.7 ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ этому свойству Π² Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΎ Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠ»ΡŽ, ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ создания ΠΎΠΊΠ½Π° (см. листинг 1.8). ИмСнно поэтому вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ CreateWnd. И ΠΎΠ½ Π²ΠΎΠ·Π±ΡƒΠΆΠ΄Π°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠΊΠ½ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ создаСт ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ TWrongCombo, ΠΈΠΌΠ΅Π΅Ρ‚ ΡΡ‚ΠΈΠ»ΡŒ WS_CHILD, Ρ‚.Π΅. Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ родитСля. А Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ Π½Π΅ Π½Π°Π·Π½Π°Ρ‡Π΅Π½, поэтому ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ с Ρ‚Π°ΠΊΠΈΠΌ странным, Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд, сообщСниСм.

ΠžΡ‚ΡΡŽΠ΄Π° слСдуСт Π²Π°ΠΆΠ½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΎΠ΅ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π² дСструкторС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΊ Ρ‚Π΅ΠΌ свойствам ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ наличия ΠΎΠΊΠ½Π°, Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Окно ΡƒΠΆΠ΅ ΡƒΠ΄Π°Π»Π΅Π½ΠΎ, Π° ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° создания Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡŽ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² нашСм ΠΊΠΎΠ΄Π΅ трСбуСтся ΠΈΡΠΊΠ°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ мСсто, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ Π·Π°Π½ΡΡ‚ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ.

Поиск этого мСста оказываСтся Π½Π΅ Ρ‚Π°ΠΊΠΎΠΉ простой Π·Π°Π΄Π°Ρ‡Π΅ΠΉ, ΠΊΠ°ΠΊ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ VCL вСсьма странным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… ΠΎΠΊΠΎΠ½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π² дСструкторС класса TWinControl: сначала вызываСтся систСмная функция DestroyWindow, которая удаляСт ΠΈ само ΠΎΠΊΠ½ΠΎ, ΠΈ, разумССтся, всС Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ ΠΎΠΊΠ½Π°, Π° ΠΏΠΎΡ‚ΠΎΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡ‚ΡŒΡΡ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΡ… ΡƒΠ΄Π°Π»ΡΡŽΡ‚, Ρ‚.Π΅. ΠΊ этому ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρƒ ΠΎΠ½ΠΈ ΡƒΠΆΠ΅ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ возмоТности ΠΊΠ°ΠΊ-Ρ‚ΠΎ Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ свои ΠΎΠΊΠ½Π°. БоотвСтствСнно, Π² нашСм случаС дСструктор Ρ„ΠΎΡ€ΠΌΡ‹ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Π΅Ρ‚ ΠΎΠΊΠ½Π° всСх Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π·Π²Π°Π½Ρ‹ дСструкторы этих ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ².

ПолоТСниС спасаСт Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ± ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΈ ΠΎΠΊΠΎΠ½ заботится систСма Windows: всСм ΠΎΠΊΠ½Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ DestroyWindow, отправляСтся сообщСниС WM_DESTROY, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ получСния этого сообщСния Π½ΠΈ ΠΎΠΊΠ½ΠΎ, Π½ΠΈ Π΅Π³ΠΎ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ Π΅Ρ‰Π΅ Π½Π΅ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½Ρ‹. Π­Ρ‚ΠΎ позволяСт ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ ΠΊΠ°ΠΊ-Ρ‚ΠΎ Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° своС ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠΊΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΎ.

Казалось Π±Ρ‹, Π²Ρ‹Ρ…ΠΎΠ΄ Π½Π°ΠΉΠ΄Π΅Π½: Π½ΡƒΠΆΠ½ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ сообщСния WM_DESTROY. Но ΠΈ Ρ‚ΡƒΡ‚ Π½Π΅ всС Ρ‚Π°ΠΊ просто. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠΊΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Ρ‚ΡŒΡΡ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, Π½ΠΎ ΠΈ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… свойств (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Parent). ΠŸΡ€ΠΈ этом ΠΎΠΊΠ½ΠΎ удаляСтся, Π° вмСсто Π½Π΅Π³ΠΎ создаСтся Π½ΠΎΠ²ΠΎΠ΅, ΠΈ ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ старого ΠΎΠΊΠ½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Ρ‚ΠΎΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ сообщСниС WM_DESTROY. Π§Ρ‚ΠΎ ΠΆΠ΅ касаСтся ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° TComboBox, ΠΎΠ½ обСспСчиваСт, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ создании ΠΎΠΊΠ½Π° всС элСмСнты, Π² Ρ‚ΠΎΠΌ числС связанныС с Π½ΠΈΠΌΠΈ значСния, Π²ΠΎΡΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли ΠΌΡ‹ Π² наслСдникС TComboBox Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ сообщСния WM_DESTROY всСгда Π±ΡƒΠ΄Π΅ΠΌ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ‚ΡŒ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ, послС ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ создания ΠΎΠΊΠ½Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ "Π±ΠΈΡ‚Ρ‹Π΅" ссылки Π² свойствС Items.Objects, Ρ‡Π΅Π³ΠΎ, СстСствСнно, Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ. ВрСбуСтся Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΎΡ‚ удалСния ΠΎΠΊΠ½Π° с Ρ†Π΅Π»ΡŒΡŽ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ создания.