呼叫村长和各位delphi大婶,如何动态创建和释放多个TComboBox?
本帖最后由 motoedy 于 2014-11-8 15:16 编辑delphi的新手,想写些自用的小软件,
经常遇到一些属性相同的东西,想动态创建
度娘出一个动态创建和释放tedit的方法,
http://www.cnblogs.com/Bung/archive/2011/09/17/2179463.html
但是用在TComboBox上好像不好使。。
想要这样的效果:
呼叫村长和各位delphi大婶,如何动态创建和释放多个TComboBox?
csaaa 发表于 2014-11-8 11:09
with TComboBox.Create(self) do begin
parent:=Self;//注意这个
top:=100;
这个是父容器定义吧,不一定是self吧。
可以是其他控件吧,但是还是不好使。。
csaaa 发表于 2014-11-8 11:39
定义他的parentcontrol是谁,主要是为了item用的否则可以不用定义。在delphi2005下测试通过。不相信可以截 ...
能给个动态创建和释放多个TComboBox的demo么?
我还是搞不定。。 本帖最后由 ysoni 于 2014-11-8 14:54 编辑
var
cb: TComboBox;
begin
cb := TComboBox.Create(Self);
with cb do
begin
Left := xxx;
Top := xxx;
Width := xxx;
Item.Add("sssss");
end;
end;
Create(Self)不需要释放,在其Parent释放时负责处理。 若是Create(nil),需要指定cb.Parent,需要释放时用cb.Free或FreeAndNil(cb). ysoni 发表于 2014-11-8 14:49
with TComboBox.Create(nil) do
try
parent:=Self;//注意这个
我是想动态创建和释放多个TComboBox。
不是动态创建一个。 这都给出了一个的例子。 多个照做就是了。 ysoni 发表于 2014-11-8 14:56
这都给出了一个的例子。 多个照做就是了。
我要的是这种效果。。
多个动态生成多个还是百思不得姐啊。。{:dizzy:}
csaaa 发表于 2014-11-8 11:39
定义他的parentcontrol是谁,主要是为了item用的否则可以不用定义。在delphi2005下测试通过。不相信可以截 ...
想要的是这种效果
ysoni 发表于 2014-11-8 14:49
var
cb: TComboBox;
begin
试了下你的代码
会报错没有指定Parent。
2楼的可以,照做或加点楼主你自己的需求就可以了。 aleyn 发表于 2014-11-8 16:08
2楼的可以,照做或加点楼主你自己的需求就可以了。
添加确实可以
但是如何释放对应的TComboBox呢?
就像我图片显示的那样。。。
还有,如何取消当前TComboBox的选定状态 ? 本帖最后由 SkyGz 于 2014-11-8 17:31 编辑
刚弄的...详见 示例代码,剩下的自由发辉
Type
TForm1 = Class(TForm)
CmdDel: TButton;
CmdAdd: TButton;
Edit1: TEdit;
CmdCreate: TButton;
Panel1: TPanel;
Procedure CmdCreateClick(Sender: TObject);
Procedure CmdAddClick(Sender: TObject);
Procedure CmdDelClick(Sender: TObject);
Private
cbParam: Array Of TComboBox;//定义 数组, 最大可创建10个
Procedure ItemAdd(Cb: TComboBox);
Function GetComboBoxCount: Integer;
Public
{ Public declarations }
End;
Var
Form1: TForm1;
Implementation
{$R *.dfm}
Procedure TForm1.ItemAdd(Cb: TComboBox);
Begin
Cb.Items.Add('1');
Cb.Items.Add('2');
Cb.Items.Add('3');
Cb.Items.Add('other');
End;
Procedure TForm1.CmdCreateClick(Sender: TObject);
Var
I, Max: Integer;
Begin
Max := StrToInt(Edit1.Text);
If Max > 10 Then Exit; //超出允许创建的, 取消
For I := 0 To Max - 1 Do
If Panel1.FindComponent('CbParam' + IntToStr(I)) = Nil Then //先判断 该名称的是否已创建有了
Begin
cbParam := TComboBox.Create(Panel1); //创建到Panel1里
cbParam.Parent := Panel1; //在 Panel1里
cbParam.Name := 'CbParam' + IntToStr(I); //命名
cbParam.Left := 10; //左边距
cbParam.Top := I * 25 + 10; //25为每个COMBOBOX的间距,+10是到 顶层边距
ItemAdd(cbParam);
cbParam.Style := csDropDownList;
cbParam.ItemIndex := 0;
End;
End;
Function TForm1.GetComboBoxCount: Integer;
Var //取当前Combobox总数
I: Integer;
Begin
Result := 0;
For I := 0 To Panel1.ComponentCount - 1 Do
If Panel1.Components Is TComboBox Then
Inc(Result);
End;
Procedure TForm1.CmdAddClick(Sender: TObject);
Var
CurID: Integer;
Begin
CurID := GetComboBoxCount;
If CurID >= 10 Then Exit; //超出设定的数量 不准再创建
cbParam := TComboBox.Create(Panel1); //创建到Panel1里
cbParam.Parent := Panel1; //在 Panel1里
cbParam.Name := 'CbParam' + IntToStr(CurID); //命名
cbParam.Left := 10; //左边距
If CurID = 0 Then
cbParam.Top := 10
Else
cbParam.Top := cbParam.Top + 25;
ItemAdd(cbParam);
cbParam.Style := csDropDownList;
cbParam.ItemIndex := 0;
End;
Procedure TForm1.CmdDelClick(Sender: TObject);
Var
CurID: Integer;
Begin
CurID := GetComboBoxCount;
If CurID = 0 Then Exit; //没有可释放的combobox
cbParam.Free; //释放
cbParam := Nil; //至NIL
End;
SkyGz 发表于 2014-11-8 17:23
刚弄的...详见 示例代码,剩下的自由发辉
非常感谢{:victory:}
delphi 7自带的控件我也实现了,但是用business skin 好像有问题,
就是当动态创建的控件被选中的时候,一执行Free就会报错。。
我来试试用你这个business skin 下能不能成功。。
执行Free就会报错的话,在Create的时候,不要用Create(Application)或Create(Self)之类,要用Create(nil),然后再用Parent
在Free之前,先把Parent指点为nil,再Free。 aleyn 发表于 2014-11-8 18:08
执行Free就会报错的话,在Create的时候,不要用Create(Application)或Create(Self)之类,要用Create(nil), ...
谢谢村长指导。。{:victory:}
页:
[1]