Форум: "Основная";
Текущий архив: 2010.03.28;
Скачать: [xml.tar.bz2];
ВнизОшибка перехвата FormDestroy Найти похожие ветки
← →
webpauk © (2009-06-15 13:45) [0]Для примера создал 2 формы
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormClick(Sender: TObject);
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.FormClick(Sender: TObject);
begin
TForm2.Create(Application).ShowModal;
end;
end.unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm2 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
fFormOldWndProc: TWndMethod;
procedure FormNewWndProc(var Msg: TMessage);
public
end;
var
Form2: TForm2;
implementation
uses Unit1;
{$R *.dfm}
procedure TForm2.FormCreate(Sender: TObject);
begin
fFormOldWndProc:=Form1.WindowProc;
Form1.WindowProc:=FormNewWndProc;
end;
procedure TForm2.FormDestroy(Sender: TObject);
begin
TForm(Owner).WindowProc:=fFormOldWndProc;
fFormOldWndProc:=nil;
end;
procedure TForm2.FormNewWndProc(var Msg: TMessage);
begin
if Msg.Msg = WM_PAINT then
begin
with Form1.Canvas do
begin
Brush.Color:=clRed;
FillRect(ClipRect);
end;
end;
fFormOldWndProc(Msg);
end;
end.
всё работает. только при закрытии главной формы выскакивает ошибка.
подскажите где я слажал...
← →
clickmaker © (2009-06-15 13:47) [1]а это зачем?
fFormOldWndProc:=nil;
← →
webpauk © (2009-06-15 13:48) [2]
> clickmaker © (15.06.09 13:47) [1]
не здесь ошибка. проверил
← →
Сергей М. © (2009-06-15 13:54) [3]
> TForm2.Create(Application).ShowModal; //владелец - объект новой формы Application
> procedure TForm2.FormDestroy(Sender: TObject);
> begin
> TForm(Owner).WindowProc:=fFormOldWndProc; //с какого же перепугу объект Application у тебя стал формой ?
← →
Сергей М. © (2009-06-15 13:56) [4]
> владелец - объект новой формы Application
Имелось ввиду: владелец новой формы - объект Application
← →
webpauk © (2009-06-15 13:57) [5]
> Сергей М. © (15.06.09 13:54) [3]
справедливо...
буду копать тут
← →
webpauk © (2009-06-15 13:59) [6]вопрос переиначиваю:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.FormClick(Sender: TObject);
begin
TForm2.Create(Self).ShowModal;
end;
end.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm2 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
fFormOldWndProc: TWndMethod;
procedure FormNewWndProc(var Msg: TMessage);
public
end;
var
Form2: TForm2;
implementation
uses Unit1;
{$R *.dfm}
procedure TForm2.FormCreate(Sender: TObject);
begin
fFormOldWndProc:=TForm(Owner).WindowProc;
TForm(Owner).WindowProc:=FormNewWndProc;
end;
procedure TForm2.FormDestroy(Sender: TObject);
begin
TForm(Owner).WindowProc:=fFormOldWndProc;
fFormOldWndProc:=nil;
end;
procedure TForm2.FormNewWndProc(var Msg: TMessage);
begin
if Msg.Msg = WM_PAINT then
begin
with TForm(Owner).Canvas do
begin
Brush.Color:=clRed;
FillRect(ClipRect);
end;
end;
fFormOldWndProc(Msg);
end;
end.
← →
Сергей М. © (2009-06-15 14:02) [7]
> webpauk © (15.06.09 13:59) [6]
И что ? Вновь засада ?)
← →
webpauk © (2009-06-15 14:03) [8]если переместить
procedure TForm2.FormDestroy(Sender: TObject);
begin
TForm(Owner).WindowProc:=fFormOldWndProc;
fFormOldWndProc:=nil;
end;
в событие FormClose - все ок.
но это я показал пример с 2 формами.
на самом деле - вместо второй формы у меня объект. а там только деструктор, вроде бы...
← →
webpauk © (2009-06-15 14:23) [9]о! нашел!
procedure TForm2.FormDestroy(Sender: TObject);
begin
if TForm(Owner)<>nil then
begin
TForm(Owner).WindowProc:=fFormOldWndProc;
fFormOldWndProc:=nil;
end;
end;
← →
KSergey © (2009-06-15 14:41) [10]> webpauk © (15.06.09 14:03) [8]
> на самом деле - вместо второй формы у меня объект.
А овнером этому объекту непеменно должны форму подсовывать? Это неудачный дизайн, обязательно найдется тот, кто подсунет не форму и будет долго и справедливо материться на взрывы и дряной компонент.
← →
Сергей М. © (2009-06-15 15:05) [11]
> на самом деле - вместо второй формы у меня объект
А что, всякий объект непременно имеет владельца ?
> если переместить
> TForm(Owner).WindowProc:=fFormOldWndProc;
> в событие FormClose - все ок.
Интересно, что изменилось при этом, если проверкой owner"а на nil там тоже не пахнет ?)
← →
Игорь Шевченко © (2009-06-15 15:46) [12]
> TForm(Owner).WindowProc:=fFormOldWndProc;
Смело. Свежо. про GetParentForm и ValidParentForm в справке нифига не написано
← →
Юрий Зотов © (2009-06-15 16:15) [13]> webpauk © (15.06.09 13:45)
Менять оконную функцию небезопасно. Почему бы для отлова разрушения Owner"а не использовать Notification?
← →
int64 (2009-06-16 16:24) [14]webpauk © (15.06.09 13:45)
Когда таким способом переопределяешь во внешнем объекте WindowProc или, даже, простой ивент (с сохранением - возвращением старого метода), надо иметь полную уверенность, что другие объекты не будут делать тоже самое. Иначе, могут появиться грабли с конкуренцией объектов за захваченный ресурс.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2010.03.28;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c