一般情况下对象类型作为参数传递时,传递的类型为引用型。因此,当对传入的参数执行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的实现方法对我们的设计思想大有帮助。
分享到:
相关推荐
3. 将TDBComboBox的DataSource属性设置为TDataSource,这样它的Items就会根据数据库内容动态填充。 4. 当用户在TComboBox中输入时,可以通过OnChange事件触发数据库查询,找到匹配的条目,并更新下拉列表。 "避免了...
3. 双击 ColorCombo1 和 ColorCombo2 的 Items 属性旁的圆点按钮,在"String List Editor" 对话框中输入各种颜色的名称。 4. 在 ColorCombo1 的 OnDrawItem 事件中添加代码,以自画颜色项。 在自画过程中,我们可以...
解决这个问题可能涉及到调整控件的属性设置,例如调整Focus事件或者MouseLeave事件的处理,确保鼠标指针的正常显示。 文件列表中的`.cfg`、`.dcu`、`.ddp`、`.dfm`、`.dof`、`.dpr`、`.mdb`、`.pas`和`.res`文件...
Delphi为TListbox控件和TCombobox控件增加搜索功能,使其具备输入提示功能,用起来更人性化,功能更完备。在右边输入一字符,左侧会自动出现匹配的字符串,本搜索是在TListbox、TCombobox控件中实现的,若想自己添加...
在程序运行时,我们需要创建一个新的TComboBox对象,然后设置它的属性,如Items(下拉列表项)和Style(决定ComboBox的样式,例如下拉列表或简单列表)。例如: ```delphi var ComboBox: TComboBox; begin ...
3. **VCL组件库**:深入解析VCL中的主要组件,如TForm、TButton、TLabel、TMemo、TListBox、TComboBox等,包括它们的属性、方法和事件。 4. **数据库组件**:详细阐述ADO(ActiveX Data Objects)和BDE(Borland ...
StringGrid1.Cells[1, 2] := TComboBox(Sender).Items[TComboBox(Sender).ItemIndex]; // 更新单元格值 end; ``` 这个例子展示了如何在特定单元格(这里是第2行第2列)嵌入一个Combobox,并在用户选择后更新单元格...
这可以通过遍历`Items`集合并在`TObject`对象中添加自定义属性来实现。 ```delphi procedure TForm1.FormCreate(Sender: TObject); var I: Integer; begin for I := 0 to ComboBox1.Items.Count - 1 do ...
2. **控件属性设置**:Combobox的`Items`属性存储了下拉列表中的文字,如果在设置或读取`Items`时未正确处理编码,可能会出现乱码。确保在操作`Items`时使用正确的字符串类,如UnicodeString或WideString。 3. **...
《Delphi数据库开发经典案例解析-图书馆管理系统》是针对Delphi编程语言在数据库应用领域的一份详实教程,尤其关注于构建图书馆管理系统的实践过程。本案例深入剖析了如何利用Delphi的强大功能来设计和实现一个高效...
你可以通过Items属性添加、删除或修改列表项。 2. Text:获取或设置当前选中的文本内容,即编辑框显示的文字。 3. ItemIndex:返回或设置当前选中的列表项的索引。索引从0开始。 4. DropDownCount:设置或获取下拉...
((TComboBox*)Control)->Canvas->TextOut(Rect.Left + 20, Rect.Top + 2, ((TComboBox*)Control)->Items->Strings[Index]); // 标记当前鼠标所在项(焦点项) if (State.Contains(odFocused)) { ((TComboBox*)...
vs2008只有winform用的comboBox控件,该控件可用于web应用程序项目,复制到bin文件夹,工具箱中添加即可,默认为dropdownlist,修改RenderMode为ComboBox即可(注:非本人开发,转发方便大家共享,同时作赚米用)
3. 创建属性编辑器的UI:可以创建一个自定义的对话框或者使用标准的编辑器组件,如TEdit、TComboBox等,来显示和编辑属性值。 4. 集成到属性浏览器:通过TPropertyEditor类的属性和方法,确保自定义编辑器在属性...
或者在设计时,在Items属性中直接输入多个选项,每个选项之间用回车分隔。 4. **事件处理** - `OnChange`事件:当用户从列表中选择一个新项时触发,可以用于更新程序状态。 - `OnSelect`事件:在某些版本的...
它们都有Items属性,可以添加和管理子项,OnClick事件处理单击操作。 TMenuBar和TMenuItem用于创建菜单系统,TMenuItem可以设置文本、快捷键、图标以及关联的事件处理函数。TMemo组件提供多行文本编辑,支持滚动和...
ComboBox1: TComboBox; Button1: TButton; Button2: TButton; Button3: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: T...
在实现过程中,开发者可能会使用TADOQuery或TTable组件来连接和查询数据库,然后通过OnDataChange或OnUpdateData事件将查询结果填充到TComboBox的Items集合中。数据库连接字符串、查询语句以及数据绑定的设置都在...
通常包含控件的位置、大小、属性等信息,方便用户直观地查看补丁效果。 4. `PatchDemo.dpr`:这是Delphi项目文件,包含了整个补丁程序的入口点和主要配置。开发者可以通过这个文件来编译和运行补丁示例。 5. `...
3. **线条样式**:线条的宽度可以通过`Pen.Width`属性来设定,颜色通过`Pen.Color`来设置。例如,`Canvas.Pen.Width := 5; Canvas.Pen.Color := clBlue;`将线条宽度设为5,颜色设为蓝色。 4. **事件处理**:为了...