如何将字符串转换成“类”?

lxl 2003-02-17 10:11:13
在程序中使用一个数据库的字符串字段来表示类名(如TEDIT等),想在程序中根据字符串来自动生成控件,请高手指教

...全文
150 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
rwdx 2003-02-17
  • 打赏
  • 举报
回复
gz
Billy_Chen28 2003-02-17
  • 打赏
  • 举报
回复
记住:
var TNAME: TPersistentClass;
RegisterClasses([TNAME]);
Billy_Chen28 2003-02-17
  • 打赏
  • 举报
回复
再简单一点:

TComponentClass=Class of TComponent;

var
TC:TComponentClass;
V :TComponent;
begin
TC=TComponentClass(FindClass(yourClassName));//yourClassName就是你的EIDT类名
if TC<>nil then
V:=TC.Create(AOwner);
end;
Billy_Chen28 2003-02-17
  • 打赏
  • 举报
回复
这个简单,随便你根据什么名字来动态创建由名字生成的类,主要用到RegisterClass,FindClass两个函数:
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
StdCtrls, ExtCtrls, Buttons, Clipbrd, Comctrls, Db, Dbcgrids,
Dbctrls, Dbgrids, Dblookup, Dbtables, Ddeman, Dialogs,
Filectrl, Grids, Mask, Menus, Mplayer, Oleconst, Olectnrs,
Olectrls, Outline, Tabnotbk, Tabs;

type
TClassArray = array [1..107] of TPersistentClass;

// definition temporary used to check the data types
// TClassArray = array [1..107] of TComponentClass;

const
ClassArray: TClassArray = (
TApplication, TDDEServerItem, TPanel, TAutoIncField,
TDirectoryListBox, TPopupMenu, TBatchMove, TDrawGrid,
TPrintDialog, TBCDField, TDriveComboBox, TPrinterSetupDialog,
TBevel, TEdit, TProgressBar, TBitBtn,
TField, TQuery, TBlobField, TFileListBox,
TRadioButton, TBooleanField, TFilterComboBox, TRadioGroup,
TButton, TFindDialog, TReplaceDialog, TBytesField,
TFloatField, TCheckBox, TFontDialog,
TRichEdit, TColorDialog, TForm, TSaveDialog,
TComboBox, TGraphicField, TScreen, TCurrencyField,
TGroupBox, TScrollBar, TDatabase, THeader,
TScrollBox, TDataSource, THeaderControl, TSession,
TDateField, THotKey, TShape, TDateTimeField,
TImage, TSmallIntField, TDBCheckBox, TImageList,
TSpeedButton, TDBComboBox, TIntegerField, TStatusBar,
TDBCtrlGrid, TLabel, TStoredProc, TDBEdit,
TListBox, TStringField, TDBGrid, TListView,
TStringGrid, TDBImage, TMainMenu, TTabbedNotebook,
TDBListBox, TMaskEdit, TTabControl, TDBLookupCombo,
TMediaPlayer, TTable, TMemoField, TDBLookupComboBox,
TMemo, TTabSet, TDBLookupList, TTabSheet,
TDBLookupListBox, TMenuItem, TTimeField, TDBMemo,
TNotebook, TDBNavigator, TOleContainer, TTimer,
TDBRadioGroup, TOpenDialog, TTrackBar, TDBText,
TOutline, TTreeView, TDDEClientConv, TOutline,
TUpdateSQL, TDDEClientItem, TPageControl, TUpDown,
TDDEServerConv, TPaintBox, TVarBytesField, TWordField);

procedure GenerateComponent(AParent:TComponent;
AClass:String; //在这里代入你的Edit.Text
X,y:Integer);
var
MyClass:TComponentClass;
MyObj:TComponent;
begin
MyClass:=TComponentClass(GetClass(AClass));
if MyClass=nil then beep;
else
begin
MyObj:=MyClass.Create(AParent);
if MyObj.InheritsFrom(TControl) then
begin
TControl(MyObj).Left:=X;
TControl(MyObj).top:=Y;
TControl(MyObj).Parent:=AParent;
end;
end;
end;
sysu 2003-02-17
  • 打赏
  • 举报
回复
不可能转换的。
Volker 2003-02-17
  • 打赏
  • 举报
回复
如果类名是有限的,是不是考虑自己维护一个类似VCL类库的树型结构?
hansion3406 2003-02-17
  • 打赏
  • 举报
回复
为什么不用资源文件的办法来做..
Drate 2003-02-17
  • 打赏
  • 举报
回复
好象是没有这样的功能的吧:

如果是窗口的话,可以看一看这里:

http://www.csdn.net/develop/read_article.asp?id=15237
lxl 2003-02-17
  • 打赏
  • 举报
回复
cg1120的方法可用,

tang的方法可行且做成了一个PROCEDURE,不过好象还是要加一句RegisterClasses?或者还有其他更好的方法?

稍后就结贴
noall 2003-02-17
  • 打赏
  • 举报
回复
看5.0的手册。有一章专门说这个。
TangDY 2003-02-17
  • 打赏
  • 举报
回复
procedure GenerateComponent(AParent:TComponent;
AClass:String; //在这里代入你的Edit.Text
X,y:Integer);
var
MyClass:TComponentClass;
MyObj:TComponent;
begin
MyClass:=TComponentClass(GetClass(AClass));
if MyClass=nil then beep;
else
begin
MyObj:=MyClass.Create(AParent);
if MyObj.InheritsFrom(TControl) then
begin
TControl(MyObj).Left:=X;
TControl(MyObj).top:=Y;
TControl(MyObj).Parent:=AParent;
end;
end;
end;
lxl 2003-02-17
  • 打赏
  • 举报
回复
楼上的似乎可行,一会儿试试
但如果再入一层
var
TC:TComponentClass;
V :TComponent;
begin
TC=TComponentClass(FindClass(yourClassName));//yourClassName的EIDT类名
if TC<>nil then
V:=TC.Create(AOwner);
end;

如果我还希望上面TC是个动态的名字(名字也放在数据库中),可行否?


5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧