关于MID窗体中子窗体重复的问题(100分)

  • 主题发起人 主题发起人 anddyluo
  • 开始时间 开始时间
我再提一下,用本人的办法绝对没问题!我整天在项目中用都行怎么提给你就不行了?
并且本人的方法也最简单明了。
MDI(FormMDI)关闭时:
//即OnClose中,不可乱写呀
Action := caFree;
//不可少,与Assigned函数有关。
FormMDI := nil;

MDI(FormMDI)创建时:
if not Assigned(FormMDI) then
Application.CreateForm(TFormMDI, FormMDI);
FormMDI.Show;
以上代码本人在项目中应用,没有问题。
还有别忘了结束你的贴子,免得让人家说大富翁没高人。而原因却出在你那!
本人是哥们,QQ号为:84924842。希望多认识一些高手共同学习、进步。

 
To YFeral:
在使用:
MDI(FormMDI)创建时:
if not Assigned(FormMDI) then
Application.CreateForm(TFormMDI, FormMDI);
FormMDI.Show;
后,mdi窗体第一次就打开不了。而且在使用
Application.CreateForm(TFormMDI, FormMDI);
语句后,运行程序是报错,改为:
FormMDI:= TFormMDI.create(application);
后运行不报错,但还是mdi窗体第一次就打开不了。我就想不通你怎么就能行?????
 
To cb_hfxy
用你的方法可以实现,但是怎么样才能显示(激活)当前点击的MDI子窗体?
 
to anddyluo:
我知道你的问题出在哪!你肯定在Program中让程序自动创建了子窗体。老兄,你既然想
让别的菜单调用他就不要让程序自动创建的,这是个基本问题你竟然疏忽了。
给你代码:
//********************************************
//主程序
//注意:子窗体在词不可自动创建
program ProDemo;

uses
Forms,
UnitMain in 'UnitMain.pas' {FormMain},
UnitChild in 'UnitChild.pas' {FormChild};

{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TFormMain, FormMain);
//你的问题就出在下面
// Application.CreateForm(TFormChild, FormChild);
Application.Run;
end.
//*****************************************
//主窗体。注意窗体属性
//*****************************************
unit UnitMain;

interface

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

type
TFormMain = class(TForm)
MainMenu1: TMainMenu;
File1: TMenuItem;
mnuChild: TMenuItem;
procedure mnuChildClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
FormMain: TFormMain;

implementation

uses UnitChild;

{$R *.dfm}

procedure TFormMain.mnuChildClick(Sender: TObject);
begin
if not Assigned(FormChild) then
Application.CreateForm(TFormChild, FormChild);
FormChild.Show;
end;

end.

//**********************************
//子窗体:注意窗体属性。
//**********************************
unit UnitChild;

interface

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

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

var
FormChild: TFormChild;

implementation

{$R *.dfm}

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

end.

 
这次再不行我真怀疑见鬼了!
 
提问题的人是不是不来了?
 
楼上:
由于出差,最近没有上网。
以下是我的程序://没有在Program中让程序自动创建了子窗体

//主程序
program Pmainunit;

uses
Forms,
SysUtils,
Umainunit in 'Umainunit.pas' {mainform},
Utzsrfrm in 'Utzsrfrm.pas' {tzsrform},
Ulwsrfrm in 'Ulwsrfrm.pas' {wplwsrfrm},
Utzsbfrm in 'Utzsbfrm.pas' {tzsbfrm},
Ulwsbfrm in 'Ulwsbfrm.pas' {lwsbfrm},
Utzcxfrm in 'Utzcxfrm.pas' {tzcxfrm},
Ulwcxfrm in 'Ulwcxfrm.pas' {lwcxFrm},
Uloginfrm in 'Uloginfrm.pas' {loginfrm},
Uxgmmfrm in 'Uxgmmfrm.pas' {xgmmfrm},
Uzcfgcx in 'Uzcfgcx.pas' {zcfgfrm},
Udm in 'Udm.pas' {DM: TDataModule},
rep_wsyq in 'REP_WSYQ.PAS' {Rep21_Form},
Unit_Splash in 'Unit_Splash.pas' {Form_Splash},
Unit_Statistics in 'Unit_Statistics.pas' {Form_Statistics},
Unit_Declare in 'Unit_Declare.pas';

{$R *.RES}

begin
Application.Initialize;
loginfrm := Tloginfrm.Create(application);
loginfrm.ShowModal;
if loginfrm.ModalResult = 1 then
begin
Application.CreateForm(Tmainform, mainform);
Application.CreateForm(TDM, DM); //DM 为 数据模块
Application.CreateForm(TRep21_Form, Rep21_Form);//Rep21_Form 为报表
end;
Application.Run;
end.

//主窗体中调用子窗体的程序:
procedure Tmainform.tzsrmenuClick(Sender: TObject);
var
tzsrfm : Ttzsrform;
begin
if tzsrOk then
begin
mainform.
//tzsrfm.WindowState:=wsMaximized;
//tzsrfm.WindowState:=wsNormal;
Exit;
end;

//子窗体:
procedure Twplwsrfrm.ToolButton12Click(Sender: TObject);
begin
close;
end;
procedure Twplwsrfrm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
action := cafree;
end;
 
to anddyluo:
你的TLoginFrm用到数据模块了吗?
我对你的程序修改如下:

//主窗体中调用子窗体的程序:
procedure Tmainform.tzsrmenuClick(Sender: TObject);
//var
//tzsrfm : Ttzsrform;
begin
//保证wplwsrfrm为MDI子窗体。
if not Assigned(wplwsrfrm) then
Application.CreateForm(Twplwsrfrm, wplwsrfrm);
wplwsrfrm.show;
// if tzsrOk then
// begin
// mainform.
//tzsrfm.WindowState:=wsMaximized;
//tzsrfm.WindowState:=wsNormal;
// Exit;
end;

//子窗体:
procedure Twplwsrfrm.ToolButton12Click(Sender: TObject);
begin
close;
end;
procedure Twplwsrfrm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
action := cafree;
//添加一句
wplwsrfrm := nil;
end;
 
我想把它做成一个过程或是函数,怎么做

begin
//保证wplwsrfrm为MDI子窗体。
if not Assigned(wplwsrfrm) then begin
Application.CreateForm(Twplwsrfrm, wplwsrfrm);
wplwsrfrm.show;
end else
wplwsrfrm..WindowState:=wsNormal;
end;

 
这样就搞定了

procedure TPOFrm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=cafree;
POFrm:=Nil;
end;

procedure TPOFrm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=True;
end;

procedure ShowFrm_POFrm;
begin
if Assigned(POFrm) then
begin
if isiconic(POFrm.handle) then showwindow(POFrm.handle,sw_restore)
else setforegroundwindow(POFrm.handle);
end
else
begin
POFrm:=TPOFrm.Create(nil);
POFrm.Show;
end;

end;
 
大侠你理解错了
比如:
pofm
open from(Tpofm,pofm);//这个地方可以换成别的窗体函数;

begin
//保证wplwsrfrm为MDI子窗体。
if not Assigned(wplwsrfrm) then begin
Application.CreateForm(Twplwsrfrm, wplwsrfrm);
wplwsrfrm.show;
end else
wplwsrfrm..WindowState:=wsNormal;
end;



procedure openfrom(参数1,参数2);
 
后退
顶部