Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.004 c
15-1262947721
TUser
2010-01-08 13:48
2010.03.28
Зазеркалье в Питере


2-1264622951
Чайник
2010-01-27 23:09
2010.03.28
I/O error 998


15-1263142666
TUser
2010-01-10 19:57
2010.03.28
Письмо про СС в России ...


15-1263079904
Германн
2010-01-10 02:31
2010.03.28
Скончался автор "Ежика в тумане" Сергей Козлов


15-1263159025
Юрий
2010-01-11 00:30
2010.03.28
С днем рождения ! 11 января 2010 понедельник





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский