-
почему реализовано так procedure TControl.Close;
begin
PostMessage( Handle, WM_CLOSE, 0, 0 );
end; а не вот так procedure TControl.Close;
begin
SendMessage( Handle, WM_CLOSE, 0, 0 );
end; ??? это же полигонище для ошибок
-
Какого плана ошибок?
-
Видимо: Когда в Control есть обращение к ресурсу, который в программе уничтожается после Control.Close. Но при этом может оказаться так, что это произойдет раньше, чем дойдет очередь до WM_CLOSE для Control. Следовательно есть вероятность обращения Control к несуществующему ресурсу.
-
> L`Autour (19.09.14 06:11) [2]
Как-то сумбурно.
Попробуем по шагам: 1. Control.Close 2. SomeObject.Free х1. работаем с SomeObject 3. Process WM_CLOSE - (Control - разрушен)
и
1. Control.Close х2. работаем с SomeObject 2. Process WM_CLOSE - (Control - разрушен) 3. SomeObject.Free
где может произойти доступ к SomeObject, в пункте "Х1"?
-
> Rouse_ © (19.09.14 17:44) [3]
уже и в коле пытаешься экспертничать?
все просто, берем 2 формы (напомню КОЛ), где в Онклозе высвобождаются всяки бяки в Онклозе главной вызываем клозе второй ииииии та уничтожается без вызова Онклозе
кроме того существует простая логика, если вызвал функцию - значит действие должно выполниться до следующей строки, а не встать в очередь
-
> уже и в коле пытаешься экспертничать?
Влад - даже не собираюсь, я просто пытаюсь уточнить логику возникновения ошибки. Пока что оба варианта обьяснения меня не впечатлили, а значит либо я что-то недопонимаю либо ... :)
-
> Rouse_ © (19.09.14 20:34) [5]
а логики нет, есть ошибка, именно как я описал, замена form2.form.close на SendMessage( form2.form.Handle, WM_CLOSE, 0, 0 ) проблему решает но скрытый геморроидальный потенциал от использования PostMessage остается огромным и что главное, необъяснимым для тех людей кто не проверяет библиотечные исходники кароч КОЛ<>VCL
если спросишь точней откуда у меня рук растет, может распишу
-
Проще просто выложить демоприложение, демонстрирующее ошибку :) Биологическое происхождение конечностей, пожалуй стоит опустить :)
-
ну зацени :) https://yadi.sk/d/dBlq-gJabZwqT думаю все понятно и наглядно
-
https://yadi.sk/d/hRUQjbu5bZxRT "фастмм" чет странный какой-то, под делфей палит утечку, а на живую в винде нет, наверно сам за собой убирает
-
QAZ, a почему реализовано так:
procedure TForm2.KOLForm1FormCreate(Sender: PObj);
begin
Writeln('Form2Create');
bmp:=NewDIBBitmap(2000,2000,pf24bit);
end;
procedure TForm2.KOLForm1Close(Sender: PObj; var Accept: Boolean);
begin
Writeln('Form2Close');
bmp.Free; end;
procedure TForm2.KOLForm1Destroy(Sender: PObj);
begin
Writeln('Form2Destroy');
end; а не вот так procedure TForm2.KOLForm1FormCreate(Sender: PObj);
begin
Writeln('Form2Create');
bmp:=NewDIBBitmap(2000,2000,pf24bit);
end;
procedure TForm2.KOLForm1Show(Sender: PObj);
begin
Writeln('Form2Show');
end;
procedure TForm2.KOLForm1Close(Sender: PObj; var Accept: Boolean);
begin
Writeln('Form2Close');
end;
procedure TForm2.KOLForm1Destroy(Sender: PObj);
begin
bmp.Free; Writeln('Form2Destroy');
end; ??? это же полигонище для ошибок! ;)
-
> думаю все понятно и наглядно
Ой-ёй :) А это уже культура программирования :) Выстрелить в ногу можно гораздо проще ;)
-
> NoUser © (20.09.14 19:45) [10]
че за бред ты несешь?
> Rouse_ © (20.09.14 20:09) [11]
при чем тут культура-мультура ? делай что написано и смотри в консоли что происходит
-
> делай что написано и смотри в консоли что происходит
Влад - не кипятись. Ты вклинился в порядок очереди и по сути принудительно вызвал обработчик закрытия второй формы. 1 вариант: Form2Create
Form1Close
Form1Destroy
Form2Destroy и второй: Form2Create
Form1Close
Form2Close <<< !!!!
Form1Destroy
Form2Destroy
что есть нарушение концепции (слегка) но причин возникновения ошибок пока что не вижу :)
-
ЗЫ: попробую навести на мысль - закрытие формы не всегда означает заее разрушения и технически мы в любой момент можем сделать Show закрытому экземпляру формы, нес-па?.
-
> Влад - не кипятись.Ты вклинился в порядок очереди и по сути > принудительно вызвал обработчик закрытия второй формы.
да я не влад :) и никуда не вклинивался :) и почему я не могу закрыть форму програмно ?
> ЗЫ: попробую навести на мысль - закрытие формы не всегда > означает заее разрушения и технически мы в любой момент > можем сделать Show закрытому экземпляру формы, нес-па?.
на мысли наводить ненад, есть простая концепция если окно закрывается, значит оно должно сдохнуть полностью освободив все что с ним связано, а не скрыться
-
> да я не влад :)
Ой пардон, у меня почему-то данный ник, за Владом Ошиным закрепился. Дико извиняюсь :)
> есть простая концепция если окно закрывается, значит оно > должно сдохнуть полностью освободив все что с ним связано
Это неправильная концепция :) Вот смотри, дельфи приложение при старте может создавать кучу форм, прямо из DPR, но видно то изначально будет только главная форма :) О чем это говорит? О том что, ты конечно можешь контролировать время формы как ты хочешь, но не нужно смешивать понятия закрытия формы с вызовом ее деструктора :)
-
QAZ (20.09.14 20:32) [12] >> NoUser © (20.09.14 19:45) [10] >че за бред ты несешь?
Rouse_ © (20.09.14 22:21) [16] >... не нужно смешивать понятия закрытия формы с вызовом ее деструктора
-
> О том что, ты конечно можешь контролировать время формы > как ты хочешь, но не нужно смешивать понятия закрытия формы > с вызовом ее деструктора :)
вот опять, ниразу не юзал КОЛ, а все пишешь ВКЛьные советики если ты глубже попользуешься моей шедевральной демкой, то поймешь что дестрой всех форм происходит только при закрытии всей программы если же принудительно делать уничтожение в коде, то начнется такая гемороидальная шиза с которой сам автор КОЛА решил несвязываться, раз при закрытии окна в системе уничтожаются, а сам объект формы остается существовать об это собственно была моя соседняя тема поэтому реально без гемора можно использовать только онклоз как событие уничтожения, а чтоб его коректно получать и нужен SendMessage а не PostMessage
|