Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Удаление объекта / 23 сообщений из 23, страница 1 из 1
10.06.2018, 10:02
    #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
10.06.2018, 10:24
    #39659195
чччД__
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление объекта
ВотЭтоДа,

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

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

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

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

Форму удаляем, удаляем компонент, у компонента parent = nil но мы не можем удалить компонент из за StrDispose(FText);
...
Рейтинг: 0 / 0
10.06.2018, 11:52
    #39659216
ВотЭтоДа
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление объекта
Как удалить привязку компонента к форме ??? Именно компонента, потому что вызов Form.DestroyComponents; ничего не даёт.
...
Рейтинг: 0 / 0
10.06.2018, 11:55
    #39659217
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление объекта
Код: pascal
1.
2.
3.
  Button1.Parent := nil;
  Form1.Free;
  Button1.Free;
...
Рейтинг: 0 / 0
10.06.2018, 12:04
    #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
10.06.2018, 13:06
    #39659234
krapotkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление объекта
а что, бывает {$APPTYPE CONSOLE} и Form := TForm.Create(nil); ?

если у вас компонент создан с указанием владельца, то его можно НЕ удалять при разрушении формы
если нужно его удалить раньше, то никаких проблем в VCL в отличии от FMX, нет
только как и всегда, прибегайте к FreeAndNil
...
Рейтинг: 0 / 0
10.06.2018, 13:14
    #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
10.06.2018, 13:16
    #39659239
Олег Третьяков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление объекта
ВотЭтоДа,
Код: pascal
1.
But := TButton.Create(Form);


Не спасет отца русской демократии?!
...
Рейтинг: 0 / 0
10.06.2018, 13:44
    #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
10.06.2018, 13:46
    #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
10.06.2018, 13:47
    #39659248
чччД__
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление объекта
Код: pascal
1.
for idxObj := 0 to ObjectListCount do


ObjectListCount - чему равен?
...
Рейтинг: 0 / 0
10.06.2018, 13:52
    #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
10.06.2018, 13:57
    #39659254
чччД__
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление объекта
чччД__
Код: pascal
1.
for idxObj := 0 to ObjectListCount do


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

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

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

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


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

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


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

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


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

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

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

ObjectListCount = 3
ObjectList = 4 (3)

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

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

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

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


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