动态生成控件!!(50分)

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

luosum

Unregistered / Unconfirmed
GUEST, unregistred user!
本人想在程序运行的时候动态生成控件!比如生成几个TSpeedButton。
能不能象生成form一样:newform:=tform.create(self);
newform.show;
请教各位方法!
 
var s:TSpeedButton;
s:=TSpeedButton.create(self);
s.parent:=self;
s.top:=xx;
s.left:=xx;
 
我觉得没有必要吧,站不了多少资源
 
var
spb:TSpeedButton
begin
spb:= tlabel.Create(self);
spb.parent:= self;
spb.Transparent:= true;
spb.Left:= 10;
spb.Top:= 30;
spb.show;
end;
 
同意leway
 
看看Delphi的源码吧:

function InputQuery(const ACaption, APrompt: string;
var Value: string): Boolean;
var
Form: TForm;
Prompt: TLabel;
Edit: TEdit;
DialogUnits: TPoint;
ButtonTop, ButtonWidth, ButtonHeight: Integer;
begin
Result := False;
Form := TForm.Create(Application);
with Form do
try
Canvas.Font := Font;
DialogUnits := GetAveCharSize(Canvas);
BorderStyle := bsDialog;
Caption := ACaption;
ClientWidth := MulDiv(180, DialogUnits.X, 4);
Position := poScreenCenter;
Prompt := TLabel.Create(Form);
with Prompt do
begin
Parent := Form;
Caption := APrompt;
Left := MulDiv(8, DialogUnits.X, 4);
Top := MulDiv(8, DialogUnits.Y, 8);
Constraints.MaxWidth := MulDiv(164, DialogUnits.X, 4);
WordWrap := True;
end;
Edit := TEdit.Create(Form);
with Edit do
begin
Parent := Form;
Left := Prompt.Left;
Top := Prompt.Top + Prompt.Height + 5;
Width := MulDiv(164, DialogUnits.X, 4);
MaxLength := 255;
Text := Value;
SelectAll;
end;
ButtonTop := Edit.Top + Edit.Height + 15;
ButtonWidth := MulDiv(50, DialogUnits.X, 4);
ButtonHeight := MulDiv(14, DialogUnits.Y, 8);
with TButton.Create(Form) do
begin
Parent := Form;
Caption := SMsgDlgOK;
ModalResult := mrOk;
Default := True;
SetBounds(MulDiv(38, DialogUnits.X, 4), ButtonTop, ButtonWidth,
ButtonHeight);
end;
with TButton.Create(Form) do
begin
Parent := Form;
Caption := SMsgDlgCancel;
ModalResult := mrCancel;
Cancel := True;
SetBounds(MulDiv(92, DialogUnits.X, 4), Edit.Top + Edit.Height + 15,
ButtonWidth, ButtonHeight);
Form.ClientHeight := Top + Height + 13;
end;
if ShowModal = mrOk then
begin
Value := Edit.Text;
Result := True;
end;
finally
Form.Free;
end;
end;
 
我知道这样能够生成一个新的控件,可是最主要的是怎么实现新控件的方法。
procedure spbclick(send:tobject);
begin

end;
 
procedure spbclick(send:tobject);
var speedbutton1:Tspeedbutton;
begin
speedbutton1:=Tspeedbutton.creat(self);
......

end;
 
如上生成新控件时, 可以指定Name,Tag等选项, 一般是指定Tag项目, 然后将它们的Onclick全部
指向一个过程
在此过程中判断Sender是否TSpeedButton, 然后判断Tag是多少再进行相关操作即可
 
我是创建了一个tspeedbutton数组;
var
spb:array[5] of tspeedbutton;
begin
for i:=1 to 5 do
begin
spb:= tspeed.Create(self);
spb.parent:= self;
spb.Left:= xx;
spb.Top:= xx;
end;

然后要创建它们的onclick事件
procedure spbclick(send:tobject);
begin
.....
end;

就是这一部分实现不了。
我想做到按一下新做的控件,就触发它的onclick时间。实现showmessage;
 
自定義一個過程,如
procedure TForm1.MyClick(Sender: TObject);
begin
showmessage(string);
end;

然後在創建控件Speedbutton時加上
Speedbutton.onclick:=MyClick;
就可以啦!
 
后退
顶部