Delphi的TListBox和TComboBox在“可选”列表中显示项目列表-字符串。TListBox显示可滚动列表,TComboBox显示下拉列表。
上述所有控件的一个公共属性是Items属性。项定义将向用户显示在控件中的字符串列表。在设计时,双击Items属性时,“字符串列表编辑器”允许您指定字符串项。Items属性实际上是TStrings类型的子体。
有些情况下,您希望向用户显示字符串列表,例如在列表框控件中,但也可以沿向用户显示的字符串存储一个附加字符串。
此外,您可能希望存储/附加的不仅仅是字符串中的“普通”字符串,还可能希望将对象附加到项目(字符串)。
在帮助系统中再次查看TStrings对象。有一个Objects属性,它表示一组与strings属性中的每个字符串关联的对象,其中strings属性引用列表中的实际字符串。
如果要为列表框中的每个字符串指定第二个字符串(或对象),则需要在运行时填充Items属性。
虽然可以使用ListBox.Items.Add方法将字符串添加到列表中,但要将对象与每个字符串关联,需要使用另一种方法。
ListBox.Items.AddObject方法接受两个参数。第一个参数“Item”是项的文本。第二个参数“AOObject”是与该项关联的对象。
请注意,列表框公开了AddItem方法,其作用与Items.AddObject相同。
由于Items.AddObject和AddItem都接受TObject类型的变量作为其第二个参数,因此如下所示:
//compile error! ListBox1.Items.AddObject('zarko', 'gajic');将导致编译错误:E2010不兼容类型:“TObject”和“string”。
您不能简单地为对象提供字符串,因为在Delphi for Win32中,字符串值不是对象。
要将第二个字符串分配给列表框项,您需要将字符串变量“转换”为对象—您需要一个自定义的TString对象。
如果需要与字符串项一起存储的第二个值是整数值,则实际上不需要自定义TInteger类。
ListBox1.AddItem('Zarko Gajic', TObject(1973)) ;上面的行存储整数“1973”以及添加的“Zarko Gajic”字符串。
上面进行了从整数到对象的直接类型转换。“AOObject”参数实际上是添加的对象的4字节指针(地址)。因为在Win32中,整数占用4个字节-这样的强制转换是可能的。
要获取与字符串关联的整数,需要将“对象”强制转换回整数值:
//year == 1973 year := Integer(ListBox1.Items.Objects[ListBox1.Items.IndexOf('Zarko Gajic')]) ;为什么停在这里?正如您刚才所经历的,在列表框中为字符串指定字符串和整数是小菜一碟。
由于Delphi控件实际上是对象,因此可以将控件附加到列表框中显示的每个字符串。
下面的代码将添加到表单上所有TButton控件的ListBox1(列表框)标题(将其放置在表单的OnCreate事件处理程序中)以及对每个按钮的引用。
var idx : integer; begin for idx := 0 to -1 + ComponentCount do begin if Components[idx] is TButton then ListBox1.AddObject(TButton(Components[idx]).Caption, Components[idx]) ; end; end;要以编程方式“单击”第二个按钮,可以使用以下语句:
TButton(ListBox1.Items.Objects[1]).Click;在更一般的情况下,您可以添加自己自定义类的实例(对象):
type TStudent = class private fName: string; fYear: integer; public property Name : string read fName; property Year : integer read fYear; constructor Create(const name : string; const year : integer) ; end; ........ constructor TStudent.Create(const name : string; const year : integer) ; begin fName := name; fYear := year; end; -------- begin //add two string/objects -> students to the list ListBox1.AddItem('John', TStudent.Create('John', 1970)) ; ListBox1.AddItem('Jack', TStudent.Create('Jack', 1982)) ; //grab the first student - John student := ListBox1.Items.Objects[0] as TStudent; //display John's year ShowMessage(IntToStr(student.Year)) ; end;下面是关于TStrings子体中对象的帮助说明:TStrings对象不拥有您以这种方式添加的对象。即使TStrings实例被销毁,添加到TStrings对象的对象仍然存在。应用程序必须显式销毁它们。
将对象添加到字符串(创建的对象)时,必须确保释放占用的内存,否则会出现内存泄漏
通用自定义过程FreeObjects接受TStrings类型的变量作为其唯一参数。FreeObjects将释放与上面示例中字符串列表中的项目关联的任何对象,“学生”(TStudent类)附加到列表框中的字符串,当应用程序即将关闭时(例如,主窗体OnDestroy事件),您需要释放占用的内存:
FreeObjects(ListBox1.Items) ;注意:仅当您创建了指定给字符串项的对象时,才调用此过程。
...发出执行任务的指令。该程序可以操作包含数字、字符和字符串的数据,并向用户生成信息。用特定编程语言编写的一系列指令就是一个程序。在C#等编程语言中,有标记。它们是关键字、标识符、文字和运算符。存储数据的保...
...区”。在“自定义功能区”(Customize the Ribbon)列的下拉列表中,选中“开发人员”(Developer),然后单击“确定”(OK)。 ...
...数组的主要警告是,所有数据必须相同——不能存储混合字符串和整数。几乎总是需要指定要存储多少元素。可变大小或动态数组确实存在,但固定长度数组更容易开始。 ...
... 很酷的一点是,您可以创建任何字符串来定制完整的电子邮件消息,并将其分配给strBody变量。 ...
...”框将**点放在那里,然后单击“特殊”按钮。 从下拉列表中单击“节字符”。 请注意,“替换为”框现在包含文本“^%”—这是Word对该节符号的代码。单击“全部替换”按钮。在本例中,进行了16次替换。单击“确定”按钮...
...用星号?“sk”将查找“task”和“tusk”等词,以及搜索字符串只是“tasking”或“multitasker”等词的一部分的结果 但是如果你在像“”这样的搜索中标记一个单词的开头和结尾,结果将包括“task”和“tusk”,而不是其他的。 你...
...到“查找”>“查找句柄”或“DLL”。 在“句柄或DLL子字符串”框中单击鼠标右键,然后选择“粘贴”以粘贴从设备管理器复制的设备对象名称。 点击“搜索”按钮。Process Explorer将搜索所有正在运行的进程,并显示当前使用...
...数组列表的样子–[name1,name2]。 链表创建: 列表<字符串>linkedlistsample=新建linkedList<字符串>(); 将对象添加到链表: Linkedlistsample.add(“name3”); Linkedlistsample.add(“name4”); 这就是结果链表的...
...量。 例如: 公共类排列长度测试{ public static void main(字符串[]args){ ArrayList arrList=新建ArrayList(); String[]items={“一”,“二”,“三”}; for(字符串str:items){ arrList.add(str); } int size=items.size(); System.out.println(大小...
...主要区别在于数组可以具有任何长度的任何数据类型,而字符串通常是以空字符“\0”结尾的ASCII字符。两者在不同编程语言中的实现方式都有很大的不同。数组和字符串在java中的工作方式与C++中的工作方式非常不同。本文介绍...