首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Delphi 2009中的Generic TList <>在IndexOf上崩溃

在Delphi 2009中,TList<>是一个泛型类,用于存储对象。IndexOf方法用于查找指定对象在列表中的索引。如果在列表中找不到指定对象,则返回-1。

在某些情况下,使用IndexOf方法可能会导致程序崩溃。这通常是由于比较对象时出现问题。为了解决这个问题,您可以:

  1. 重写对象的Equals方法。Equals方法用于比较两个对象是否相等。在IndexOf方法中,它将使用Equals方法来比较列表中的对象和指定对象。
代码语言:delphi
复制
TMyObject = class
  // ...
  public
    function Equals(Obj: TObject): Boolean; override;
  // ...
end;

function TMyObject.Equals(Obj: TObject): Boolean;
begin
  Result := (Obj is TMyObject) and (Self.SomeProperty = TMyObject(Obj).SomeProperty);
end;
  1. 使用自定义比较器。如果您不能重写对象的Equals方法,或者希望使用不同的比较方式,可以使用自定义比较器。自定义比较器是一个实现IComparer<T>接口的类。
代码语言:delphi
复制
TMyComparer = class(TInterfacedObject, IComparer<TMyObject>)
  // ...
  public
    function Compare(const Left, Right: TMyObject): Integer;
  // ...
end;

function TMyComparer.Compare(const Left, Right: TMyObject): Integer;
begin
  if Left.SomeProperty< Right.SomeProperty then
    Result := -1
  else if Left.SomeProperty > Right.SomeProperty then
    Result := 1
  else
    Result := 0;
end;

然后,在调用IndexOf方法时,传递自定义比较器。

代码语言:delphi
复制
var
  MyList: TList<TMyObject>;
  MyObject: TMyObject;
  Comparer: IComparer<TMyObject>;
  Index: Integer;
begin
  MyList := TList<TMyObject>.Create;
  try
    // ...
    MyObject := TMyObject.Create;
    // ...
    Comparer := TMyComparer.Create;
    Index := MyList.IndexOf(MyObject, Comparer);
    // ...
  finally
    MyList.Free;
  end;
end;

这样,您就可以避免IndexOf方法中的崩溃问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

delphi vcl_delphi数据类型

其继承关系如下: (2) TActionList组件 这个组件用来增加一些命令,并且使这些命令很容易作用于一个组件或者一组组件,例如,一个应用程序通过用Clipboard组件,就可以菜单、工具栏和快捷菜单删除...所有显示文本组件类都有TFont类。 除了这里列出GDI类以外,还有一些其他类,以后Delphi学习过程中,我们将会学习到更多有关这方面的类,并掌握使用它们。...另一个VCL实用类就是TList类,这个类可以建立任何想要类型对象数组。...TList类可以存储指针清单,TList类主要优点就是它提供了一种方法,这种方法可以使数组随着增加和删除对象,动态地扩大或缩小。...更多这些类详细信息请大家自己看看Delphi VCL Help。 这不是全部 讨论到这里并没有讨论到所有的VCL类,但这里所涉及到应用程序中用到可能性很大。

2.7K10

三.语法基础之文件操作、CSV文件读写及面向对象

文章目录: 一.文件操作 二.CSV文件操作 三.面向对象基础 ---- 一.文件操作 文件是指存储在外部介质数据集合,文本文件编码方式包括ASCII格式、Unicode码、UTF-8码、GBK编码等...如忘记使用该关闭语句,则当程序突然崩溃时,该程序不会继续执行写入操作,甚至当程序正常执行完文件写操作后,由于没有关闭文件操作,该文件可能会没有包含已写入数据。...Python中,类就是一个模板,模板里可以包含多个函数,函数里实现一些功能;对象则是根据模板创建实例,通过实例对象可以执行类中函数。...这是不规范和不合理实际开发或更加规范代码中,更推荐大家采用面向对象方法去编程,但本系列更想通过最简洁代码告诉你原理,然后你再去提升和锻炼自己能力。...同时,面向对象思想要适应需求变化,解决用户实际需求,设计时就要尽量考虑到变化,会涉及到抽象、封装变化(重点)、设计模式等知识。

69820

Delphi中利用StringList对象来记录动态生成对象

StringList使用 Delphi中,如果程序需要动态创建大量对象,那么我们可以利用StringList对象来管理这些动态生成对象。...具体步骤如下: ---- 1、创建StringList对象: OBJ := TStringList.Create; 2、保存动态生成对象: OBJ.AddObject('标识','对象名'); 3、调用生成对象...: (OBJ.Objects[序号/OBJ.IndexOf('标识')] as 对象类型).方法或属性 或: 对象类型(OBJ.Objects[序号/OBJ.IndexOf('标识')]).方法或属性...4、释放动态生成对象: (OBJ.Objects[序号/OBJ.IndexOf('标识')] as 对象类型).Free; 对象类型(OBJ.Objects[序号/OBJ.IndexOf('标识')]...).Free; 释放对象后记得要删除StringList里对应记录: OBJ.Delete(序号/OBJ.IndexOf('标识')); 5、StringList释放: if Assigned(OBJ

1.4K30

三.语法基础之文件操作、CSV文件读写及面向对象

文件操作 1.打开文件 2.读写文件 3.关闭文件 4.循环遍历文件 二.CSV文件操作 1.CSV文件写 2.CSV文件读 三.面向对象基础 四.总结 ---- 一.文件操作 文件是指存储在外部介质数据集合...如忘记使用该关闭语句,则当程序突然崩溃时,该程序不会继续执行写入操作,甚至当程序正常执行完文件写操作后,由于没有关闭文件操作,该文件可能会没有包含已写入数据。...这是不规范和不合理实际开发或更加规范代码中,更推荐大家采用面向对象方法去编程,但本系列更想通过最简洁代码告诉你原理,然后你再去提升和锻炼自己能力。...同时,面向对象思想要适应需求变化,解决用户实际需求,设计时就要尽量考虑到变化,会涉及到抽象、封装变化(重点)、设计模式等知识。...,会一直坚持分享,希望我文章能陪伴你成长,也希望技术路上不断前行。

81910

线性表链式存储

上文中我们介绍了线性表顺序储存方式,并给大家画了一幅比较详细图(虽然看着比较凌乱),本文介绍是数据储存另外一种方式“链式储存”,这相当于我们之前提到过单向链表,但是,本文与一篇文章一样,都将数据储存和算法进行了分离...【表示图】 下图是我们使用链式储存数据方式表示图,其中用户层生成了栈数据,然后将栈数据使用强制类型转换转换成了实现层可以识别的数据,转换过程中,出现了数据截断,但这并不重要,重要是截断后得到了一个... LinkListNode* 类型指针,我们利用这些指针,将数据实现内部串联成一个多个指向某地址指针组成链表,这些指针就指向了外部传递进来数据头部位置。...,指向 tlist头节点 LinkListNode* pCur = &tlist->header; for (int i = 0; i < pos; i++) { // 备份指针后移到 pos 位置前一个节点...= (TLinkList*)list; // 备份指针,指向 tlist头节点 LinkListNode* pCur = &tlist->header; for (int i = 0; i <

10710

数组类型与数组指针巧妙利用

本例通过存取结构, 慢慢引入了数组类型与指针一些使用方法; 其中六个小例子测试内容和结果都是一样. ---- unit Unit1; interface uses Windows, Messages...(ArrRec) - 1 do ShowMessageFmt('%s, %d', [ArrRec[i].F1, ArrRec[i].F2]); end; {这个只是定义了一块内存, 没用数组概念..., 这是很常用} procedure TForm1.Button5Click(Sender: TObject); type PArr = ^TArr; TArr = array[0..0] of..., 但可以用变量} {这也容易理解, 因为常量会直接编译到代码中, 没有分配内存以前, 编译器不知道数组会更大} {要解决这个问题需要用下一个方法} // buf[0].F1 := 'A';..., Delphi TList 类就是这么干} procedure TForm1.Button6Click(Sender: TObject); type PArr = ^TArr; TArr

75520

八数码问题及A*算法

所谓问题一个状态就是棋子棋盘上一种摆法。棋子移动后,状态就会发生改变。解八数码问题实际就是找出从初始状态到达目标状态所经过一系列中间过渡状态。 八数码问题一般使用搜索法来解。...八数码问题结点扩展应当遵守棋子移动规则。按照棋子移动规则,每一次可以将一个与空格相邻棋子移动到空格中,实际可以看作是空格作相反移动。空格移动方向可以是右、下、左、,当然不能移出边界。...空格移动后,它位置发生变化,不移出界时,空格向右、下、左和移动后,新位置是原位置分别加上1、3、-1、-3,如果将空格向右、下、左和移动分别用0、1、2、3表示,并将-3、3、-1、1放在静态数组...3.A*算法步骤 A*算法基本与广度优先算法相同,但是扩展出一个结点后,要计算它估价函数,并根据估价函数对待扩展结点排序,从而保证每次扩展结点都是估价函数最小结点。...那么八数码问题中,h含意是各什么?八数码问题一个状态实际是数字0~8一个排列,用一个数组p[9]来存储它,数组中每个元素下标,就是该数排列中位置。

86620

dotfiles项目

1.dotfile介绍 linux中各种软件配置文件大多是以.开头,以rc结尾,第一次使用某一个软件比如vim时候,通常会花大量时间配置,将所有的配置文件放到同一个目录下,方便在多台机器同步配置...无法显示状态栏) set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\ %0(%{&fileformat}\ %{&encoding}\ %c:%l/%L%)\ " 设置状态行显示信息...' endif nnoremap :TlistToggle let Tlist_Show_One_File = 1 " 不同时显示多个文件tag,只显示当前文件 let...Tlist_Exit_OnlyWindow = 1 " 如果taglist窗口是最后一个窗口,则退出vim let Tlist_Use_Right_Window = 1 " 右侧窗口中显示taglist...窗口 let Tlist_File_Fold_Auto_Close=1 " 自动折叠当前非编辑文件方法列表 let Tlist_Auto_Open = 0 let Tlist_Auto_Update

1.3K20

史上最烂代码

其实本没有什么代码是 “史上最烂” ,要有也只有 “史上更烂” ,我想随便说说这个话题,也是源自豆瓣一个讨论。事实,系统复杂了被骂代码烂是一件司空见惯事情。...版本也代码中强制实施了一些约束(如变量名长度、模块中允许变量数和模块大小)。...某些程序员眼里,“复用”==“继承”,只要有可复用属性、公共方法,就设法用无敌霹雳继承大法来解决,也不管适不适合,一级又一级,最后一定是一棵伟岸无边继承树。 无穷无尽工具类。...不过我不这么看,我看到过年份比较早 VB 代码、还有 Delphi 代码,虽然都是界面开发用,虽然很多理念远远不及今天,代码依然清晰易懂。...总说十五年前吃过多少多少苦程序员我一点都不佩服,我佩服十五年前那种条件和观念下,依然能够写出现在看来都让人无比舒坦代码优秀程序员。

57920

.NET框架设计(常被忽视C#设计技巧)

testOrder.SumPrices(2); 49 50 Assert.AreEqual(result, 50.0F); 51 } 52 } 53 } 以往我基本不写单元测试...,但是最近工作基本都需要写每个方法单元测试,而且要求是100%覆盖,只有这样才能保证代码正确性;也建议大家以后多写单元测试,确实很有好处,我们应该把单元测试做起来;下面我们言归正传; 由于我们...,而第二个方法则使用委托调用;实现类里面还包含了一个简单接口; 1 using System; 2 using System.Collections.Generic; 3 using System.Linq...(设计架构接口(Interface)时要注意对象协变、逆变) 越来越多的人喜欢自己捣鼓点东西出来用用,这很不错,时间长了设计能力自然会得到提升;但是最近发现我们很多泛型设计缺乏转换控制,也就是这里协变和逆变...List(); 2 IEnumerable items = apples; 很容易就可以得到集合转换,虽然很简单功能但是设计如果运用好的话能大大改变接口灵活性;

1.9K71

常用vim命令总结

+ -和上面的j k有什么不同之处 j k也是移动到上一行和下一行,但它们移动是光标所在位置 + -不管你光标何处,总是移动到下一行或一行行首 单词移动 W w...将光标放到任意符号,然后通过 % 来移动到和这个符号匹配符号,% 还可以正确识别括号嵌套层数,总是移动到真正匹配位置。...现在我们知道错在哪儿了,修正一下,然后使用":cn"命令(或者Quickfix List对应行输入回车)跳到下一个出错地方,以此类推,直到修正全部错误。...乍一看这个例子,似乎Quickfix并没有提高什么效率,但如果你错误出现在多个不同目录不同文件里,它可以帮你省很多时间,使你可以集中精力修正bug。...你可以使用Tlist_Max_Submenu_Items和Tlist_Max_Tag_Length来控制菜单条目数和所显示tag名字长度; - 缺省情况下,双击一个tag时,才会跳到该tag定义位置

1.7K10
领券