Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.03.28;
Скачать: CL | DM;

Вниз

Ошибка перехвата 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.016 c
4-1231708108
kalexi
2009-01-12 00:08
2010.03.28
PopupMenu из ресурса.


2-1264024785
novichek
2010-01-21 00:59
2010.03.28
Dword в Record


15-1263202280
Игорь
2010-01-11 12:31
2010.03.28
Драйвер под Windows 7


2-1264669670
Pavel
2010-01-28 12:07
2010.03.28
Пауза между запросами в Indy


2-1263942655
Вася
2010-01-20 02:10
2010.03.28
Можно ли отключить "куб отсечения" в OpenGL