`
zhmocean
  • 浏览: 202398 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

TComboBox的Items属性赋值解析

 
阅读更多

一般情况下对象类型作为参数传递时,传递的类型为引用型。因此,当对传入的参数执行Free时,该对象将被从内存清除。那么所有对它的引用将失效

但最近在写TComboBox相关的赋值操作时却发现,TComboBox的Items属性为TStrings类型,但执行
combobox.items := stringlist;
之后free掉stringlist,发现TComboBox的Items并没有被free掉,而是保持了原来的数据。

因此,我们可以想到在TComboBox的Items赋值操作中有一个数据复制机制,而不是简单的将引用赋值给Items属性。

打开stdCtrls单元,找到TCustomCombo的Items定义位置(TComboBox继承自TCustomCombo,其Items属性在TCustomCombo实现),我们发现下面一条语句:

property Items: TStrings read FItems write SetItems;

嗯,果然有一个SetItems,我们一起来看一下这个函数的实现,真相大白:

procedure TCustomCombo.SetItems(const Value: TStrings);
begin
  if Assigned(FItems) then
    FItems.Assign(Value)
  else
    FItems := Value;
end;

SetItems函数使用了其父类TPersistent的Assign函数来实现数据赋值,而只有在FItems成员为nil时才会复制引用,那么TComboBox必定在创建之时创建了FItems成员

为了验证这点,因为TComboBox仅仅是将TCustomComboBox封装成标准的VCL控件,本身并没有代码实现,因此,我们找到了TComboBox的直接父类TCustomComboBox,在它的Create函数中有这么一句:

FItems := GetItemsClass.Create;

这里VCL使用了一个技巧(此技巧在VCL Framework中大量出现),用GetItemsClass返回类对象,然后用其创建对象。

由此我们可以看到,FItems确实是在TComboBox创建的时候被初始化了,因此,只要没有去显式的free它,Items属性的赋值操作均为数据复制。

到此也找到了上述看似奇怪的问题。

VCL Framework中使用了大量的技巧以保证其高度的灵活性和极高的执行效率,多多深入研究VCL的实现方法对我们的设计思想大有帮助。

分享到:
评论

相关推荐

    TComboBox模拟IE地址栏

    3. 将TDBComboBox的DataSource属性设置为TDataSource,这样它的Items就会根据数据库内容动态填充。 4. 当用户在TComboBox中输入时,可以通过OnChange事件触发数据库查询,找到匹配的条目,并更新下拉列表。 "避免了...

    用Delphi实现自定义颜色对话框及其构件

    3. 双击 ColorCombo1 和 ColorCombo2 的 Items 属性旁的圆点按钮,在"String List Editor" 对话框中输入各种颜色的名称。 4. 在 ColorCombo1 的 OnDrawItem 事件中添加代码,以自画颜色项。 在自画过程中,我们可以...

    TComboBox模仿IE地址栏

    解决这个问题可能涉及到调整控件的属性设置,例如调整Focus事件或者MouseLeave事件的处理,确保鼠标指针的正常显示。 文件列表中的`.cfg`、`.dcu`、`.ddp`、`.dfm`、`.dof`、`.dpr`、`.mdb`、`.pas`和`.res`文件...

    Delphi为TListbox控件和TCombobox控件增加搜索功能.rar

    Delphi为TListbox控件和TCombobox控件增加搜索功能,使其具备输入提示功能,用起来更人性化,功能更完备。在右边输入一字符,左侧会自动出现匹配的字符串,本搜索是在TListbox、TCombobox控件中实现的,若想自己添加...

    Delphi7StringGrid内动态添加ComBoBox的值

    在程序运行时,我们需要创建一个新的TComboBox对象,然后设置它的属性,如Items(下拉列表项)和Style(决定ComboBox的样式,例如下拉列表或简单列表)。例如: ```delphi var ComboBox: TComboBox; begin ...

    《Delphi7组件经典解析》.7z

    3. **VCL组件库**:深入解析VCL中的主要组件,如TForm、TButton、TLabel、TMemo、TListBox、TComboBox等,包括它们的属性、方法和事件。 4. **数据库组件**:详细阐述ADO(ActiveX Data Objects)和BDE(Borland ...

    Delphi在stringGrid控件中嵌入Combobox下拉框

    StringGrid1.Cells[1, 2] := TComboBox(Sender).Items[TComboBox(Sender).ItemIndex]; // 更新单元格值 end; ``` 这个例子展示了如何在特定单元格(这里是第2行第2列)嵌入一个Combobox,并在用户选择后更新单元格...

    delphi7实现 combobox下拉hint.

    这可以通过遍历`Items`集合并在`TObject`对象中添加自定义属性来实现。 ```delphi procedure TForm1.FormCreate(Sender: TObject); var I: Integer; begin for I := 0 to ComboBox1.Items.Count - 1 do ...

    delphi中如何解决Combobox删除字符时出现乱码

    2. **控件属性设置**:Combobox的`Items`属性存储了下拉列表中的文字,如果在设置或读取`Items`时未正确处理编码,可能会出现乱码。确保在操作`Items`时使用正确的字符串类,如UnicodeString或WideString。 3. **...

    Delphi数据库开发经典案例解析-图书馆管理系统

    《Delphi数据库开发经典案例解析-图书馆管理系统》是针对Delphi编程语言在数据库应用领域的一份详实教程,尤其关注于构建图书馆管理系统的实践过程。本案例深入剖析了如何利用Delphi的强大功能来设计和实现一个高效...

    vcl高级组合框

    你可以通过Items属性添加、删除或修改列表项。 2. Text:获取或设置当前选中的文本内容,即编辑框显示的文字。 3. ItemIndex:返回或设置当前选中的列表项的索引。索引从0开始。 4. DropDownCount:设置或获取下拉...

    C++ Builder 中的自画功能

    ((TComboBox*)Control)->Canvas->TextOut(Rect.Left + 20, Rect.Top + 2, ((TComboBox*)Control)->Items->Strings[Index]); // 标记当前鼠标所在项(焦点项) if (State.Contains(odFocused)) { ((TComboBox*)...

    ComboBox控件

    vs2008只有winform用的comboBox控件,该控件可用于web应用程序项目,复制到bin文件夹,工具箱中添加即可,默认为dropdownlist,修改RenderMode为ComboBox即可(注:非本人开发,转发方便大家共享,同时作赚米用)

    (九)delphi自定义控件属性编辑

    3. 创建属性编辑器的UI:可以创建一个自定义的对话框或者使用标准的编辑器组件,如TEdit、TComboBox等,来显示和编辑属性值。 4. 集成到属性浏览器:通过TPropertyEditor类的属性和方法,确保自定义编辑器在属性...

    delphi 下拉菜单code

    或者在设计时,在Items属性中直接输入多个选项,每个选项之间用回车分隔。 4. **事件处理** - `OnChange`事件:当用户从列表中选择一个新项时触发,可以用于更新程序状态。 - `OnSelect`事件:在某些版本的...

    c++builder组件大全part03

    它们都有Items属性,可以添加和管理子项,OnClick事件处理单击操作。 TMenuBar和TMenuItem用于创建菜单系统,TMenuItem可以设置文本、快捷键、图标以及关联的事件处理函数。TMemo组件提供多行文本编辑,支持滚动和...

    Delphi成绩表打印

    ComboBox1: TComboBox; Button1: TButton; Button2: TButton; Button3: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: T...

    用Delphi实现百度下拉框例子(下拉内容来至数据库)

    在实现过程中,开发者可能会使用TADOQuery或TTable组件来连接和查询数据库,然后通过OnDataChange或OnUpdateData事件将查询结果填充到TComboBox的Items集合中。数据库连接字符串、查询语句以及数据绑定的设置都在...

    delphi7 combox重要补丁

    通常包含控件的位置、大小、属性等信息,方便用户直观地查看补丁效果。 4. `PatchDemo.dpr`:这是Delphi项目文件,包含了整个补丁程序的入口点和主要配置。开发者可以通过这个文件来编译和运行补丁示例。 5. `...

    delphi画图案列

    3. **线条样式**:线条的宽度可以通过`Pen.Width`属性来设定,颜色通过`Pen.Color`来设置。例如,`Canvas.Pen.Width := 5; Canvas.Pen.Color := clBlue;`将线条宽度设为5,颜色设为蓝色。 4. **事件处理**:为了...

Global site tag (gtag.js) - Google Analytics