在列表框或组合框中使用字符串存储字符串(或对象)

Delphi的TListBox和TComboBox在“可选”列表中显示项目列表-字符串。TListBox显示可滚动列表,TComboBox显示下拉列表。...

Delphi的TListBox和TComboBox在“可选”列表中显示项目列表-字符串。TListBox显示可滚动列表,TComboBox显示下拉列表。

Programming language

上述所有控件的一个公共属性是Items属性。项定义将向用户显示在控件中的字符串列表。在设计时,双击Items属性时,“字符串列表编辑器”允许您指定字符串项。Items属性实际上是TStrings类型的子体。

列表框中每个项目两个字符串?

有些情况下,您希望向用户显示字符串列表,例如在列表框控件中,但也可以沿向用户显示的字符串存储一个附加字符串。

此外,您可能希望存储/附加的不仅仅是字符串中的“普通”字符串,还可能希望将对象附加到项目(字符串)。

listbox.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控件

为什么停在这里?正如您刚才所经历的,在列表框中为字符串指定字符串和整数是小菜一碟。

由于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) ;

注意:仅当您创建了指定给字符串项的对象时,才调用此过程。

  • 发表于 2021-09-20 09:19
  • 阅读 ( 168 )
  • 分类:编程

你可能感兴趣的文章

值类型(value type)和参考类型(reference type)的区别

...发出执行任务的指令。该程序可以操作包含数字、字符和字符串的数据,并向用户生成信息。用特定编程语言编写的一系列指令就是一个程序。在C#等编程语言中,有标记。它们是关键字、标识符、文字和运算符。存储数据的保...

  • 发布于 2020-10-19 07:42
  • 阅读 ( 504 )

如何在excel 2016中录制宏

...区”。在“自定义功能区”(Customize the Ribbon)列的下拉列表中,选中“开发人员”(Developer),然后单击“确定”(OK)。 ...

  • 发布于 2021-03-15 08:22
  • 阅读 ( 210 )

数组和列表在python中的工作方式

...数组的主要警告是,所有数据必须相同——不能存储混合字符串和整数。几乎总是需要指定要存储多少元素。可变大小或动态数组确实存在,但固定长度数组更容易开始。 ...

  • 发布于 2021-03-15 17:19
  • 阅读 ( 230 )

如何使用vba脚本从excel电子表格发送电子邮件

... 很酷的一点是,您可以创建任何字符串来定制完整的电子邮件消息,并将其分配给strBody变量。 ...

  • 发布于 2021-03-22 18:44
  • 阅读 ( 228 )

如何在microsoftword中查找和替换特殊字符

...”框将**点放在那里,然后单击“特殊”按钮。 从下拉列表中单击“节字符”。 请注意,“替换为”框现在包含文本“^%”—这是Word对该节符号的代码。单击“全部替换”按钮。在本例中,进行了16次替换。单击“确定”按钮...

  • 发布于 2021-04-03 09:51
  • 阅读 ( 161 )

在word 2016中搜索时如何使用通配符

...用星号?“sk”将查找“task”和“tusk”等词,以及搜索字符串只是“tasking”或“multitasker”等词的一部分的结果 但是如果你在像“”这样的搜索中标记一个单词的开头和结尾,结果将包括“task”和“tusk”,而不是其他的。 你...

  • 发布于 2021-04-05 01:37
  • 阅读 ( 156 )

如何判断哪个应用程序正在使用windows pc的网络摄像头

...到“查找”>“查找句柄”或“DLL”。 在“句柄或DLL子字符串”框中单击鼠标右键,然后选择“粘贴”以粘贴从设备管理器复制的设备对象名称。 点击“搜索”按钮。Process Explorer将搜索所有正在运行的进程,并显示当前使用...

  • 发布于 2021-04-08 11:00
  • 阅读 ( 177 )

数组列表(array list)和链表(linked list)的区别

...数组列表的样子–[name1,name2]。 链表创建: 列表<字符串>linkedlistsample=新建linkedList<字符串>(); 将对象添加到链表: Linkedlistsample.add(“name3”); Linkedlistsample.add(“name4”); 这就是结果链表的...

  • 发布于 2021-06-25 00:29
  • 阅读 ( 320 )

数组(array)和数组表(arraylist)的区别

...量。 例如: 公共类排列长度测试{ public static void main(字符串[]args){ ArrayList arrList=新建ArrayList(); String[]items={“一”,“二”,“三”}; for(字符串str:items){ arrList.add(str); } int size=items.size(); System.out.println(大小...

  • 发布于 2021-06-25 03:21
  • 阅读 ( 648 )

数组(array)和一串(string)的区别

...主要区别在于数组可以具有任何长度的任何数据类型,而字符串通常是以空字符“\0”结尾的ASCII字符。两者在不同编程语言中的实现方式都有很大的不同。数组和字符串在java中的工作方式与C++中的工作方式非常不同。本文介绍...

  • 发布于 2021-06-25 10:17
  • 阅读 ( 1389 )
taisjl
taisjl

0 篇文章

相关推荐