根据文本的内容创建此类型的控件(100分)

  • 主题发起人 主题发起人 hmjku
  • 开始时间 开始时间
H

hmjku

Unregistered / Unconfirmed
GUEST, unregistred user!
刚在学习类,突然想到两个问题,希望大家可以帮我解答一下:
1.我在窗体中放一个edit和一个button,在edit里填写一个类的类名,如“TMemo”点击button后,在窗体中生成一个该类型的控件,能否实现,如何实现?
2.有没有存在一种文本转化为类型的函数呀?如“strtoclass”的东西,呵呵,不要笑呀,只是个人幻想
 
1.
if edit.text=TMemo then TMemo.create(self).parent:=self;
2.
function ComponentToString(Component: TComponent): string;

var
BinStream:TMemoryStream;
StrStream: TStringStream;
s: string;
begin
BinStream := TMemoryStream.Create;
try
StrStream := TStringStream.Create(s);
try
BinStream.WriteComponent(Component);
BinStream.Seek(0, soFromBeginning);
ObjectBinaryToText(BinStream, StrStream);
StrStream.Seek(0, soFromBeginning);
Result:= StrStream.DataString;
finally
StrStream.Free;

end;
finally
BinStream.Free
end;
end;

function StringToComponent(Value: string): TComponent;
var
StrStream:TStringStream;
BinStream: TMemoryStream;
begin
StrStream := TStringStream.Create(Value);
try
BinStream := TMemoryStream.Create;
try
ObjectTextToBinary(StrStream, BinStream);
BinStream.Seek(0, soFromBeginning);
Result := BinStream.ReadComponent(nil);

finally
BinStream.Free;
end;
finally
StrStream.Free;
end;
end;
 
1. 楼主第一个问题,可以这样考虑:

请将你支持的控件,使用如下方式注册:
RegisterClass
FindClass.
或者楼主可以仿照此方法定义一个RegisterWinControl和FindWinControl的方法。
其原理主要是
将类类型注册到列表中,查找的时候,根据类名来查找。

2.楼主可以查考一下Delphi的Dfm的实现。
在Stream中其实已经实现好了,
function ReadComponent(Instance: TComponent): TComponent;
procedure WriteComponent(Instance: TComponent);
这两个方法就是读取和写Dfm的实现。代码可以仿照楼上的。

Good Luck!
 
问题一:用RTTI(Run Time Type Info)可以实现;
问题二:也可以用RTTI来实现。
 
楼主脑袋超前
 
后退
顶部