Mdi窗體使用問題(50分)

  • 主题发起人 主题发起人 gdwangyg
  • 开始时间 开始时间
G

gdwangyg

Unregistered / Unconfirmed
GUEST, unregistred user!
Mdi窗體使用問題
我以前一直不使用mdi窗口寫程序,現在想使用一下,卻發現有很多問題解決不了
如有mainForm;inputForm;reportForm,findForm.四個窗口
MainForm.formstyle=fsMdiForm;
inpurForm.formstyle=fsMdiChild.
其它的就用默認值.在mainform中有系統采單,為主系統菜單,如果要打開
inputForm窗口就用如下
if f_ inpurForm =nil then application.CreateForm(T inpurForm,f_ inpurForm) ;
f_ inpurForm.show;
現在打開成功,但在inpurform窗口自帶的關閉按鈕卻無效,只是把此窗口最小化在主窗口下方,在inpurform中加入一按鈕,加入inpurform.close也關閉不了,后來改用inpurform.free能關閉,但再次打開此窗口時就出錯,怎么也找不出原因,請高手指點.


 
fsMdiChild窗体默认close action为caNone; 当然不能关闭。可以在onClose事件中写Action:= CaFree;或者直接调用.Free;

在打开因为已经free释放掉了 所以会出错 需要再
if f_ inpurForm =nil then application.CreateForm(T inpurForm,f_ inpurForm) 就可以了


(简体中文你能看懂吧)
 
?>>?(简体中文你能看懂吧)
哈,我也用繁体,但我怎麼能看懂簡体?[:D][:D][:D]
台資企業或港資企業大部分用繁体中文.
 
子窗体close事件的action赋为cafree,就可正常关闭.
再次打开出错是窗体free掉后并非为nil,你可以在子窗体的关闭事件给它赋值为nil.
 
MDI程序中,自动创建的子窗体其关闭按钮就是会让子窗体最小化的,如果是动态创建的才能关闭掉。这是一个动态生成子窗口的MDI例子:

主窗体:
unit Unit1;

interface

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

type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
File1: TMenuItem;
new1: TMenuItem;
window1: TMenuItem;
Cascade1: TMenuItem;
procedure Cascade1Click(Sender: TObject);
procedure new1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

uses
Unit2;

procedure TForm1.Cascade1Click(Sender: TObject);
begin
Cascade
end;

procedure TForm1.new1Click(Sender: TObject);
var
Form2:TForm2;
begin
Form2 := TForm2.Create(Self);
Form2.Caption := TimeToStr(Now);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.WindowMenu := window1;
end;

end.

******************************************************************
子窗体:
unit Unit2;

interface

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

type
TForm2 = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;

end.

其中window1为主菜单中的一个顶端菜单项,即“window”,window1下边还有一个“Cascade”菜单项,即平铺,window1赋值给Form1.WindowMenu后,每打开一个子窗口Delphi都会在window1下增加一个和Cascade平级的菜单项,就像一般的MDI程序一样,另外window1菜单项下一定得有一个其他菜单项(如:Cascade),否则是不能工作的。
 
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
Form2:=nil;
end;
//所有子窗体中做如上操作,其实DELPHI自带的DEMO中就有例子的。
 
非常多谢各位大侠,问题解决了。你们真是好人。
 

Similar threads

后退
顶部