powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Удаление объекта
23 сообщений из 23, страница 1 из 1
Удаление объекта
    #39659190
ВотЭтоДа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Делаю FreeAndNil (Для кнопки) и получаю ошибку.

Ошибка просиходит из недр VCL

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
destructor TControl.Destroy;
begin
  Application.ControlDestroyed(Self);
  if (FHostDockSite <> nil) then
  begin
    FHostDockSite.RemoveFreeNotification(Self);
{$IF DEFINED(CLR)}
    FHostDockSite.UndockClient(nil, Self);
{$ELSE}
    FHostDockSite.Perform(CM_UNDOCKCLIENT, 0, Winapi.Windows.LPARAM(Self));
{$ENDIF}
    SetParent(nil);
    Dock(NullDockSite, BoundsRect);
    FHostDockSite := nil;
  end else
    SetParent(nil);
  FreeAndNil(FActionLink);
  FreeAndNil(FConstraints);
  FreeAndNil(FFont);
{$IF NOT DEFINED(CLR)}
  StrDispose(FText);      ВОТ ТУТ ОШИБКА 
{$ENDIF}
  FreeAndNil(FMargins);
  FCustomHint := nil;
  FreeAndNil(FTouchManager);
  inherited Destroy;
end;



Кто знает почему ? Создаю объект динамикой
...
Рейтинг: 0 / 0
Удаление объекта
    #39659195
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВотЭтоДа,

ты просто что-то не так делаешь. Если все делать правильно - ошибки не будет.
А если неправильно - ошибка.

Я в магазине как-то выстоял очередь в кассу, хотел расплатиться, но - "ошибка".
И вроде кошелек с собой взял, и все равно - "ошибка".
Так ничего и не купил.
Никто не знает, почему? Зарплата была днем раньше.
...
Рейтинг: 0 / 0
Удаление объекта
    #39659203
ВотЭтоДа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Форма удалялась быстрее (
...
Рейтинг: 0 / 0
Удаление объекта
    #39659205
ВотЭтоДа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почему я не могу удалить компонент в отдельности? Когда формы уже нет

Ведь в моём случае, этого компонента нету в TForm.Components[idx] он чисто есть на parent

Скорее всего это и баг, в одно и то же время с моим недочётом.

Форму удаляем, удаляем компонент, у компонента parent = nil но мы не можем удалить компонент из за StrDispose(FText);
...
Рейтинг: 0 / 0
Удаление объекта
    #39659216
ВотЭтоДа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как удалить привязку компонента к форме ??? Именно компонента, потому что вызов Form.DestroyComponents; ничего не даёт.
...
Рейтинг: 0 / 0
Удаление объекта
    #39659217
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
  Button1.Parent := nil;
  Form1.Free;
  Button1.Free;
...
Рейтинг: 0 / 0
Удаление объекта
    #39659220
ВотЭтоДа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X-Cite,

У меня нет возможности так сделать, сообщение может прилететь и раньше, и позже - я никак не решаю...

Ибо, существуют счётчик ссылок, на форму ссылки кончаются - прилетает сообщение удалить формы.

Опа - ссылки -1 на кнопку, надо и её удалить... И тут баг

Тем более parent уже nil


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  Windows, System.SysUtils, Vcl.Forms, Vcl.StdCtrls, Vcl.dialogs, Vcl.Controls;

var
  Form: TForm;
  But: TButton;

begin
  try
    Form := TForm.Create(nil);
    Form.Caption := 'Caption';
    But := TButton.Create(nil);
    But.Caption := 'click';
    But.Parent := Form;
    Form.Show;

    FreeAndNil(Form);
    if But.Parent = nil then
    begin
      ShowMessage('Я узе NIL');
      But.Parent := nil;
    end;
    FreeAndNil(But);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

end.
...
Рейтинг: 0 / 0
Удаление объекта
    #39659234
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а что, бывает {$APPTYPE CONSOLE} и Form := TForm.Create(nil); ?

если у вас компонент создан с указанием владельца, то его можно НЕ удалять при разрушении формы
если нужно его удалить раньше, то никаких проблем в VCL в отличии от FMX, нет
только как и всегда, прибегайте к FreeAndNil
...
Рейтинг: 0 / 0
Удаление объекта
    #39659237
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://docwiki.embarcadero.com/Libraries/Tokyo/en/Vcl.Controls.TControl.Parent Note: The Parent property declared in TControl is similar to the Owner property declared in TComponent, in that the Parent of a control frees the control just as the Owner of a component frees that component
...
Рейтинг: 0 / 0
Удаление объекта
    #39659239
Олег Третьяков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВотЭтоДа,
Код: pascal
1.
But := TButton.Create(Form);


Не спасет отца русской демократии?!
...
Рейтинг: 0 / 0
Удаление объекта
    #39659244
ВотЭтоДа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Олег Третьяков,

Не спасала..


Убрал удаление формы, и в конец программы всунул (Удаляем всё что создали сами - удаляем самым последним - формы)
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
for idxObj := 0 to ObjectListCount do
begin
  ObjectCurrP := @ObjectList[idxObj];
  for IdxObj2 := 0 to ObjectCurrP^.listCurr do
  begin
    ObjectDelphiCurr := TObject(ObjectCurrP^.list[IdxObj2].obj);
    if (ObjectDelphiCurr <> nil) and ObjectCurrP^.list[IdxObj2].NotFree then
    begin
      if not ObjectDelphiCurr.InheritsFrom(TApplication) and
        not ObjectDelphiCurr.InheritsFrom(TScreen) and
        not ObjectDelphiCurr.InheritsFrom(TForm) then
      begin
        ObjectDelphiCurr.Free;
        ObjectCurrP^.list[IdxObj2].NotFree := False;
      end;
    end;
  end;
end;

for idxObj := 0 to ObjectListCount do
begin
  ObjectCurrP := @ObjectList[idxObj];
  for IdxObj2 := 0 to ObjectCurrP^.listCurr do
  begin
    ObjectDelphiCurr := TObject(ObjectCurrP^.list[IdxObj2].obj);
    if (ObjectDelphiCurr <> nil) and ObjectCurrP^.list[IdxObj2].NotFree then
    begin
      if not ObjectDelphiCurr.InheritsFrom(TApplication) AND
        not ObjectDelphiCurr.InheritsFrom(TScreen) then
        ObjectDelphiCurr.Free;
    end;
  end;
  SetLength(ObjectCurrP^.list, 0);
end;
SetLength(ObjectList, 0);

ListObjectId.Free;
...
Рейтинг: 0 / 0
Удаление объекта
    #39659247
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
    But.Parent := Form;
    Form.Show;

    FreeAndNil(Form);
    if But.Parent = nil then


Типичная ошибка новичка...
У вас But уже битый указатель указывает на область памяти уничтоженного объекта. Кнопки уже нет. Просто пока память не перезатерлась и вроде создается имитация работы.
But.Parent := Form; собственно задает кнопке владельца форму и кнопка будет уничтожена при уничтожении формы.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  Windows, System.SysUtils, Vcl.Forms, Vcl.StdCtrls, Vcl.dialogs, Vcl.Controls;

var
  Form: TForm;
  But: TButton;

type
  TButtonEx = class(TButton)
  public
    destructor Destroy; override;
  end;

{ TButtonEx }

destructor TButtonEx.Destroy;
begin
  ShowMessage('Неожиданно, да?');
  inherited;
end;

begin
  try
    Form := TForm.Create(nil);
    Form.Caption := 'Caption';
    But := TButtonEx.Create(nil);
    But.Caption := 'click';
    But.Parent := Form;
    Form.Show;

    FreeAndNil(Form);
    if But.Parent = nil then
    begin
      ShowMessage('Я узе NIL');
      But.Parent := nil;
    end;
    FreeAndNil(But);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.



Как вы думаете что раньше вызовается? Деструктор кнопки или проверка на nil зомби переменной?
...
Рейтинг: 0 / 0
Удаление объекта
    #39659248
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
1.
for idxObj := 0 to ObjectListCount do


ObjectListCount - чему равен?
...
Рейтинг: 0 / 0
Удаление объекта
    #39659250
ВотЭтоДа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чччД__,

-1

Код: pascal
1.
2.
SetLength(ObjectList, 10000);
ObjectListCount := -1;



Так как
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
var
  Id: integer;
begin
  if ListObjectId.TryGetValue(Ed.This.obj.Handle, Id) then
    Result := ObjectList[LOWORD(Id)].list[HiWord(Id)].obj
  else
    Result := nil;
end;
...
Рейтинг: 0 / 0
Удаление объекта
    #39659254
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чччД__
Код: pascal
1.
for idxObj := 0 to ObjectListCount do


ObjectListCount - чему равен?
ВотЭтоДачччД__,

-1
...
Так как ...

"Когда вы говорите, Иван Васильевич, такое впечатление, что вы бредите" - (с).
...
Рейтинг: 0 / 0
Удаление объекта
    #39659257
ВотЭтоДа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чччД__,

Там имелось введу реальный count
...
Рейтинг: 0 / 0
Удаление объекта
    #39659262
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВотЭтоДа...Там имелось введу...
Ты можешь просто ответить - чему равно значение верхнего ограничения счетчика при входе в цикл?
чччД__
Код: pascal
1.
for idxObj := 0 to ObjectListCount do


ObjectListCount - чему равен?
...
Рейтинг: 0 / 0
Удаление объекта
    #39659263
ВотЭтоДа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чччД__,

Сколько создал объекту, тому и ровна.


К примеру создал TForm ровна 0 обратился к свойству font у TForm она уже +1 так как туда попал класс TFont и так далее. Класс TFont оно не может удалить из за свойства NotFree
...
Рейтинг: 0 / 0
Удаление объекта
    #39659265
Олег Третьяков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВотЭтоДаНе спасала..
Убрал удаление формы, и в конец программы всунул (Удаляем всё что создали сами - удаляем самым последним - формы)

И на фига?!
Форма - наследник TComponent и кнопка - наследник TComponent
У кнопки будет владелец - форма.
Форма и удалит кнопку в момент собственной смерти.
Так что все обращения к кнопке после FreeAndNil(Form) - убрать. Это же очевидно.
Может стоит книжки почитать?
...
Рейтинг: 0 / 0
Удаление объекта
    #39659266
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чччД__
Код: pascal
1.
for idxObj := 0 to ObjectListCount do


ObjectListCount - чему равен?
ВотЭтоДа...
Сколько создал объекту, тому и ровна.
...

С русским у тебя так себе, но предположу, что значение ObjectListCount равно числу объектов.
Теперь скажи - сколько раз отработает твой цикл for?
...
Рейтинг: 0 / 0
Удаление объекта
    #39659269
ВотЭтоДа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чччД__,

Работает как надо.

ObjectListCount = 3
ObjectList = 4 (3)

И того, как цикл достигнет 4 то он выйдет. И дело сделано.
...
Рейтинг: 0 / 0
Удаление объекта
    #39659279
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Чота название на скриншоте какое-то пафосное - NewRtti Super , а код 21483340 смешной

1. нельзя создать TForm без наличия DFM, надо использовать TCustomForm
2. в коде обращение к убитой перед этим переменной But

тут 21483485 цикл должен идти от нуля до ObjectListCount-1, а не как у тебя

короче, учи матчасть (с)
...
Рейтинг: 0 / 0
Удаление объекта
    #39659281
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...может, это наш оптимизатор, но под грибами? :)
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Удаление объекта
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]