`
explorer
  • 浏览: 95976 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

TStringList实例调用AddStrings 跟踪

 
阅读更多

创建了一个TStringList的实例并调用AddStrings,企图将ListBox1的所有Items加入sList实例(sList.AddStrings(ListBox1.Items))。 开始以为VCL 处理有瑕疵,后发现环节都正确。

 

 

分析过程如下:

 

1.  观察Classes单元的TStrings.AddStrings(Strings: TStrings)的方法,其中有一句:AddObject(Strings[I], Strings.Objects[I]);

 

2.  走到了从源Strings的Get、GetObject方法

 

3.  因为ListBox的Items实例是这样创建的:  FItems := TListBoxStrings.Create; 所以 源Strings的GetObject方法走到了这里:TListBoxStrings.GetObject

 

4. StdCtrls单元中,关于TListBoxStrings类两个重要方法如下:

 

function TListBoxStrings.GetObject(Index: Integer): TObject;
...
    Result := TObject(ListBox.GetItemData(Index));
    if Longint(Result) = LB_ERR then Error(SListIndexError, Index);

 

 

function TListBoxStrings.Add(const S: string): Integer;
...
  Result := SendMessage(ListBox.Handle, LB_ADDSTRING, 0, Longint(PChar(S)));

 

 

5.  可以看出TListBoxStrings继承自TStrings,但是存储String、Object等均是根据 ListBox的句柄调用了Windows平台提供的LB_ADDSTRING、LB_GETITEMDATA 等消息

 

6.  因TListBoxStrings.GetObject 的思路是:如果返回值是 LB_ERR (-1 )就抛出异常

 

7.  应用中ListBox是这样:ListBox1.Items.AddStrings(sList) 载入的,在VCL的曲折实现中依次经过 TStrings.AddObject  -> TStrings.PutObject -> TListBoxStrings.PutObject  -> TCustomListBox.SetItemData -> Windows 的SendMessage LB_SETITEMDATA,并且nil 作为lParam 即Data传入给 ListBox的实例

 

8.  nil 空指针值为0, LB_ERR值为 -1, 不是导致问题的原因,猜想错误。

 

 

 

 

 

分享到:
评论

相关推荐

    TStringslist.strings用法实例

    本文将详细探讨`TStringList`的`strings`属性以及相关的使用实例。 `TStringList`是`System.Classes`单元中的一个类,它提供了对字符串列表的操作,包括添加、删除、查找、排序等功能。`strings`属性是`TStringList...

    通过TStringList分割字符串

    1. 创建一个`TStringList`实例,如`var StringList: TStringList;`。 2. 调用`StringList.Split`方法,传入Edit组件中的字符串和分隔符,如`StringList.Split(Edit1.Text, ';')`。这会将Edit中的字符串按分号分割,...

    TStringList数据排序程序

    在编程领域,特别是使用Delphi或C++Builder等基于VCL(Visual Component Library)框架的开发环境中,`TStringList` 是一个非常常用的组件。...同时,记得在操作完成后释放`TStringList`实例,遵循良好的内存管理习惯。

    Delphi中-TStringList-的详细用法.doc

    从上面的代码可以看到,我们首先创建了一个 TStringList 对象,然后使用 Add 方法添加字符串,使用 Exchange 方法交换两个字符串,使用 Insert 方法插入字符串,使用 IndexOf 方法获取字符串的索引,使用 Sort 方法...

    TStringList常用属性及方法

    `TStringList`可以通过`Create`方法来创建实例。例如: ```pascal var List: TStringList; begin List := TStringList.Create; ``` 这行代码创建了一个名为`List`的`TStringList`对象。 #### 三、添加与插入元素 ...

    TStringList 排序

    当调用`CustomSort`方法时,将这个比较函数作为参数传入: ```delphi StringList.CustomSort(@CompareByLength); ``` 现在,我们来看一个简单的Demo。假设我们有一个`TStringList`,其中包含了各种数字字符串,...

    Delphi中TStringList类使用详解

    在使用`TStringList`之前,首先需要创建一个实例: ```delphi var List: TStringList; begin List := TStringList.Create; ``` 使用完毕后,应当释放内存资源: ```delphi List.Free; ``` #### 添加与删除元素 `...

    Delphi TStringList 排序代码.rar

    Delphi中的TStringList 排序算法实例代码,功能: 对保存在多个 TStringList 中的数据进行排序,支持按数字,日期,文字进行排序,支持顺序和倒序排序。  procedure MyStringsCustomSort(var aData: TSortData; ...

    Delphi中TStringList的用法_构造简单数据库.rar

    使用`Add`方法可以向TStringList中添加单个字符串,如`StringList.Add('Hello');`。`AddObject`方法允许附加一个对象引用,如`StringList.AddObject('World', TObject);`。 3. **删除字符串** `Delete`方法根据...

    Delphi TStringList 扩展

    在 Delphi 编程环境中,TStringList 是一个非常实用的组件,用于处理字符串列表。在标准的 TStringList 类的基础上,开发者经常需要扩展其功能以适应更复杂的场景,比如实现无限树形结构。标题 "Delphi TStringList ...

    字符串调用过程或函数

    本篇文章将深入探讨如何在Delphi 2010中利用字符串来调用自定义过程和自定义函数,以及相关的实例和注意事项。 首先,我们需要理解在Delphi中,过程(Procedure)和函数(Function)是两种不同的代码块。过程主要...

    BCB 管道函数调用详细DOME

    ### BCB管道函数调用详解 #### 概述 在C++ Builder中,有时我们需要与外部程序进行交互,比如执行一些命令并获取其输出结果。本文将详细介绍如何使用C++ Builder来实现类似CMD命令行的功能,即通过创建管道来调用...

    C++ Builder XE listview的保存与载入数据.pdf

    Strings->AddStrings(Item->SubItems); } Strings->SaveToFile(SaveDialog1->FileName.c_str()); delete Strings; } } ``` 接下来,实现数据的载入功能,我们编写另一个事件处理函数,如btn12Click()。在这个...

    rest服务在Dlephi7里的调用方法

    本篇文章将详细介绍如何在Delphi 7中使用Indy组件来调用REST服务,并通过一个实际的DEMO来演示具体步骤。 首先,你需要安装Indy库。如果你的Delphi 7版本没有自带Indy,可以从 Indy Project 的官方网站 下载适合的...

    delphi Memo及tstrlists的交集差集并集

    // TMemo1 是一个实例化的 TMemo 控件 // 现在 MemoLines 就是 Memo1 的所有行 end; ``` `TStringList`提供了丰富的字符串操作功能,包括添加、删除、查找和排序等。我们可以通过`TStringList`的方法来实现集合...

    Delphi调用Zebra打印机的ZPL指令来打印条形码.pdf

    下面是一个实例应用,使用Delphi调用Zebra打印机的ZPL指令来打印条形码: ```delphi procedure TForm1.PrintIIBtnClick(Sender: TObject); var ZPL: string; slist: TStringList; begin slist := TStringList....

    delphi TStringList的使用

    TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的。 常规的用法大家都知道,现在来讨论它的一些高级的用法。

    TStringList.pdf

    - `Add`: 在列表的末尾添加一个元素。 - `AddRange`: 将多个元素添加到列表的末尾。 - `AsReadOnly`: 返回列表的只读版本,这对于多线程环境或当列表不应被修改时很有用。 - `BinarySearch`: 在排序的列表中搜索特定...

    SMTP邮件发送实例

    - 例如,可以使用一个TStringList保存邮件内容,每行代表邮件的一段,然后将数据集中的字段值插入到适当位置。 5. **发送邮件**: - 在TIdSMTP.OnConnect事件中,可能需要进行认证操作,根据服务器要求。 - 调用...

Global site tag (gtag.js) - Google Analytics