如何使MDI子窗体只运行一次?(50分)

  • 主题发起人 主题发起人 heron
  • 开始时间 开始时间
H

heron

Unregistered / Unconfirmed
GUEST, unregistred user!
如何使MDI子窗体只运行一次?
因为我并不需要多次打开同一个MDI子窗体
 
(1)干脆用SDI
(2) if Form1.MdiChildCount=0 then
MdiChild.Create(self)
 
不要让他打开多个就可以了,每次创建时判一下,如果存在则不创建新的,只显示旧的.
 
判断是否已创建,如果未创建就创建一下,否则就显示出来.
 

function FindForm(const FormName: String;
var FormIndex: integer): Boolean;
var
i: Integer;
FormChild: TForm;
begin
Result := false;
for i := 0 to Screen.FormCount - 1 do
begin
FormChild := Screen.Forms;
if FormChild.ClassNameIs(FormName) then
begin
FormIndex := i;
Result := true;
end;
end;
end;
 
to:microding
我在D5下调试通不过
 
设个boolean型的标志位即可呀,如果有多个子窗体,可用一个boolean型的一维数组,
有例如下:
form1里:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
form2_flag:boolean;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var f:tform;
begin
if not form2_flag then
begin
form2_flag:=true;
application.CreateForm(tform2,f);
end;
end;
end.

form2里:
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
uses Unit1;
{$R *.dfm}
procedure TForm2.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
form2_flag:=false;
action:=cafree;
end;
end.
注:在form2里的uses中引用form1,以便使用form1中的form2_flag标志,
在D6下调试通过。如还有问题,请EMAIL:b5790930@pub.xz.jsinfo.net
 
使用assigned()
delphi5开发人员指南中可以找到!
另外我的方法就是:窗口创建后使创建窗口的button或meun变为enabled=false,窗口关闭后
再恢复![:D]
 
To:truecat
我的意思是当子窗体创建以后,再次打开时则使窗体显示到最前面
 
把下面这段代码放到打开子窗口的事件里.
procedure TMainWin.Open_childformClick(Sender: TObject);
var
li_loop:integer;
lbl_falg:boolean;
//窗口是否打开的标志
begin
lbl_falg:=false;
//判断要打开的子窗体中是否已经打开
for li_loop:=0 to self.MDIChildCount-1 do
begin
if self.MDIChildren[li_loop] is Tchildform_name then
begin
lbl_falg:=true;
//判断出窗口已打开
end
end;

if lbl_falg then
//如果子窗体已打开,则将它激活
begin
childform_name.Show;
end
else
// 如果子窗体未打开,则创建它
begin
childform_name:=Tchildform_name.Create(Self);
childform_name.Show;
end;
end;
 
用如下过程来打开你所有的MDI子窗体,fromClass参数传入子窗体的类名:
function TfrmMain.ActiveMDIForm(formClass: TFormClass): Boolean;
var newForm:TForm;
i:integer;
bFound:Boolean;
begin
// newForm := nil;
Result := False;
bFound := False;
i := 0;
while not bFound and (i < MDIChildCount) do
if MDIChildren.ClassName = formClass.ClassName then
begin
newForm := MDIChildren;
bFound := True;
end
else
inc(i);
if bFound then
begin
Result := True;
newForm.Show;
end
else
begin
Result := True;
formClass.Create(Self).Show;
end;
end;
 
在論談上找找,我有看過的
 
function TForm1.Formappear(vFormName:string):boolean;
//判断子窗体是否已打开
var I:integer;
begin
result:=False;
IF MDIChildCount>0 then
For I:=0 to MDIChildCount-1 do
IF MDIChildren.Name=vFormName then
begin
result:=True;
MDIChildren.WindowState := wsNormal ;
//如果已打开,显示到最前端
end;
end;

procedure TForm1.N1Click(Sender: TObject);
//打开子窗体
var
ChildForm:TChildForm;
FormExist:Boolean;
begin
FormExist:=Formappear('ChildForm');
IF not(FormExist) then
begin
Screen.Cursor :=crHourGlass ;
ChildForm:=TChildForm.Create(Self);
ChildForm.Caption:='....';
Screen.Cursor :=crDefault;
end;
end;
 
MDIChildren.WindowState := wsNormal ;
并不能使子窗体显示到最前端
不过问题已基本解决,谢谢各位!
 
忘了发分了:)
 
后退
顶部