创建了一个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, 不是导致问题的原因,猜想错误。
分享到:
相关推荐
本文将详细探讨`TStringList`的`strings`属性以及相关的使用实例。 `TStringList`是`System.Classes`单元中的一个类,它提供了对字符串列表的操作,包括添加、删除、查找、排序等功能。`strings`属性是`TStringList...
1. 创建一个`TStringList`实例,如`var StringList: TStringList;`。 2. 调用`StringList.Split`方法,传入Edit组件中的字符串和分隔符,如`StringList.Split(Edit1.Text, ';')`。这会将Edit中的字符串按分号分割,...
在编程领域,特别是使用Delphi或C++Builder等基于VCL(Visual Component Library)框架的开发环境中,`TStringList` 是一个非常常用的组件。...同时,记得在操作完成后释放`TStringList`实例,遵循良好的内存管理习惯。
从上面的代码可以看到,我们首先创建了一个 TStringList 对象,然后使用 Add 方法添加字符串,使用 Exchange 方法交换两个字符串,使用 Insert 方法插入字符串,使用 IndexOf 方法获取字符串的索引,使用 Sort 方法...
`TStringList`可以通过`Create`方法来创建实例。例如: ```pascal var List: TStringList; begin List := TStringList.Create; ``` 这行代码创建了一个名为`List`的`TStringList`对象。 #### 三、添加与插入元素 ...
当调用`CustomSort`方法时,将这个比较函数作为参数传入: ```delphi StringList.CustomSort(@CompareByLength); ``` 现在,我们来看一个简单的Demo。假设我们有一个`TStringList`,其中包含了各种数字字符串,...
在使用`TStringList`之前,首先需要创建一个实例: ```delphi var List: TStringList; begin List := TStringList.Create; ``` 使用完毕后,应当释放内存资源: ```delphi List.Free; ``` #### 添加与删除元素 `...
Delphi中的TStringList 排序算法实例代码,功能: 对保存在多个 TStringList 中的数据进行排序,支持按数字,日期,文字进行排序,支持顺序和倒序排序。 procedure MyStringsCustomSort(var aData: TSortData; ...
使用`Add`方法可以向TStringList中添加单个字符串,如`StringList.Add('Hello');`。`AddObject`方法允许附加一个对象引用,如`StringList.AddObject('World', TObject);`。 3. **删除字符串** `Delete`方法根据...
在 Delphi 编程环境中,TStringList 是一个非常实用的组件,用于处理字符串列表。在标准的 TStringList 类的基础上,开发者经常需要扩展其功能以适应更复杂的场景,比如实现无限树形结构。标题 "Delphi TStringList ...
本篇文章将深入探讨如何在Delphi 2010中利用字符串来调用自定义过程和自定义函数,以及相关的实例和注意事项。 首先,我们需要理解在Delphi中,过程(Procedure)和函数(Function)是两种不同的代码块。过程主要...
### BCB管道函数调用详解 #### 概述 在C++ Builder中,有时我们需要与外部程序进行交互,比如执行一些命令并获取其输出结果。本文将详细介绍如何使用C++ Builder来实现类似CMD命令行的功能,即通过创建管道来调用...
Strings->AddStrings(Item->SubItems); } Strings->SaveToFile(SaveDialog1->FileName.c_str()); delete Strings; } } ``` 接下来,实现数据的载入功能,我们编写另一个事件处理函数,如btn12Click()。在这个...
本篇文章将详细介绍如何在Delphi 7中使用Indy组件来调用REST服务,并通过一个实际的DEMO来演示具体步骤。 首先,你需要安装Indy库。如果你的Delphi 7版本没有自带Indy,可以从 Indy Project 的官方网站 下载适合的...
// TMemo1 是一个实例化的 TMemo 控件 // 现在 MemoLines 就是 Memo1 的所有行 end; ``` `TStringList`提供了丰富的字符串操作功能,包括添加、删除、查找和排序等。我们可以通过`TStringList`的方法来实现集合...
下面是一个实例应用,使用Delphi调用Zebra打印机的ZPL指令来打印条形码: ```delphi procedure TForm1.PrintIIBtnClick(Sender: TObject); var ZPL: string; slist: TStringList; begin slist := TStringList....
TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的。 常规的用法大家都知道,现在来讨论它的一些高级的用法。
- `Add`: 在列表的末尾添加一个元素。 - `AddRange`: 将多个元素添加到列表的末尾。 - `AsReadOnly`: 返回列表的只读版本,这对于多线程环境或当列表不应被修改时很有用。 - `BinarySearch`: 在排序的列表中搜索特定...
- 例如,可以使用一个TStringList保存邮件内容,每行代表邮件的一段,然后将数据集中的字段值插入到适当位置。 5. **发送邮件**: - 在TIdSMTP.OnConnect事件中,可能需要进行认证操作,根据服务器要求。 - 调用...