Delphi 小谈之TList 篇(转)

【控件功能】我来做练习-第46课-Generic TList<T> Delphi example Generic TList Delphi example 阅读详情

转至:http://blog.youkuaiyun.com/jqandjq/article/details/5429137

看了这里标题,大家可能以为我会谈TListBox控件,那就错了。我要谈的是Delphi提供给我们的具有列表性质的类:TstringList、TList和TObjectList。TstringList用来存放字符串,TList存放指针,而TObjectList则存放对象(Object)。

  在我们使用Delphi 的过程中,有很多数据的存储是要靠数组解决的。虽然Delphi现在已经支持了可变数组,不过总有那么点缺陷:我们不能在删除一个项后,使后边的项自动前靠。因此,说说Delphi现成的List还是有价值的。

  TstringList (Classes.pas)

  在TstringList里,那些String被一行一行地储存。TstringList.Text返回全部的String。如果第一、二、三行分别是/'aa/'、/'bb/'、/'cc/' 的话,那么Text 返回的是“/'aa/'+#13#10+/'bb/'+#13#10+/'cc/'+#13#10” (不包括双引号)。所有的String都被TstringList用回车和换行符(#13#10)连接了起来。如果依次向Text赋值的话,Text就会被自动地分割成行储存在TstringList 里。这充分地体现出TstringList的一个很实用的价值:它能让我们逐行处理String。假如我们要操作第4行,只需操作TstringList[3]。相信大家会问,TstringList明明是一个类,为什么能当数组那样子用呢?其实,我们在写TstringList[3]的时候,就是在写TstringList.Strings[3]。Strings是TstringList的一个缺省属性。数组性的缺省属性就是这样子使用的。如果大家在编写类的时候要用到这么一个功能的话,可以参照如下方法:


property AProperty[I: Integer] read *** write ***;
default;。
  Strings 是一个可读写的属性。这也就是说,大家不仅可以获得第N 行的内容,也可以改变第N 行的内容。因此我们需要知道TstringList 里S t r i n g 的总行数。TstringList的属性Count则可以满足我们的需要。

  上面已经说过,Text是一个返回所有字符串的属性。向Text赋值时,TstringList能够自动地把Text分成一行一行的,然后储存在TstringList里(当然,TstringList里面并不完全是这么储存的,详细过程建议看TstringList和TStrings的代码)。这样,Strings返回的字符串就是没有回车和换行的。但是,如果我们向Strings赋值的字符串有回车和换行,那么会出现什么情况呢?此时,Strings就会把那个字符串断成几行,插入到原来的位置上。如果TstringList只有这么些功能的话,那我就不必专门拿出来讲了——我是说,TstringList能让我们任意地插入或删除某行,这就要用到TstringList提供的方法。


function Add(const S: string): Integer;
procedure Append(const S: string);
Add方法向TstringList的末尾添加一行String(在这里和下面我们都假设输入的字符串没有回车和换行,否则String将被分割)。参数S 代表的是要插入的字符串的内容。Add的返回值代表了新的字符串在TstringList的位置——也就是最后一行的位置,即新的Count 减去一。

Append 方法与Add 唯一不同的地方是没有返回值。
procedure Insert(Index: Integer; const S: string);
Insert方法向TstringList插入一行字符串。在Insert里,我们可以自由地选择字符串插入的位置。参数S 代表要插入的字符串的内容,Index 代表要插入的位置。
procedure Delete(Index: Integer);
Delete 方法删除某行字符串,我们同样可以自由地选择删除任意一行字符串。参数Index代表要删除的那一行字符串的位置。学习笔记
function IndexOf(const S: string): Integer;
IndexOf查找某一字符串在TstringList里的位置。参数S代表要查找的字符串。如果TstringList里不存在S的话,则返回-1。
procedure Move(CurIndex, NewIndex: Integer);
procedure Exchange(Index1, Index2: Integer);
TstringList另外还提供了两个方法—— Move 和Exchange。Move方法能把一行字符串抽出来并插入到另一个指定的位置上。参数CurIndex代表要移动的字符串的位置,NewIndex 代表字符串新的位置。
Exchange方法则能将随便两行字符串交换。参数Index1和Index2代表两行需要交换的字符串的位置。
procedure LoadFromFile(const FileName: string);
procedure SaveToFile(const FileName: string);
TstringList的LoadFromFile和SaveToFile两个方法,使得我们对文本文件的操作变得非常方便。参数FileName 代表目标文本文件的文件名。例如我们在编写记事本的时候,用到的TMemo.Lines 就是TStrings(TstringList的父类,功能几乎相同,只是因为TStrings是虚类,我们无法创建并使用)。在保存的时候只需一行代码:TMemo.Lines.SaveToFile(FileName),非常方便。
TstringList还有一项特殊功能:可以把TstringList当成ini控制器使用。不过它没有Section。现在我就来介绍TstringList的两个属性:Names和Values。

如果TstringList的内容是这样子的:

ID=1
Name=Vczh
PositionID=8
Tel=00000000

那么,Names[2]就返回“PositionID ”,Values[/'PositionID/']就返回“8”。其中“Names”是只读属性,而“Value”则可写。TstringList使我们不必拘泥于ini和注册表。关于TstringList没有Section这个问题,我们完全可以在Names 里做点手脚,只要程序能够识别就行(文章末尾处的范例里将出现此方法供大家参照)。

TstringList还有一个可以存放Object的功能。但是我个人认为使用TObjectList比较好,因为TObjectList在这方面提供了比TstringList更多的功能。

下面我提供一个例程来介绍Values属性。

新建一个工程保存,并在dpr文件所在的文件夹里建立一个叫做“Config.txt”的文件,并输入以下内容:

Name=VCZH
Address=Somewhere
Email=vczh@163.com

然后,建立一个窗体。如图所示:并在TForm1 的Private 区段里建立一个变量:

SL:TstringList;

这个例程的功能是编辑Config.txt 里的Name 、Address、Email。SL在程序启动时读入Config.txt文件;按下Cancel 按钮则退出;按下OK 按钮则改变SL 的内容并保存在Config.txt文件里;当程序再次运行时,改变后的内容就会显示在三个文本框里。代码如下:

procedure TForm1.FormCreate(Sender: TObject);
begin
SL:=TstringList.Create;
{ 获取当前程序文件所在的文件夹名称以获得C o n f i g . t x t 文件的路径 }
SL.LoadFromFile(ExtractFilePath(ParamStr(0))+/'Config.
txt/');
end;

procedure TForm1.FormClose(Sender: TObject; var Action:
TCloseAction);
begin
SL.Free;
end;

procedure TForm1.btnCancelClick(Sender: TObject);
begin
Close;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
{ 通过上面介绍的V a l u e s 属性获得各个字段的内容 }
edtName.Text:=SL.Values[/'Name/'];
edtAddress.Text:=SL.Values[/'Address/'];
edtEmail.Text:=SL.Values[/'Email/'];
end;

procedure TForm1.btnOKClick(Sender: TObject);
begin
{ 修改各个字段的内容并保存 }
SL.Values[/'Name/']:=edtName.Text;
SL.Values[/'Address/']:=edtAddress.Text;
SL.Values[/'Email/']:=edtEmail.Text;
SL.SaveToFile(ExtractFilePath(ParamStr(0))+/'Config.
txt/');
Close;
end;

程序执行后如图:

-------------------------------------------------------------------------------------

Tlist (Classes.pas)

在我刚开始接触TList的时候,TList搞得我迷雾重重,都是Capacity属性惹的祸。我查了Delphi的帮助,它说Capacity是TList的最大容量,又在什么地方说MaxIntdiv 4是TList的最大容量。最后我搞明白了,Capacity是临时的,MaxInt div 4才是真正的最大容量。只要你的内存受得了就行,算起来一共是4G。在TList 内部有一个FList指针指向一个Pointer数组,Capacity就是这个数组的大小。奇怪的是Capacity是可写的。我当时就在想,如果一直使用Add 直到超出了Capacity的范围,会怎么样呢?为了解决这个问题,我特地打开了TList 的代码,结果发现如下几行(注释是我自己加的):

function TList.Add(Item: Pointer): Integer;
begin
{ 返回Item 所在的位置 }
Result := FCount;
{ 如果FList 数祖被填满了装不下新的Item

那么TList 自动增加Capacity

也就是FList 指向的数组的大小 }

if Result = FCapacity then
Grow;
{ 扩大了FList 的大小后,就能把 Item 放进数组了 }
FList^[Result] := Item;
Inc(FCount);
if Item <> nil then
Notify(Item, lnAdded);
{ 给TList 一个信号,通知TList 已经加上了一个新的Item }
end;

procedure TList.Grow;
var
Delta: Integer;
begin
{ 增加的规则是,如果数量小于或等于8,那么增加4 ;如果数量在8 之上,小于或等于64 ,那么增加16 ;如果数量比64 还大,那么一次增加大约1/4 的空间 }
if FCapacity > 64 then
Delta := FCapacity div 4
else
if FCapacity > 8 then
Delta := 16
else
Delta := 4;
{ 改变数组大小 }
SetCapacity(FCapacity + Delta);
end;

既然Capacity会自动增加,那么还要Capacity干什么呢?还不如使用链表。不过我后来意识到,在使用链表的时候,取得某个位置的指针比数组困难,要用比较费时间的循环。TList刚好解决了这个问题。我们既可以把TList 当成数组,也可以把它当成链表。

TList 除了保存的对象是指针以外,其它地方都与TstringList很像。所以接下来我只介绍二者不同之处。

我们同样可以使用TList或者TList.Items获得某一位置的指针。如果嫌TList.Items是属性没有效率的话,这里还有一个List属性,指向内部的FList,可以这么用:

TList.List^。
TList提供了First和Last两个属性,分别返回第一个和最后一个指针。
TList 也提供了一个Remove方法。与Delete不同的是,Delete删除的是已知位置的指针,Remove删除的是已知指针。只要TList 包含有你想删除的指针,就可以使用Remove(Pointer)。Remove的返回值是指针在还没有被删除之前的位置。使用方法如下:
procedure Delete(Index: Integer);
function Remove(Item: Pointer): Integer;
TList还有一个Pack方法。它能够把所有不是nil的指针聚在一起,同时把Count 的值改变,这样,所有没用的指针就会被删除,但是并不会减少Capacity。如果你想把没用的空间都释放掉的话,可以把Capacity设置成Count。

最后,我想说的是Protected里的Notify。大家在Add的代码里就能看到,在Insert、Delete之类的代码里我们也能看得到Notify的踪迹。既然FList的内容已经被改变了,Notify 还要做什么工作呢?看一下Notify的代码:学习笔记

TListNotification = (lnAdded, lnExtracted, lnDeleted);
procedure TList.Notify(Ptr: Pointer; Action:
TListNotification);
begin
end;

留着一个空的Notify 有什么用呢?再看它的声明:

procedure Notify(Ptr: Pointer; Action: TListNotification);
virtual;

原来Notify 是一个虚函数,当我们因为有特殊要求而继承TList类的话,只要TList 的内容一改变,我们就能得到通知。不过前提是我们要覆盖N o t i f y 这个Procedure。

-------------------------------------------------------------------------------------

TObjectList (Contnrs.pas)
T O b j e c t L i s t 中有一个不可缺少的属性:OwnsObjects。如果OwnsObjects是True(缺省值)的话,那么TObjectList会在适当的时候把它列表中的Object释放掉。

现在,让我们用一个例子来结束我对Delphi的List的介绍。这个例子是一个管理人员信息的程序。不过因为这只是一个示例,所以这个程序只是一个简单的ConsoleApplication。使用Console Application来做示例程序可以免掉一些界面设计的工作。这个程序通过Index来管理人员信息。人员信息包括Name、Telephone和Address。程序通过TstringList来读取人员信息文件,然后用那些指向Record的指针把信息存放在TList里并修改。代码如下:

程序代码

program Info[color=#0000ff];
{$APPTYPE CONSOLE}

uses
SysUtils, Classes;
type
PInfo=^TInfo;
TInfo=record
Name:String;
Tel:String;
Address:String;
end;

var
SL:TstringList;
List:TList;
AppPath:String;
{ 开辟一个新的PInfo 指针,填入信息并返回指针将在Command_Delete 或FinaInfo 里释放 }
function MakeInfo(Name,Tel,Address:String):PInfo;
var P:PInfo;
begin
New(P);
P^.Name:=Name;

P^.Tel:=Tel;

P^.Address:=Address;

{ 返回的指针将被保存在List 里 }
result:=P;
end;

{ 在屏幕上打印所有可用的命令 }
procedure PrintMenu;
begin
writeln(/'======菜单======/');
writeln(/'V---- 查看所有人员的信息/');
writeln(/'A---- 增添新的人员信息/');
writeln(/'D----删除人员/');
writeln(/'E---- 修改人员信息/');
writeln(/'M---- 查看所有可用命令/');
writeln(/'X----退出程序/');
end;

{ 修改人员信息的程序 }
procedure Command_Edit;
var I:Integer;
Name,Tel,Address:String;
P:PInfo;

begin
write(/' 请输入要修改的人员信息的序号:/');
readln(I);
if(I<0)or(I>=List.Count)then
writeln(/' 输入超出范围。/')
else
begin
{ 取得某个人员信息的指针 }
P:=List.Items;

writeln(/' 开始输入人员信息(若某项信息不需要修改则留空):/');

write(/' 姓名:/');
readln(Name);
write(/' 电话号码:/');
readln(Tel);
write(/' 地址:/');
readln(Address);
{ 保存输入的信息 }
if Name<>/'/' then P^.Name:=Name;
if Tel<>/'/' then P^.Tel:=Tel;
if Address<>/'/' then P^.Address:=Address;
writeln(/' 修改人员信息执行完毕。/');
end;

end;

{ 增加人员信息的程序 }
procedure Command_Add;
var Name,Tel,Address:String;
begin
writeln(/' 开始输入人员信息:/');
write(/' 姓名:/');
readln(Name);
write(/' 电话号码:/');
readln(Tel);
write(/' 地址:/');
readln(Address);
{ 使用MakeInfo 生成TInfo 的指针并加入Tlist 中 }

List.Add(MakeInfo(Name,Tel,Address));
writeln(/' 增加人员信息执行完毕。/');
end;

{ 打印所有人员信息的程序 }
procedure Command_View;
var I:Integer;
P:PInfo;

begin
writeln(/' 人员信息列表:/');
for I:=0 to List.Count-1 do
begin
P:=List.Items;

writeln(IntToStr(I)+/'号===================/');
writeln(/'姓名:/'+P^.Name);
writeln(/'电话:/'+P^.Tel);
writeln(/'地址:/'+P^.Address);
{ 满六个就暂停,刚好填满一个屏幕 }
if I mod 6=5 then
begin
writeln(/' 请按回车键继续。/');
readln;
end;

end;

writeln;
end;

{ 删除人员信息的程序 }
procedure Command_Delete;
var I:Integer;
P:PInfo;

begin
write(/' 请输入要删除的人员信息的序号:/');
readln(I);
if(I<0)or(I>=List.Count)then
writeln(/' 输入超出范围。/')
else
begin
P:=List.Items;

List.Delete(I);
Dispose(P);
writeln(/' 删除执行完毕。/');
writeln;
end;

end;

{ 处理用户输入的命令 }
function GetCommand:Boolean;
{ 返回False 表示退出 }
var C:Char;
begin
write(/' 输入命令并回车:/');
readln(C);
result:=True;
case C of

/'V/',/'v/':Command_View;

/'A/',/'a/':Command_Add;

/'D/',/'d/':Command_Delete;

/'M/',/'m/':PrintMenu;

/'X/',/'x/':result:=False;

/'E/',/'e/':Command_Edit;

else writeln(/' 未知命令。/');
end;

end;

{ 从Info.txt 把人员信息加载入Tlist }
procedure LoadInfo;
var I:Integer;
Name,Tel,Address,Index:String;
begin
SL.LoadFromFile(AppPath+/'Info.txt/');
for I:=0 to SL.Count div 3-1 do
begin
Index:=IntToStr(I)+/'./';
{ 文件格式:Index.Field=Value

在这里使用Index.X 区别不同序号的人员信息的字段名称然后通过Values 属性读取信息 }

Name:=SL.Values[Index+/'Name/'];
Tel:=SL.Values[Index+/'Tel/'];
Address:=SL.Values[Index+/'Address/'];
List.Add(MakeInfo(Name,Tel,Address));
end;

end;

{ 把TList 里的人员信息保存到Info.txt }
procedure SaveInfo;
var I:Integer;
P:PInfo;

begin
SL.Clear;{ 清空TstringList }
for I:=0 to List.Count-1 do
begin
P:=List.Items;

SL.Add(IntToStr(I)+/'.Name=/'+P^.Name);
SL.Add(IntToStr(I)+/'.Tel=/'+P^.Tel);
SL.Add(IntToStr(I)+/'.Address=/'+P^.Address);
end;

SL.SaveToFile(AppPath+/'Info.txt/');
end;

{ 初始化程序 }
procedure InitInfo;
begin
SL:=TstringList.Create;
List:=TList.Create;
{ 获得本程序所在的路径 }
AppPath:=ExtractFilePath(ParamStr(0));
end;

{ 清空程序使用的内存 }
procedure FinaInfo;
var I:Integer;
begin
for I:=0 to List.Count-1 do
Dispose(PInfo(List.Items));
List.Free;
SL.Free;
end;

begin
{ TODO -oUser -cConsole Main : Insert code here }
InitInfo;
LoadInfo;
writeln(/'Information Editor V1.0 by VCZH/');
PrintMenu;
while GetCommand do;{ 循环直到返回False }
SaveInfo;
FinaInfo;
writeln(/' 谢谢使用。请按回车键退出程序。/');
readln;
end.[/color]

在这个程序测试完毕(由于时间关系,并没有执行严格的测试,所以一些小细节可能会没有注意到,不过不会影响程序功能的正确性)时,Info.txt 的内容如下

在循环开始时,I 的值被指向0,然后Index的值就变成“0.”。在执行Name:=SL.Values[Index+/'Name/']时,就等于执行Name:=SL.Values[/'0.Name/']于是, “0.Name”这个字段的内容就被读取,然后Name 就变成了“vczh ”。接着进入下一个循环。程序就是通过在字段前加“Index.”这样的方法区别不同人员的信息。在读取完一个人的信息后,程序执行List.Add(MakeInfo(Name,Tel,Address)),信息便存放在List里了。程序通过操作List 增加、删除或修改人员信息。在用户退出程序时,程序将List里的所有信息保存在“Info.txt”里。过程是这样的:程序先清空SL 里的内容,然后按照Info.txt原来的文件格式填写信息。因为Info.txt里的人员数目是会改变的,因此便不能使用TstringList.Values属性修改,而必须在清空TstringList后手动构建字段并填写信息。

0.Name=vczh

0.Tel=1234567

0.Address=Jupiter

1.Name= 陈梓瀚

1.Tel=8888888

1.Address=Venus

2.Name=chenzihan

2.Tel=9999999

2.Address=Mars

3.Name=Victor

3.Tel=0000000

3.Address=Saturn

经过这样的介绍,大家对Delphi 包含的与List,有相似性质的类都有了一定的认识。Delphi VCL 开发组为我们准备了这么多既实用又有效率的功能。而List在庞大的Delphi VCL 里只是沧海一粟。所以我们今后应当继续研究Delphi VCL,充分利用 VCL,为自己的项目增添光辉


delphi Tlist详解 delphi 开发工具Tlist类介绍有助于delphi程序员开发查找,方便快捷 立即下载

相关推荐

GN算法边介数计算优化指南:如何提升大规模社交网络分析效率

本文深入探讨了GN算法在大规模社交网络分析中的核心瓶颈——边介数计算,并提供了从算法优化到工程部署的完整性能提升方案。通过引入Brandes算法、并行计算、增量更新及分布式处理等策略,有效解决了传统GN算法在处理百万级网络时效率低下的问题,为社交网络社区划分等实际应用提供了高效解决方案。

weixin_29196613的博客 486

Delphi TList 使用范例

Delphi TList 使用范例

minstrelboy的专栏 9285

【强化学习的数学原理-赵世钰】课程笔记(一)基本概念

在B站上学习强化学习的课程笔记,笔记非常详细清晰,会持续更新

qq_64671439的博客 1万+

Delphi 小谈之TList 篇

最近开发程序需要使用TList功能,转载此文章,以作参考。  看了这里标题,大家可能以为我会谈TListBox控件,那就错了。我要谈的是Delphi提供给我们的具有列表性质的类:TstringList、TList和TObjectList。TstringList用来存放字符串,TList存放指针,而TObjectList则存放对象(Object)。在我们使用Delphi 的过程中,有

Edwin的专栏 2212

银河麒麟(桌面版/服务器版)远程桌面配置全攻略:XRDP与VNC实战指南

本文提供了银河麒麟操作系统(桌面版与服务器版)配置远程桌面的完整实战指南。详细对比并演示了XRDP与VNC两种主流方案的安装、配置与连接步骤,涵盖从环境准备、软件安装、服务启动到客户端连接的全过程,并针对常见的黑屏、连接失败等问题给出了有效的排坑解决方案,帮助用户实现跨平台的便捷图形化远程管理。

b0c1d2的博客 813

从工艺到器件:用Silvaco ATLAS仿真PIN二极管击穿电压的保姆级指南

本文详细介绍了使用Silvaco ATLAS仿真PIN二极管击穿电压的全流程指南,从工艺仿真基础搭建到器件结构构建,再到击穿特性仿真和结果分析。通过Silvaco工具链,工程师可以在设计阶段精准预测器件性能,优化击穿电压,提升研发效率。

weixin_34259816的博客 355

DELPHI中使用Tlist类的简单分析

我在上面的BLOG中写到了使用指针的方法。在DELPHI中指针最常见的就是和类TLIST结合起来使用。下面是一个很简单的例子,希望对这个例子的分析能让大家对使用TLIST类有一个简单的认识。 代码的功能是使用指针和Tlist来生成一个牌串,并将牌串保存在t_CardInfo中。   procedure TForm1.Button1Click(Sender: TObject);const  /...

weixin_34342578的博客 480

TJA1445/TJA1465 CAN收发器硬件设计与软件配置实战指南

控制器局域网(CAN)总线是汽车电子和工业控制领域实现电子控制单元(ECU)间可靠通信的核心技术。其工作原理是将数字信号转换为差分信号进行抗干扰传输,技术价值在于构建稳定、高效的分布式实时控制系统。随着汽车电子架构向域集中式演进,对CAN总线的通信速率、网络复杂度和静态功耗提出了更高要求,这催生了支持CAN FD协议和智能电源管理的新一代高速CAN收发器。在车载网关、域控制器及工业网络节点等应用场景中,NXP的TJA1445和TJA1465系列收发器凭借其部分组网(Partial Networking)和选

weixin_29655587的博客 410

看看Delphi中的列表(List)和泛型

前言 最开始学习数据结构的时候,链表,堆栈,队列,数组,似乎只是一堆概念,随着使用中慢慢接触,其对应的模型,功能,一个个跃到眼前,变成了复杂模型数据处理中的最重要的部分。---By Murphy 20180424 1,列表 Delphi中的列表有很多,从数据结构上可以分作:TList(数据链),TQueue(队列),TStack(堆栈),TDictionary(字典表)等等;...

weixin_30477797的博客 1595

YOLOv11的扩散模型去噪预处理-(在推理前对低质量图像进行增强)

摘要: 扩散模型与YOLOv11的结合有效提升了复杂场景下的目标检测性能。针对低质量图像(如噪声、低光照)导致YOLOv11特征提取退化的问题,研究提出了一种基于条件扩散模型的预处理方法。通过语义引导的渐进式去噪,在保留关键检测特征的同时,显著改善了图像质量。技术核心包括:1)利用YOLOv11浅层特征作为条件输入;2)交叉注意力机制实现任务感知去噪;3)知识蒸馏与潜空间扩散加速推理。实验表明,该方法使mAP50提升19%,在15步内达到传统百步去噪效果,平衡了精度与实时性需求,为鲁棒性目标检测提供了新思路

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 878

【第1章】基于FPGA的图像形态学处理学习教程——目录

本课程介绍图像形态学处理技术,通过腐蚀、膨胀、开运算、闭运算等算子对图像进行优化。腐蚀可去除边缘杂色使线条更清晰,膨胀能填补缺口修复图像,开运算擅长去噪,闭运算则用于修补断裂。课程内容涵盖四大形态学处理的理论分析、MATLAB仿真和FPGA开发实现,包括腐蚀、膨胀、开闭运算以及顶帽变换等操作,最后探讨形态学处理的实际应用场景。通过仿真测试和FPGA开发实践,帮助学员掌握图像"美容塑型"的核心技术。

MATLAB,verilog,python,opencv,tensorflow,caffe,C,C++ 338

Delphi小谈之TList/TobjectList/TstringList篇

【转】Delphi小谈之TList/TobjectList/TstringList 篇 Delphi提供给我们的具有列表性质的类:TstringList、TList和TObjectList。TstringList用来存放字符串,TList存放指针,而TObjectList则存放对象(Object)。在我们使用Delphi的过程中,有很多数据的存储是要靠数组解决的。虽然Delphi现在已经支持了可变

Qiu@SmileToLife的博客 2000

Modelsim:LPDDR5仿真(含美光仿真模型官方sv&vcs代码)

虽然,三星在设计跟量产上,早于其他家存储产商,但是镁光后来居上了,是业界首家支持全速 LPDDR5 的供应商,并且开发者在做开发的时候,也是用美光颗粒比较多,所以这里就先以美光的仿真模型为主进行仿真。 本工程为美光官方工程,支持Modelsim、VCS、ncverilog三种仿真器仿真。模型破解过,为完整system-verilog代码。

千歌叹尽执夏的博客 1283

delphi中Tlist的使用。

我在上面的BLOG中写到了使用指针的方法。在DELPHI中指针最常见的就是和类TLIST结合起来使用。下面是一个很简单的例子,希望对这个例子的分析能让大家对使用TLIST类有一个简单的认识。 代码的功能是使用指针和Tlist来生成一个牌串,并将牌串保存在t_CardInfo中。   procedure TForm1.Button1Click(Sender: TObject);

云中雁012345之成长 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

delphi中TObjectList和TList

TList和TobjectList是delphi中的两种列表,其中TObjectList继承自TList 可以看到在TObjectList中的一些方法都是继承自TList的,例如Add方法等,但是其中的Notify方法是自己实现了一下 procedure TObjectList.Notify(Ptr: Pointer; Action: TListNotification); begin

5826

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

delphi下TList的用法

delphi下TList的用法 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, D...

328

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Delphi TObjectList TList 的Sort用法

一、这里就只写下TObjectList的例子 TObjectList <T> 、TList<T>相同 1.需要自己定义一个函数,让sort对其进行回调 //用string类作为例子(可以替换为自己定义的类) const 是必要的修饰词 function MyComparerFunc(const s1,s2: string): Integer; begin Result := CompareText(s2, s1); //Result := -CompareText(...

zxl_1996的博客 2460

关于TLIST排序SORT的使用

TOBJECTLIST里,有自带的排序功能TLIST,TSTRINGLIST也有,MS是一样的 SORT里有一个参数: Compare:TListSortCompare 那我们先了解一下 TListSortCompare typeHELP原文:TListSortCompare is the type for callbacks that compare two items

互联网产品管理、交互、设计、开发、用户体验专栏 4872

Delphi中TList类应用

在DELPHI中指针最常见的就是和类TLIST结合起来使用。下面是一个很简单的例子,希望对这个例子的分析能让大家对使用TLIST类有一个简单的认识。 代码的功能是使用指针和Tlist来生成一个牌串,并将牌串保存在t_CardInfo中。 procedure TForm1.Button1Click(Sender: TObject); const //黑桃,红桃,方块,草花 CardTy

crkres9527 848

Day6 Delphi中TList用法

关于Delphi中TList用法,是怎样用的呢?带着这个疑问,笔者开始进行了代码的编写,试图理解TList的本质–TList包含对象指针列表。好的,那么开始程序代码编写吧! 开发环境:Delphi7 开发控件截图: 代码如下,以下代码仅为运用TList,没有考虑内存的情况,好的,代码Unit1.Pas如下: unit Unit1; interface uses

最爱吃糖小狂魔的博客 1742

Delphi:TList/TObjectList 设计中的 Notify 设计范式

Delphi中的TList/TObjectList采用混合设计模式实现灵活的集合管理。其核心是Notify方法,结合了观察者模式(状态变更时通知)和模板方法模式(父类定义流程,子类扩展行为)。当列表执行删除等操作时,自动触发Notify通知,子类TObjectList可重写该方法实现对象释放等定制逻辑。这种设计遵循开闭原则,通过虚方法扩展功能而不修改基类,同时保持职责分离——基类管理数据结构,子类处理业务逻辑。实际实现中需注意操作顺序,先处理业务逻辑再调用父类方法,避免访问已释放内存。这种模式在多种框架中广

程序猿视角 1484

TList

Tlist (Classes.pas)在我刚开始接触TList的时候,TList搞得我迷雾重重,都是Capacity属性惹的祸。我查了Delphi的帮助,它说Capacity是TList的最大容量,又在什么地方说MaxIntdiv 4是TList的最大容量。最后我搞明白了,Capacity是临时的,MaxInt div 4才是真正的最大容量。只要你的内存受得了就行,算起来一共是4G。在TList ...

weixin_34221773的博客 506
上一篇: Java初学者不得不知的概念,JDK,JRE,JVM的区别?
下一篇: IOCP知识点及疑惑
sdudubing
博客等级 码龄16年 117粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值