搜索
bottom↓
回复: 18

呼叫村长和各位delphi大婶,如何动态创建和释放多个TComboBox?

[复制链接]

出0入0汤圆

发表于 2014-11-8 10:53:36 | 显示全部楼层 |阅读模式
本帖最后由 motoedy 于 2014-11-8 15:16 编辑

delphi的新手,想写些自用的小软件,
经常遇到一些属性相同的东西,想动态创建
度娘出一个动态创建和释放tedit的方法,
http://www.cnblogs.com/Bung/archive/2011/09/17/2179463.html

但是用在TComboBox上好像不好使。。

想要这样的效果:



呼叫村长和各位delphi大婶,如何动态创建和释放多个TComboBox?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
头像被屏蔽

出0入0汤圆

发表于 2014-11-8 11:09:19 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

 楼主| 发表于 2014-11-8 11:23:29 | 显示全部楼层
csaaa 发表于 2014-11-8 11:09
with TComboBox.Create(self) do begin
parent:=Self;  //注意这个
top:=100;

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

出0入0汤圆

发表于 2014-11-8 11:39:22 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

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

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

出0入0汤圆

发表于 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).

出0入0汤圆

 楼主| 发表于 2014-11-8 14:54:48 | 显示全部楼层
ysoni 发表于 2014-11-8 14:49
with TComboBox.Create(nil) do
try
  parent:=Self;  //注意这个

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

出0入0汤圆

发表于 2014-11-8 14:56:32 | 显示全部楼层
这都给出了一个的例子。 多个照做就是了。

出0入0汤圆

 楼主| 发表于 2014-11-8 15:16:19 | 显示全部楼层
ysoni 发表于 2014-11-8 14:56
这都给出了一个的例子。 多个照做就是了。

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

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

想要的是这种效果


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-11-8 15:37:25 | 显示全部楼层
ysoni 发表于 2014-11-8 14:49
var
   cb: TComboBox;
begin

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

出0入4汤圆

发表于 2014-11-8 16:08:50 | 显示全部楼层
2楼的可以,照做或加点楼主你自己的需求就可以了。

出0入0汤圆

 楼主| 发表于 2014-11-8 16:20:28 | 显示全部楼层
aleyn 发表于 2014-11-8 16:08
2楼的可以,照做或加点楼主你自己的需求就可以了。

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

还有,如何取消当前TComboBox的选定状态 ?
头像被屏蔽

出0入0汤圆

发表于 2014-11-8 16:25:27 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
头像被屏蔽

出0入0汤圆

发表于 2014-11-8 16:26:58 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入70汤圆

发表于 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[0..9] 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[I] := TComboBox.Create(Panel1); //创建到Panel1里
      cbParam[I].Parent := Panel1;      //在 Panel1里
      cbParam[I].Name := 'CbParam' + IntToStr(I); //命名
      cbParam[I].Left := 10;            //左边距
      cbParam[I].Top := I * 25 + 10;    //25为每个COMBOBOX的间距,  +10是到 顶层边距
      ItemAdd(cbParam[I]);
      cbParam[I].Style := csDropDownList;
      cbParam[I].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[I] Is TComboBox Then
      Inc(Result);
End;

Procedure TForm1.CmdAddClick(Sender: TObject);
Var
  CurID: Integer;
Begin
  CurID := GetComboBoxCount;
  If CurID >= 10 Then Exit;             //超出设定的数量 不准再创建
  cbParam[CurID] := TComboBox.Create(Panel1); //创建到Panel1里
  cbParam[CurID].Parent := Panel1;      //在 Panel1里
  cbParam[CurID].Name := 'CbParam' + IntToStr(CurID); //命名
  cbParam[CurID].Left := 10;            //左边距
  If CurID = 0 Then
    cbParam[CurID].Top := 10
  Else
    cbParam[CurID].Top := cbParam[CurID - 1].Top + 25;
  ItemAdd(cbParam[CurID]);
  cbParam[CurID].Style := csDropDownList;
  cbParam[CurID].ItemIndex := 0;
End;

Procedure TForm1.CmdDelClick(Sender: TObject);
Var
  CurID: Integer;
Begin
  CurID := GetComboBoxCount;
  If CurID = 0 Then Exit;               //没有可释放的combobox
  cbParam[CurID - 1].Free;              //释放
  cbParam[CurID - 1] := Nil;            //至NIL
End;

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-11-8 17:39:21 | 显示全部楼层
SkyGz 发表于 2014-11-8 17:23
刚弄的...详见 示例代码,  剩下的自由发辉

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

出0入4汤圆

发表于 2014-11-8 18:08:16 | 显示全部楼层
执行Free就会报错的话,在Create的时候,不要用Create(Application)或Create(Self)之类,要用Create(nil),然后再用Parent
在Free之前,先把Parent指点为nil,再Free。

出0入0汤圆

 楼主| 发表于 2014-11-10 07:44:27 | 显示全部楼层
aleyn 发表于 2014-11-8 18:08
执行Free就会报错的话,在Create的时候,不要用Create(Application)或Create(Self)之类,要用Create(nil), ...

谢谢村长指导。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 21:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表