How to trans a string to an object?(200分)

  • 主题发起人 主题发起人 varphone
  • 开始时间 开始时间
V

varphone

Unregistered / Unconfirmed
GUEST, unregistred user!
Likes:
xxx('frmMain').Show;
What is the "xxx";
 
假如你要显示的窗体为Form2,可以这样:
var
Handle: HWND;
begin
handle := Findwindow('TForm2',nil);

if handle = 0 then
begin
Form2:=TForm2.Create(nil);
Form2.Show;
end
else
begin
Form2.Show;
end;
end;
 
This, I know!
Other way?
 
DELPHI中好像没有 xxx('frmMain').Show;这种用法,其他的工具有没有不知道了。
 
frmMain = var frmMain: TForm;
xxx('frmMain') -> frmMain
 
用类引用可能可以实现
 
尝试以下is或as
 
(FindComponent('frmMain') as tform).show;
 
Any more what?
 
我试过了,下面的方法可以达到你的要求:

(application.FindComponent('form2') as tform2).Show;
 
这有什么特别实际的意义?
 
也没有什么特别的意义,只是我想找一种更加快捷地操作对象的方法而已!
 
还要补充说明一点,就是这个对象是任何的对象,不仅仅是 TComponent或者是别的的可视
组件。
 
tobject有Show吗? 如果想要关联对象和字符串用tobjectlist.
 
jrq:

〉〉还要补充说明一点,就是这个对象是任何的对象,不仅仅是 TComponent或者是别的的可视
组件。
var
obj:tobject;
begin
(obj as ???).show
// jrq,你能as出来show?
 
方法我也只知道楼上说的, obj as tobject不能。
 
我的 .show 只是举例而已,
我的问题的真正的目的是想将对象的名称快速地转化为
对象本身或那个对象。
 
在Delphi5.0开发人员指南里找到这一段代码:
procedure TMainForm.FormCreate(Sender: TObject);
begin
// Add some example classes to the list box.
lbSampClasses.Items.Add('TApplication');
lbSampClasses.Items.Add('TButton');
lbSampClasses.Items.Add('TForm');
lbSampClasses.Items.Add('TListBox');
lbSampClasses.Items.Add('TPaintBox');
lbSampClasses.Items.Add('TMidasConnection');
lbSampClasses.Items.Add('TFindDialog');
lbSampClasses.Items.Add('TOpenDialog');
lbSampClasses.Items.Add('TTimer');
lbSampClasses.Items.Add('TComponent');
lbSampClasses.Items.Add('TGraphicControl');
end;

procedure TMainForm.lbSampClassesClick(Sender: TObject);
var
SomeComp: TObject;
begin
lbBaseClassInfo.Items.Clear;
lbPropList.Items.Clear;

// Create an instance of the selected class.
SomeComp := CreateAClass(lbSampClasses.Items[lbSampClasses.ItemIndex]);
try
GetBaseClassInfo(SomeComp, lbBaseClassInfo.Items);
GetClassAncestry(SomeComp, lbBaseClassInfo.Items);
GetClassProperties(SomeComp, lbPropList.Items);
finally
SomeComp.Free;
end;
end;

initialization
begin
RegisterClasses([TApplication, TButton, TForm, TListBox, TPaintBox,
TMidasConnection, TFindDialog, TOpenDialog, TTimer, TComponent,
TGraphicControl]);
end;

也就是在MainForm的Create的时候在lbSampleClasses列表框中填入各个类的名字,在运行
时用户选择类名,则动态创建一个控件并获取它的RTTI,应该是通过
function CreateAClass(const AClassName: string): TObject;来实现你要的功能。
需要注意的是,所要动态创建的类必须在Initilization段中注册(见上面的代码)

function CreateAClass(const AClassName: string): TObject;
{ This method illustrates how you can create a class from the class name. Note
that this requires that you register the class using RegisterClasses() as
show in the initialization method of this unit. }
var
C : TFormClass;
SomeObject: TObject;
begin
C := TFormClass(FindClass(AClassName));
SomeObject := C.Create(nil);
Result := SomeObject;
end;
 
后退
顶部