motoedy 发表于 2014-11-8 10:53:36

呼叫村长和各位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:19

motoedy 发表于 2014-11-8 11:23:29

csaaa 发表于 2014-11-8 11:09
with TComboBox.Create(self) do begin
parent:=Self;//注意这个
top:=100;


这个是父容器定义吧,不一定是self吧。
可以是其他控件吧,但是还是不好使。。

csaaa 发表于 2014-11-8 11:39:22

motoedy 发表于 2014-11-8 14:09:58

csaaa 发表于 2014-11-8 11:39
定义他的parentcontrol是谁,主要是为了item用的否则可以不用定义。在delphi2005下测试通过。不相信可以截 ...

能给个动态创建和释放多个TComboBox的demo么?
我还是搞不定。。

ysoni 发表于 2014-11-8 14:49:48

本帖最后由 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).

motoedy 发表于 2014-11-8 14:54:48

ysoni 发表于 2014-11-8 14:49
with TComboBox.Create(nil) do
try
parent:=Self;//注意这个


我是想动态创建和释放多个TComboBox。
不是动态创建一个。

ysoni 发表于 2014-11-8 14:56:32

这都给出了一个的例子。 多个照做就是了。

motoedy 发表于 2014-11-8 15:16:19

ysoni 发表于 2014-11-8 14:56
这都给出了一个的例子。 多个照做就是了。

我要的是这种效果。。
多个动态生成多个还是百思不得姐啊。。{:dizzy:}

motoedy 发表于 2014-11-8 15:18:21

csaaa 发表于 2014-11-8 11:39
定义他的parentcontrol是谁,主要是为了item用的否则可以不用定义。在delphi2005下测试通过。不相信可以截 ...

想要的是这种效果


motoedy 发表于 2014-11-8 15:37:25

ysoni 发表于 2014-11-8 14:49
var
   cb: TComboBox;
begin


试了下你的代码
会报错没有指定Parent。

aleyn 发表于 2014-11-8 16:08:50

2楼的可以,照做或加点楼主你自己的需求就可以了。

motoedy 发表于 2014-11-8 16:20:28

aleyn 发表于 2014-11-8 16:08
2楼的可以,照做或加点楼主你自己的需求就可以了。

添加确实可以
但是如何释放对应的TComboBox呢?
就像我图片显示的那样。。。

还有,如何取消当前TComboBox的选定状态 ?

csaaa 发表于 2014-11-8 16:25:27

csaaa 发表于 2014-11-8 16:26:58

SkyGz 发表于 2014-11-8 17:23:45

本帖最后由 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;

motoedy 发表于 2014-11-8 17:39:21

SkyGz 发表于 2014-11-8 17:23
刚弄的...详见 示例代码,剩下的自由发辉




非常感谢{:victory:}
delphi 7自带的控件我也实现了,但是用business skin 好像有问题,
就是当动态创建的控件被选中的时候,一执行Free就会报错。。
我来试试用你这个business skin 下能不能成功。。

aleyn 发表于 2014-11-8 18:08:16

执行Free就会报错的话,在Create的时候,不要用Create(Application)或Create(Self)之类,要用Create(nil),然后再用Parent
在Free之前,先把Parent指点为nil,再Free。

motoedy 发表于 2014-11-10 07:44:27

aleyn 发表于 2014-11-8 18:08
执行Free就会报错的话,在Create的时候,不要用Create(Application)或Create(Self)之类,要用Create(nil), ...

谢谢村长指导。。{:victory:}
页: [1]
查看完整版本: 呼叫村长和各位delphi大婶,如何动态创建和释放多个TComboBox?