关于MDI界面开发的问题!(30分)

  • 主题发起人 主题发起人 13878578191
  • 开始时间 开始时间
1

13878578191

Unregistered / Unconfirmed
GUEST, unregistred user!
我建立了mainFrm,childFrm1,childFrm2,childFrm3分别作为主窗体和子窗体。
请大家帮我看看下面这段代码有什么问题?

unit Unit1;

interface

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

type
TmainFrm = class(TForm)
CoolBar1: TCoolBar;
ToolBar1: TToolBar;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
procedure openForm(childFrm1:TForm);
procedure ToolButton1Click(Sender: TObject);
procedure ToolButton2Click(Sender: TObject);
procedure ToolButton3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
mainFrm: TmainFrm;

implementation

uses Unit2, Unit3, Unit4;

{$R *.dfm}
procedure TmainFrm.openForm(childFrm1:TForm);
begin
if childFrm1<>nil then
childFrm1.BringToFront
else begin
childFrm1:=TchildFrm1.Create(application);
childFrm1.Show;
end;
end;

procedure TmainFrm.ToolButton1Click(Sender: TObject);
begin
openForm(childFrm1);
end;

procedure TmainFrm.ToolButton2Click(Sender: TObject);
begin
openForm(childFrm2);
end;

procedure TmainFrm.ToolButton3Click(Sender: TObject);
begin
openForm(childFrm3);
end;

end.
如果我不自定义过程的话,运行没有问题,但是现在运行达不到预期的效果!
在线等待……………………
 
你的问题很模糊。
首先childFrm1你在哪儿定义的?是delphi定义的吗?那么在工程文件里Application.CreateForm(childFrm1,TchildFrm1)这一句你要不要?
其次childFrm1关闭时动作如何,释放了吗?那么childFrm1变量值是多少?重新赋值了吗?
如果否,则childFrm1永远<>nil,所以会出错。
 
您把自定义过程用如下代码实现,绝对没问题:
procedure OpenForm(FormClass: TFormClass; var fm; AOwner:TComponent);
var
i: integer;
Child:TForm;
begin
for i := 0 to Screen.FormCount -1 do
if Screen.Forms.ClassType=FormClass then
begin
Child:=Screen.Forms;
if Child.WindowState=wsMinimized then
ShowWindow(Child.handle,SW_SHOWNORMAL)
else
ShowWindow(Child.handle,SW_SHOWNA);
if (not Child.Visible) then Child.Visible:=True;
Child.BringToFront;
Child.Setfocus;
TForm(fm):=Child;
exit;
end;
Child:=TForm(FormClass.NewInstance);
TForm(fm):=Child;
Child.Create(AOwner);
end;


procedure OpenForm(FormClass: TFormClass; var fm; AOwner:TComponent);
var
i: integer;
Child:TForm;
begin
for i := 0 to Screen.FormCount -1 do
if Screen.Forms.ClassType=FormClass then
begin
Child:=Screen.Forms;
if Child.WindowState=wsMinimized then
begin
ShowWindow(Child.handle,SW_SHOWNORMAL);
end
else
begin
child.Left:=0;
child.top:=0;
ShowWindow(Child.handle,SW_SHOWNA);
end;
if (not Child.Visible) then Child.Visible:=True;
Child.BringToFront;
Child.Setfocus;
TForm(fm):=Child;
exit;
end;
Child:=TForm(FormClass.NewInstance);
Child.Create(AOwner);
TForm(fm):=Child;
end;
 
不知是出什么问题,在哪 出问题。
 
前两个结合可以解决问题
1.关闭要释放或用API函数ShowWindow隐藏
2.用gaohua21的方法打开或激活窗体
 
我在onclose事件理已经caFree and nil
我的问题是如果按照上面的代码执行,每按一下ToolButton1,就会弹出一个childFrm1,即使
childFrm1已经存在。但是如果我把自定义过程里的代码放到每个ToolButton点击事件里,
一点问题也没有,功能实现非常良好!
我在主窗体的单元文件里定义的过程。
TO:gaohua21
你的代码我知道,在DWF上我看见了,您能不能告诉我其中的参数各代表什么意思,如何使用?
 
procedure TmainFrm.openForm(AchildFrm:TForm);
begin
if AchildFrm<>nil then
AchildFrm.BringToFront
else begin
AchildFrm:=TchildFrm1.Create(application); //就一个窗口类吗?
^^^^^^^^^^
AchildFrm.Show;
end;
end;
 
对啊,就一个,有什么问题吗?
 
问题就在这里。你的三个button生成了TchildForm1的三个实例,当然会出现“每按一下ToolButton1,就会弹出一个childFrm1,即使
childFrm1已经存在”。
另外,在你的childForm1的Close事件中要记得 childform1:=nil,action := caFree;
 
既然就一个子窗口类,为什么还要在不同的函数里面创建?
还有一个问题,既然带的参数是要表示创建childform1,2,3
为什么还要在被调用的函数里面指定childform1??
你的问题在于你不知道自己要做什么?
 
谢谢!
我的三个子窗体是手动已经生成的,只是没有让他们自动创建。
请问那我该怎么写那个过程呢?
 
将函数中的childFrm1都改为其它的名字试一下。

procedure TmainFrm.openForm(childFrm:TForm);
begin
if childFrm<>nil then
childFrm.BringToFront
else begin
childFrm:=TchildFrm1.Create(application);
childFrm.Show;
end;
end;
 
多人接受答案了。
 
后退
顶部