请教关于动态窗体的问题:如果我得窗体设为不是自动创建时,不能打开非自动创建的form,急!!!! 主要代码如下:
procedure TFrm_main.ListView1Click(Sender: TObject);
begin
Frm_DM.Q_tree2.SQL.Add('select * from h_code_tree where meno=:meno');
---
FormName:=Frm_DM.Q_tree2.FieldByName('name').AsString;
MyComponent:=Application.FindComponent(FormName);
Formmeno:=MenuName(Frm_DM.Database1,Frm_DM.Model,FormName);
if (MyComponent Is TForm) then
begin
try
MyForm:=TForm(MyComponent);
//MyForm:=TForm(MyComponent).Create(Application);
MyForm.BorderStyle:=bsToolWindow;
MyForm.Position:=poMainFormCenter;
MyForm.ShowModal;
AddLog(Frm_DM.Database1,Frm_DM.Model,Frm_login.p_username,Formmeno,Now);
finally
//MyForm.free;
MyForm:=Nil;
end;
end
else
begin
try
//MyForm:=TForm(MyComponent).Create(Application);
MyForm:=TForm.Create(nil);
//MyForm.Name:=FormName;
MyForm.BorderStyle:=bsToolWindow;
MyForm.Position:=poMainFormCenter;
MyForm.ShowModal;
finally
MyForm.free;
MyForm:=Nil;
end;
end;
谢谢了!
procedure TFrm_main.ListView1Click(Sender: TObject);
begin
Frm_DM.Q_tree2.SQL.Add('select * from h_code_tree where meno=:meno');
---
FormName:=Frm_DM.Q_tree2.FieldByName('name').AsString;
MyComponent:=Application.FindComponent(FormName);
Formmeno:=MenuName(Frm_DM.Database1,Frm_DM.Model,FormName);
if (MyComponent Is TForm) then
begin
try
MyForm:=TForm(MyComponent);
//MyForm:=TForm(MyComponent).Create(Application);
MyForm.BorderStyle:=bsToolWindow;
MyForm.Position:=poMainFormCenter;
MyForm.ShowModal;
AddLog(Frm_DM.Database1,Frm_DM.Model,Frm_login.p_username,Formmeno,Now);
finally
//MyForm.free;
MyForm:=Nil;
end;
end
else
begin
try
//MyForm:=TForm(MyComponent).Create(Application);
MyForm:=TForm.Create(nil);
//MyForm.Name:=FormName;
MyForm.BorderStyle:=bsToolWindow;
MyForm.Position:=poMainFormCenter;
MyForm.ShowModal;
finally
MyForm.free;
MyForm:=Nil;
end;
end;
谢谢了!
解决方案 »
- delphi如何和数据库相连
- 程序员工资调查
- 类方法 stackoverflow
- 急!!!StringGrid控件的onRowMoved事件为什么无效?????是Delphi的BUG吗?请指教
- Delphi的控件命名规则是什么?
- 小弟有一小问题请教。望各位大哥赐教!!--
- 如何在DELPHI中读取指定的Cookie文件中的内容
- 问一个SQL的问题,关于条件是日期时间型的字段???
- 怎样在delphi中用http协议的post方法向remote host表格提交信息?
- 哪位老师能讲一讲delphi5比delphi4增加了多少新的特点和功能([email protected])
- 關於三賤的申請支持斑竹貼回復回的手軟,開個貼支持下!
- 我也放分,支持3J申请斑竹
AddForm :=TYourForm.Create(self)
procedure TFrm_main.ListView1Click(Sender: TObject);
begin
Frm_DM.Q_tree2.SQL.Add('select * from h_code_tree where meno=:meno');
---
FormName:=Frm_DM.Q_tree2.FieldByName('name').AsString;
MyComponent:=Application.FindComponent(FormName);
Formmeno:=MenuName(Frm_DM.Database1,Frm_DM.Model,FormName);
if (MyComponent Is TForm) then
begin
try
with tmycomponent.create(self) do
begin
MyForm:=TForm(MyComponent);
//MyForm:=TForm(MyComponent).Create(Application);
MyForm.BorderStyle:=bsToolWindow;
MyForm.Position:=poMainFormCenter;
MyForm.ShowModal;
end;
AddLog(Frm_DM.Database1,Frm_DM.Model,Frm_login.p_username,Formmeno,Now);
finally
//MyForm.free;
MyForm:=Nil;
end;
end
else
begin
try
//MyForm:=TForm(MyComponent).Create(Application);
MyForm:=TForm.Create(nil);
//MyForm.Name:=FormName;
MyForm.BorderStyle:=bsToolWindow;
MyForm.Position:=poMainFormCenter;
MyForm.ShowModal;
finally
MyForm.free;
MyForm:=Nil;
end;
end;大楷是这个意思,照这种方法试试
var
I : Integer;
begin
Result := nil; for I := 0 to Screen.FormCount -1 do
begin
if Screen.Forms[I].Name = AName then
begin
Result := Screen.Forms[I];
Break;
end;
end;
end;这个函数只能找到这个程序自己创建的窗体,不能用于寻找系统中运行的其他窗体。
procedure TFrm_main.ListView1Click(Sender: TObject);
begin
Frm_DM.Q_tree2.SQL.Add('select * from h_code_tree where meno=:meno');
---
FormName:=Frm_DM.Q_tree2.FieldByName('name').AsString;
MyComponent:=Application.FindComponent(FormName);
Formmeno:=MenuName(Frm_DM.Database1,Frm_DM.Model,FormName);
if (MyComponent Is TForm) then
begin
try
MyForm:=TForm(MyComponent);
//MyForm:=TForm(MyComponent).Create(Application);
MyForm.BorderStyle:=bsToolWindow;
MyForm.Position:=poMainFormCenter;
MyForm.ShowModal;
AddLog(Frm_DM.Database1,Frm_DM.Model,Frm_login.p_username,Formmeno,Now);
finally
//MyForm.free;
MyForm:=Nil;
end;
end
else
begin
try
//MyForm:=TForm(MyComponent).Create(Application);
MyForm:=TForm.Create(nil);
//MyForm.Name:=FormName;
MyForm.BorderStyle:=bsToolWindow;
MyForm.Position:=poMainFormCenter;
MyForm.ShowModal;
finally
MyForm.free;
MyForm:=Nil;
end;
end;
谢谢了!
MyComponent:=Application.FindComponent(FormName);
->MyComponent:=FindFormByName(FormName);
ShowMessage(Screen.Forms[I].Name);
你好象是根据窗体名称去找对应的窗体,如果有,则显示出来;如果没有,就先创建一个再显示,是不是?
如果是这个想法,你要改一下思路:
程序启动时,只创建最小数量的窗体(应该是DM和Main吧),其它的都是用完了就释放(Login等)。
在主程序里用户点击ListView的时候,就新建一个,用完了就释放。
放心,创建窗体很快,不用什么时间;这样做可以省下内存,而且代码简单。你的代码中有一些很奇怪的写法,比如:
MyForm:=TForm(FindFormByName(FormName)).Create(Application);
这种写法很危险,想当于把一个已存在的对象重新初始化了一次,内中的一些对象可能就重复创建了,当然,原来的也没有释放。
我得程序就是根据窗体名称去找对应的窗体,如果有,则显示出来;如果没有,就先创建一个再显示。我得思路也是:只创建几个最小的窗体(如Frm_login,Frm_dm,Frm_main,别的窗体都是动态创建的),但是存在的问题是:在Frm_main中的点击ListView过程中,只要是动态创建的窗体就不会打开已经的存在的窗体,而是给我创建了一个新的窗体!下面的代码有点问题:
procedure TFrm_main.ListView1Click(Sender: TObject);
var
MyForm:TForm;
//FormName:TForm;
MyComponent:TComponent;
begin
if ListView1.Selected=nil then Exit;//避免点击空白内容时报错
Frm_DM.Q_tree2.Close;
Frm_DM.Q_tree2.Sql.Clear;
Frm_DM.Q_tree2.SQL.Add('select * from h_code_tree where meno=:meno');
Frm_DM.Q_tree2.ParamByName('meno').AsString:=ListView1.Selected.Caption;
Frm_DM.Q_tree2.Open;
FormName:=Frm_DM.Q_tree2.FieldByName('name').AsString;
//Myform:= (MyComponent as TForm).Create(Application);
MyComponent:=FindFormByName(FormName);
{ if (MyComponent Is TForm) then
begin
(MyComponent as TForm).ShowModal;
end
else
begin
Myform:= (MyComponent as TForm).Create(Application);
myform.ShowModal;
end;
exit; }
//
//MyComponent:=Application.FindComponent(FormName);
//MyForm:=TForm(MyComponent).Create(Application);
//MyForm:=TForm(MyComponent);
//MyForm.Show;
if (MyComponent Is TForm) then
begin
try
with mycomponent.create(self) do
begin
MyForm:=TForm(MyComponent);
//MyForm:=TForm(MyComponent).Create(Application);
MyForm.BorderStyle:=bsToolWindow;
MyForm.Position:=poMainFormCenter;
Frm_ruku.ShowModal;
end;
AddLog(Frm_DM.Database1,Frm_DM.Model,Frm_login.p_username,Formmeno,Now);
finally
//MyForm.free;
MyForm:=Nil;
end;
end
else
begin
try
//MyForm:=TForm(MyComponent).Create(Application);
MyForm:=TForm.Create(nil);
//MyForm.Name:=FormName;
MyForm.BorderStyle:=bsToolWindow;
MyForm.Position:=poMainFormCenter;
MyForm.ShowModal;
finally
MyForm.free;
MyForm:=Nil;
end;
end;end;
with ListView1.Selected do
if Caption = ... then
TFormA.Create(...)
else
if Caption = ... then
TFormB.Create(...)
else
...
给你看点新东西,愿不愿研究,你自己看着办吧:)type
TFormClass = class of TForm;
const
FormClasses : array [0..1] of TFormClass = (
TFrm_Sys, TFrm_Log
);根据窗体名称找到窗体对应的下标,根据下标在数组中找到对应的窗体类型,这样创建窗体:
with FormClasses[Index].Create(Application) do
try
ShowModal();
....
finally
Free;
end;