【发布时间】:2020-02-17 19:29:49
【问题描述】:
我想从特定行获取文本。
例如
列表框内容:
第 0 行字符串 1
第 1 行字符串 2
第 3 行字符串 3
每个示例如何从第 1 行获取文本?
我试试这个:
(listbox1.Items.Objects[1] as TText).Text
但是会产生随机访问冲突...
还有其他方法吗?
【问题讨论】:
标签: delphi freepascal
我想从特定行获取文本。
例如
列表框内容:
第 0 行字符串 1
第 1 行字符串 2
第 3 行字符串 3
每个示例如何从第 1 行获取文本?
我试试这个:
(listbox1.Items.Objects[1] as TText).Text
但是会产生随机访问冲突...
还有其他方法吗?
【问题讨论】:
标签: delphi freepascal
假设它们存在,
ListBox.Items[0] 是列表框中的第一个字符串。ListBox.Items[1] 是列表框中的第二个字符串。ListBox.Items[ListBox.Items.Count - 1] 是列表框中的最后一个字符串。而不是
ListBox.Items[i]
你也可以使用
ListBox.Items.Strings[i]
但要输入更多内容。
(TStrings.Strings 属性显然是一个数组属性,因为它被声明为"default",所以可以使用对象本身的括号来访问它。)
奖励材料:您尝试的Objects 数组属性偶尔用于将对象(指针)与列表中的每个项目相关联。 (有时它被滥用来存储不是对象的本机大小整数,每个项目仍然一个。)
【讨论】:
Items.Lines[0] - Access element 0 (first string) of Lines array -- for Kylix
Items.Strings[0] - Access element 0 (first string) of Strings array -- for VCL/FMX
AV 会在您尝试访问内存时生成,该内存不可用,因此,换句话说,delphi 没有对访问程序内存(二进制数据)进行类型检查,并且会导致范围广泛的未处理错误,例如错误类型错误和 NullPointer 异常,但是可以在不修改内存例程(编写其他类型定义以提供检查)的情况下处理指针,可以通过与 Pascal 实现中的 nil 或 Assembler 中的 CMP func 进行比较来检查指针。
有关此的更多信息:
每个变量、常数,当然还有方法,在执行过程中,都存储在计算机内存(RAM)中,在它自己的领域中,由处理器(CPU)提供给程序,并受到集成在主板上的逻辑的限制,所以它是无法写入其他程序内存。
大多数数据类型都有自己的字节对齐方式(特定于存储 0 和 1,但是,当类型不仅仅是一个字节时,它会被扩展以包含类型信息)来知道它是否包含正确的二进制数据,例如字符串、对象和记录。
当类存储用于控制函数和过程调用的实际类型名称时,字符串将其自己的长度和编码存储在其内容的字节表示中。
但是,delphi Pascal 似乎在指定数据地址后立即访问内存,没有对其内容进行任何检查,因此在访问未指定类型的情况下将导致返回随机值 - 类型,没有扩展类型信息(例如作为不同的整数类型)和 AV 在访问指定类型的情况下。
请记住检查所有指针类型(通常它们从 P 字母开始,例如 PAnsiChar)是否包含其中的内容:
方式:
// Assigned function
if Assigned(pvar) then
DoSomething();
// = nil comparision / equation
if pvar <> nil then
DoSomething()
Else
Exit;
【讨论】:
TStrings.Lines 不存在。也许您正在考虑TMemo 控件,其TStrings 实例被称为Lines 而不是Items? (例如:Memo1.Lines[0] 和 ListBox1.Items[0] 分别表示 Memo1.Lines.Strings[0] 和 ListBox1.Items.Strings[0]。)