急死人了!如何根据需要打开form(50分)

  • 主题发起人 主题发起人 ytht
  • 开始时间 开始时间
Y

ytht

Unregistered / Unconfirmed
GUEST, unregistred user!
我想根据用户的需要打开form,不是象那种在菜单项里每个子菜单都写一句XXXX.show那样
的语句,而是把所有的form名字用listbox列出来,用户选择一个form名字,再根据用户的
选择打开页面。怎么做?
 
建一个FORM数组。
 
建立数组
 
程序中一般用application.CreateForm(Txxx, xxx);关键是变量怎么传入啊?怎么把从
程序中得到的字符串转换为 TFormClass和Reference。
 
在另一个List(FormList)中存储对应ListBox中的TFormClass,这样,当选中某个Form时,
传递FormList对应的TFormClass,即可。
例如:
ListBox中有'Form1', 'Form2', 'Form3'
对应FormList中存储TForm1, TForm2, TForm3
如果选中'Form1,则取FormList[1]的值作为参数。
 
ytht,我理解你的问题和痛苦。你所要的
是一个类似解释执行的机制,就象HTML的
链接。

IWTBAH的解决方法不是一个完备的解决方法,
他的方法类似于一个大的CASE语句。数组的
长度和里面的内容是固定的,所以并不能满足
ytht的要求。但因为delphi是编译执行的,
所以一个应用中的form的个数是有限的,例如
说有100个,只要建一个放100个TForm的数组就
能解决ytht的难题。但问题是,这样的编程就
太痛苦了。

我想编译器(不管是delphi还是VC)在理论上应
该可以实现类似解释执行的机制。但不知道我
没找到还是现在的编译器没提供相应的函数。所
以在这里我希望有更多的人能讨论这个问题。
Forget数组,case语句和if else语句,用解释执
行的角度去考虑。
 
比如ListBox数组中有'Form1','Form2'
当选中'Form1'时执行:
var
aForm:TForm;
begin
Application.CreateForm(TComponentClass(FindClass('T'+ListBox.Items[ListBox.ItemIndex])),aForm);
aForm.Show;
end;

但在这之前必须注册TForm1,TForm2等:
procedure TMainForm.FormCreate(Sender: TObject);
begin
RegisterClasses([TForm1,TForm2]);
end;
 
最简单的办法:
将所有的FORM都自动生成,然后用以下代码将所有的FORM加入LISTBOX中
procedure TForm1.Button1Click(Sender: TObject);
var
i:Integer;
s:String;
begin
for i:=0 to Screen.FormCount-1 do
begin
s:=Screen.Forms.Caption;
ListBox1.Items.Add(s);
end;
end;
然后再在ListBox的OnClick事件中写代码:
procedure TForm1.ListBox1Click(Sender: TObject);
var
i:Integer;
begin
i:=ListBox1.ItemIndex;
Screen.Forms.Show;
end;

在NT4、Delphi5中测试通过。
不过如果Form太多的话,内存使用上面不太经济.
 
同意seago
两个窗体Form1,Form2,Form1为主窗体,Form2为动态产生的窗体
先注册TForm2

procedure TForm1.Button1Click(Sender: TObject);
var
SomeObject:TObject;
begin

SomeObject:=CreateAClass('TForm2');// 参数由用ListBox传进来
try
TForm(SomeObject).ShowModal;
finally
SomeObject.Free;
end;
end;

function TForm1.CreateAClass(const AClassName: string): TObject;
var
C:TFormClass;
SomeObject:TObject;
begin
C:=TFormClass(FindClass(AClassName));
SomeObject:=C.Create(nil);
Result:=SomeObject;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterClasses([TForm2]);
end;
 
多人接受答案了。
 
后退
顶部