读书人

急mdi子窗口关闭的时候,主窗口产生什么

发布时间: 2012-03-11 18:15:39 作者: rapoo

急急急!!!mdi子窗口关闭的时候,主窗口产生什么事件,并却返回此mdichild 窗体的name???
mdi子窗口关闭的时候,主窗口产生什么事件?让我知道是哪个子窗体关闭了并却返回此mdichild 窗体的name???

我的子窗体是打包在dll里面的!

子窗体关闭时应该有消息发给主窗体,不然主窗体上的菜单就不会自动更新了!!!

兄弟门,指教了!!!


这段是兄弟们给的答案,但是兄弟我有点笨,搞不定,贴出来,帮忙了
在注释的位置 返回关闭 的mdichild的 窗体的name ,有什么好办法没有???

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
FClientInstance : TFarProc;
FPrevClientProc : TFarProc;
procedure ClientWndProc(var aMessage: TMessage);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
{ TForm1 }

procedure TForm1.ClientWndProc(var aMessage: TMessage);
begin
case aMessage.Msg of
WM_MDICreate :
begin
aMessage.Result := CallWindowProc(FPrevClientProc,ClientHandle, aMessage.Msg, aMessage.wParam, aMessage.lParam);
end;
WM_MDIDESTROY:
begin
aMessage.Result := CallWindowProc(FPrevClientProc,ClientHandle, aMessage.Msg, aMessage.wParam, aMessage.lParam);
showmessage( 'WM_MDIDESTROY ' );
///怎么样才能返回关闭的child 窗体的name
end;
else
aMessage.Result := CallWindowProc(FPrevClientProc,ClientHandle, aMessage.Msg, aMessage.wParam, aMessage.lParam);
end;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
FPrevClientProc := Pointer(GetWindowLong(ClientHandle, GWL_WNDPROC));
FClientInstance := MakeObjectInstance(ClientWndProc);
SetWindowLong(ClientHandle, GWL_WNDPROC, LongInt(FClientInstance));
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
SetWindowLong(ClientHandle, GWL_WNDPROC, LongInt(FPrevClientProc));
end;

end.


[解决办法]
这种问题解决的办法有很多,在主窗体中为相应的窗体设置一个布尔变量, 在子窗体 中来设置此变量
[解决办法]
当得到WM_MDIDESTROY消息的时候mdichildform已经被销毁了
------解决方案--------------------


在主窗体里给子窗体的ondestroy事件赋值,
FOldDestroyEvent := ChildForm.OnDestroy;
childForm.OnDestroy:= OnNewDestroy;
procedure MainForm.OnNewDestroy(Sender: TObject);
begin
ChildName := Sender.Name; // childName在主窗体定义
if assigned(FOldDestroyEvent ) then
FOldDestroyEvent(Sender);
end;
[解决办法]
FOldDestroyEvent := ChildForm.OnDestroy;
childForm.OnDestroy:= OnNewDestroy;
procedure MainForm.OnNewDestroy(Sender: TObject);
begin
ChildName := Sender.Name;
if assigned(FOldDestroyEvent ) then
FOldDestroyEvent(Sender);
end;
[解决办法]
// 帮楼主改了下,但这样改可能有点笨
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls;

type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
a1: TMenuItem;
b1: TMenuItem;
aa1: TMenuItem;
bb1: TMenuItem;
Button1: TButton;
Memo1: TMemo;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
procedure SetClientClose;
public
{ Public declarations }
FClientInstance : TFarProc;
FPrevClientProc : TFarProc;
FClientDestroy: array of TNotifyEvent;
procedure ClientWndProc(var aMessage: TMessage);
procedure ClientDestroy(Sender: TObject);
end;

var
Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}
procedure TForm1.ClientWndProc(var aMessage: TMessage);
begin

case aMessage.Msg of
WM_MDICreate :
begin
aMessage.Result := CallWindowProc(FPrevClientProc,ClientHandle, aMessage.Msg, aMessage.wParam, aMessage.lParam);
SetClientClose;
end;
WM_CLOSE:
begin
aMessage.Result := CallWindowProc(FPrevClientProc,ClientHandle, aMessage.Msg, aMessage.wParam, aMessage.lParam);
end;
WM_MDIDESTROY:
begin
aMessage.Result := CallWindowProc(FPrevClientProc,ClientHandle, aMessage.Msg, aMessage.wParam, aMessage.lParam);
showmessage( 'WM_MDIDESTROY ' );
///怎么样才能返回关闭的child 窗体的name
end;
else
aMessage.Result := CallWindowProc(FPrevClientProc,ClientHandle, aMessage.Msg, aMessage.wParam, aMessage.lParam);
end;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
FPrevClientProc := Pointer(GetWindowLong(ClientHandle, GWL_WNDPROC));
FClientInstance := MakeObjectInstance(ClientWndProc);
SetWindowLong(ClientHandle, GWL_WNDPROC, LongInt(FClientInstance));
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
SetWindowLong(ClientHandle, GWL_WNDPROC, LongInt(FPrevClientProc));
end;

procedure TForm1.ClientDestroy(Sender: TObject);
var
I: Integer;
begin
ShowMessage((Sender as TForm).Name);
for I := 0 to Self.MDIChildCount - 1 do
if Self.MDIChildren[I] = TForm(Sender) then
if Assigned(FClientDestroy[I]) then
FClientDestroy[I](Sender);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
begin
// 创建mdichild
Form2 := TForm2.Create(Self);
end;

procedure TForm1.SetClientClose;
var


I: Integer;
ClientForm: TForm;
begin
SetLength(FClientDestroy, Self.MDIChildCount);
for I := 0 to Self.MDIChildCount - 1 do
begin
// 记录所有mdichild的ondestroy事件,并修改
ClientForm := Self.MDIChildren[I];
FClientDestroy[I] := ClientForm.OnDestroy;
ClientForm.OnDestroy := ClientDestroy;
end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
SetLength(FClientDestroy, 0);
end;

end.

读书人网 >.NET

热点推荐