知道类名怎样调用这个类(50分)

  • 主题发起人 主题发起人 gly2003
  • 开始时间 开始时间
G

gly2003

Unregistered / Unconfirmed
GUEST, unregistred user!
例如:
main:Tfrom;
main.showmodal;
但只知道'main'这个字符串该怎么办啊
 
希望大家帮我顶一下,我非常急
 
main:=tform.create(self);
main.類的方法
 
说的什么意思?把具体问题抬出来呀。
 
main 使我从数据库中提取的一个'main'字符串,怎么才能转换成main对象啊
 
011101我是真服了你了,不懂还到处回答问题,添乱嘛[8D]

只知道'main'是一点办法都没有了,如果知道'Tfrom',到还可以,论坛里有好多这样问题的回答,我平时不关心这些,就不知道了,一会儿会有知道的回答你的,或者自己先全文检索搜搜:根据类名创建对象的帖子,很多。
 
procedure TForm1.btn1Click(Sender: TObject);
VAR
I : Integer ;
mainform : TForm ;
begin
for i := 0 to Application.ComponentCount-1 do
Begin
if Application.Components.Name = 'main' then
Begin
mainform := TForm(Application.Components) ;
break ;
end ;
end ;
end;
 
to:mainana 我得意思基本是这样的.我说不太明白
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;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
form2:string;
begin
Form2.ShowModal;//uses unit2的form
end;

end.
 
to: matar
这样只能查找本form的tfrom的对象
 
各位大侠:
帮我看看好么
 
不会呀 我自己TEST过的 可以查看本系统全部的FORM对象
procedure TForm1.btn1Click(Sender: TObject);
VAR
I : Integer ;
mainform : TForm ;
begin
for i := 0 to Application.ComponentCount-1 do
Begin
ShowMessage(Application.Components.Name);
if Application.Components.Name = 'main' then
Begin
mainform := TForm(Application.Components) ;
break ;
end ;
end ;
end;
你自己再TEST一下。
 
to: mater
非常感谢你的回答,答案我也比较满意,但有个问题你想过了没又,如果一个form是静态的
你能找到么.(昨天我出差,没有及时看到)
 
看看我的代码(例子)

function FindExistingForm(FFormName: string): TForm;
var
i: integer;
begin
Result := nil;
try
if FFormName = '' then raise Exception.Create('需要类名!');
with Application do
for i := 0 to ComponentCount - 1 do
if Components.ClassName = ('T' + FFormName) then begin
Result := TForm(Components);
Break;
end;
except
on E: Exception do
ShowMessage(E.Message)
else raise;
end;
end;
function CreateForm(FFormName: string; AOwner: TComponent): TForm;
type
TFormClass = class of TForm;
var
AFormClass: TFormClass;
begin
Result := nil;
try
if FFormName = '' then raise Exception.Create('需要类名!');
AFormClass := TFormClass(FindClass('T' + FFormName));
Result := AFormClass.Create(AOwner);
except
on E: Exception do
ShowMessage(E.Message)
else raise;
end;
end;
procedure OtherFormComponentClick(FFormName: string; FComponentName: string; AOwner: TComponent);
var
AForm :TForm;
AComponent :TComponent;
begin
AForm:= FindExistingForm(FFormName);
if AForm=nil then
begin
AForm:=CreateForm(FFormName, AOwner);
AForm.Show;
end;
AComponent:=AForm.FindComponent(FComponentName);
if AComponent<>nil then TButton(AComponent).Click;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
OtherFormComponentClick('Form2', 'MyButton', Self);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
AComponent :TComponent;
begin
with Application do
for i := 0 to ComponentCount - 1 do
begin
AComponent:=TForm(Components).FindComponent('MyButton');
if AComponent<>nil then TButton(AComponent).Click;
end;
end;
procedure TForm1.MyButtonClick(Sender: TObject);
begin
application.MessageBox('TForm1.MyButtonClick','提示');
end;
窗体要自注册:
procedure TForm2.MyButtonClick(Sender: TObject);
begin
application.MessageBox('TForm2.MyButtonClick','提示');
end;
initialization
RegisterClass(TForm2);
 
to:youtgxf
initialization
RegisterClass(TForm2);
是系统自动注册么,要是用手动以上不都是白费功夫么
如果不是自动注册,用手动就好无意义了
 
是的呀,系统自动注册的。
 
如果不注册类,函数function CreateForm(FFormName: string; AOwner: TComponent): TForm;就会出错,提示没这个类。
 
FindComponent
 
to:yostgxf
我还没有看懂你的例子,不过我试了一下,只要是动态创建的,就不行了,
不知道我那里是不是错了,我再看一下了,这个问题真的值得好好的研究一下
 
to: mastar and yostgxf
thank you very much
可以告诉我,你们的qq号么,以后多加联系好么
 
哦,刚出差回来。

动态创建的是可行的,要注意你创建的类必须要自注册。
1。过程function FindExistingForm(FFormName: string): TForm;
根据类名(字符串)查找(调用)窗体。
2。过程function CreateForm(FFormName: string; AOwner: TComponent): TForm;
根据类名(字符串)创建窗体。这时你的这个类名(字符串)的窗体必须要注册的。
注册的方法:例:
initialization
RegisterClass(TForm2);//注册TForm2
end.
3.过程procedure OtherFormComponentClick(FFormName: string; FComponentName: string; AOwner: TComponent); 是在类名FFormName的窗体上寻找类名为FComponentName的组件,并点击一下。如果类名FFormName的窗体不存在,就创建它。

ok,明白了吗?


 
后退
顶部