forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Delphi (http://forum.boolean.name/forumdisplay.php?f=66)
-   -   Полное удаление динамического объекта (http://forum.boolean.name/showthread.php?t=18506)

Kolobok 01.09.2013 03:50

Полное удаление динамического объекта
 
Созрел у меня ещё один вопрос, сложные у меня вопросы... =)

Я динамически создаю кнопку, храню её id и потом по id обращаюсь...
Почему после вроде как удаления кнопки, по её id, её свойства всё равно доступны!?
Ну а кнопка вроде с формы удаляется, визуально и вернуть вроде не получается, визуально...

А к свойствам могу обращаться и они ещё содержат те свойства, которые я задал ранее! Т.е. получается в памяти висят данные кнопки...
Вот только свойства доступны только для чтения, а для записи вроде уже не доступны...

Кто мне подскажет как удалить эти данные? А то за каждой динамически созданной и удалённой кнопкой будут висеть данные...

Код:

unit Unit1;

interface

uses
  Vcl.Forms,
  Vcl.Buttons,
  Vcl.Dialogs,
  System.SysUtils;

type
  TForm1 = class(TForm)
    procedure FormClick(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormClick(Sender: TObject);
var
  id: integer;
  str: string;
begin
  id := integer(TSpeedButton.create(Form1));
  TSpeedButton(id).Parent := Form1; // кнопка появилась
  TSpeedButton(id).Width := 50;
    str := str + inttostr(TSpeedButton(id).Width) + #13#10; // return 50
    TSpeedButton(id).Free; // вроде удаляем
    str := str + inttostr(TSpeedButton(id).Width) + #13#10; // return 50
  ShowMessage(str);
  { return:
    50
    50 }
end;

end.


ViNT 01.09.2013 13:42

Ответ: Полное удаление динамического объекта
 
Дело в том, что удаление объекта производится внутри обработчика события этого же объекта. То ли это баг, то ли фича, но объект остается доступен вплоть до завершения обработчика (фактическое удаление производится только в конце обработчика или сохраняется некая локальная копия). Если же попытаться обратиться к тому же id после завершения обработчика, то будет выдано какое-то левое значение (хотя, как ни странно, исключение все равно не получим, несмотря на обращение к несуществующему объекту).


Часовой пояс GMT +4, время: 21:43.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot