首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

急mdi子窗口关闭的时候,主窗口产生什么事件,并却返回此mdichild 窗体的name?该如何处理

2012-03-11 
急急急!!!mdi子窗口关闭的时候,主窗口产生什么事件,并却返回此mdichild 窗体的name???mdi子窗口关闭的时候

急急急!!!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.

热点排行