高手留步(一个推崇c++的同事向delphi提出的置疑)(100分)

  • 主题发起人 主题发起人 ln_jinsong
  • 开始时间 开始时间
L

ln_jinsong

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟想实现以下功能,请高手指教:
  在一个edit框中输入TEdit,按确定按钮在窗体上生成一个edit编辑框。
  这是一个推崇c++的同事向delphi提出的置疑,我不服,但我不会,请大家多帮忙了。
 
这有什么难的,Create一个不就行了吗。
 

如果输入一个Tbutton 是不是还要生成一个button呢?

确实很难!
 
需求不明确,只要生成edit吗?
 
你是只起生成Tedit,还是别的都打什么生成什么呀?
那不如做个二次开发工具算了
[:D][:D]
 
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;
 
某个事件中:
var
ConName:String;
begin
ConName:=UpperCase(Edit1.Text);
if ConName='EDIT' then begin
with TEdit.Create(Form1) do begin
SetBounds(100,10,50,20);
end;
end else if ConName='Button' then begin
with TButton.Create(Form1) do begin
SetBounds(100,10,50,20);
end;
end else if ConName='' then begin
end ..............
................
end;
一个简单的办法.
 
procedure TMainForm.FormCreate(Sender: TObject);
var
I: Integer;
begin
//注册类
RegisterClasses (Slice (ClassArray, High (ClassArray)));
{for I := Low (ClassArray) to High (ClassArray) do
ComboBox1.Items.Add (ClassArray .ClassName); }//可以在主Form上放个ComboBox1,然后根据在ComboBox1中的选择
//调用上面的过程生成组件。
end;

在Button中如下来一句
GenerateComponent(MainForm,Edit1.Text,100,100);//你的要求
GenerateComponent(MainForm,ComboBox1.Strings[ComboBox1.ItemIndex],100,100);//可以这样


 
DarwinZhang 你的方法出不来。
 
wk_knife的太麻烦了,谁还有好方法。
 
wk_knife应该是最简单的!
基本思路是注册控件
然后根据注册信息生成控件
 
楼上说得对,没听说还有别的好办法
 
procedure TForm1.Button1Click(Sender: TObject);
var
Instance: TComponent;
begin
RegisterClasses([TEdit]);
Instance := TComponent(GetClass('TEdit').NewInstance);
try
Instance.Create(Self);
except
raise;
end;
TWinControl(Instance).Parent := self;
TWinControl(Instance).Show;
end;
似乎只能这样
 
类引用。
这正是delphi强于c++的一点。
C++中的构造函数不可以是虚的,而delphi中却可以。
当由对象调用构造函数时,不能实现多态.
当由类调用构造函数时,同样不能实现多态
但当由类引用调用构造函数时,就可以实现多态了.
borland真伟大!

http://www.delphibbs.com/delphibbs/dispq.asp?lid=1047021
 
你的朋友真搞笑!
DELPHI可以作到或轻松做到C++做布道的或难作到的事情少么??
每个语言都有自己优势
从这点看,你朋友应该是所谓的“高手”
 
谢谢大家的参与!
不过wk_knife兄,是不是一定要把所有的控件类都枚举出来呢?
NoSwing兄,你的RegisterClasses([TEdit])中的TEdit是从什么地方来的?
我的意思是在edit框中输入类名,然后在窗体下生成控件,wk_knife兄的方法
可行,不过有没有再简单一点的?
 
不必都列举出来,只列举你想要的就可以了,在USES中要加入定义它们的单元文件。
 
无需列举。但如WK_KNIFE所说,需要引用这些控件单元文件。
 
已经够简单的了,用VC代码至少要长2倍
 
后退
顶部