【问题标题】:How do get the text from specific line in listbox delphi如何从列表框delphi中的特定行获取文本
【发布时间】:2020-02-17 19:29:49
【问题描述】:

我想从特定行获取文本。

例如

列表框内容:

第 0 行字符串 1

第 1 行字符串 2

第 3 行字符串 3

每个示例如何从第 1 行获取文本?

我试试这个:

(listbox1.Items.Objects[1] as TText).Text

但是会产生随机访问冲突...

还有其他方法吗?

【问题讨论】:

    标签: delphi freepascal


    【解决方案1】:

    假设它们存在,

    • ListBox.Items[0] 是列表框中的第一个字符串。
    • ListBox.Items[1] 是列表框中的第二个字符串。
    • ...
    • ListBox.Items[ListBox.Items.Count - 1] 是列表框中的最后一个字符串。

    而不是

    ListBox.Items[i]
    

    你也可以使用

    ListBox.Items.Strings[i]
    

    但要输入更多内容。

    TStrings.Strings 属性显然是一个数组属性,因为它被声明为"default",所以可以使用对象本身的括号来访问它。)


    奖励材料:您尝试的Objects 数组属性偶尔用于将对象(指针)与列表中的每个项目相关联。 (有时它被滥用来存储不是对象的本机大小整数,每个项目仍然一个。)

    【讨论】:

      【解决方案2】:
      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;
      

      【讨论】:

      • 虽然此代码可能会为问题提供解决方案,但最好添加有关其工作原理/方式的上下文。这可以帮助未来的用户学习并将这些知识应用到他们自己的代码中。在解释代码时,您也可能会以赞成票的形式从用户那里获得积极的反馈。
      • 至少在 Delphi 中,TStrings.Lines 不存在。也许您正在考虑TMemo 控件,其TStrings 实例被称为Lines 而不是Items? (例如:Memo1.Lines[0]ListBox1.Items[0] 分别表示 Memo1.Lines.Strings[0]ListBox1.Items.Strings[0]。)
      • @AndreasRejbrand Kylix 具体。我更喜欢文字简短。
      猜你喜欢
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 2012-05-19
      • 2019-08-21
      • 2012-11-15
      • 1970-01-01
      • 2021-05-09
      相关资源
      最近更新 更多