gpt4 book ai didi

delphi - 将 TStringList 更改为 TStrings 时出现抽象错误

转载 作者:行者123 更新时间:2023-12-03 18:56:21 25 4
gpt4 key购买 nike

好吧,这变得很傻了......

这是第二次(第一次是在 30 分钟前,在一个获取目录树的函数上)我曾经看到错误“抽象错误”,真的不知道为什么会发生。

我有这个功能,列出所有的硬盘:

function TForm2.GetDriveList:TStringList;
var
s:string;
i:integer;
DriveStr:array[1..255] of char;
t:integer;
begin
GetLogicalDriveStrings(255,@DriveStr);
result:=TStringList.create;
i:=1;
repeat
s:='';
while (i<=255) and (DriveStr[i]<>#00) do
begin
s:=s+char(drivestr[i]);
inc(i);
end;
inc(i); {step over #00}
t:=getdrivetype(Pchar(s));
if (length(s)>0) and (t=DRIVE_FIXED)

then result.add(s);
until length(s)=0;

end;

现在,我将 TStringList 更改为 TStrings,但在尝试调用它时出现此抽象错误;

我也试过把它改成过程,因为

procedure TFrom2.GetDriveList(List: TStrings);

从代码中删除结果,并在末尾添加 List.Add(s);

这个(函数到过程)以某种方式解决了我第一个案例中的问题,但没有解决这个问题。

我的问题是:上面的代码有什么问题,为什么不接受 TStrings...?

并且:这些抽象错误到底是什么,如何识别它们,因为它们出现(通过调试检查)在函数/过程的最后,在它基本上已经完成之后?

最佳答案

TStrings是一个抽象基类。它不能被实例化。它作为具体派生类的公共(public)基类而存在。比如 TStringList,比如 TMemo 公开的 TStrings 派生类,TListBox 等等。文档说:

TStrings is the base class for objects that represent a list of strings.

Derive a class from TStrings to store and manipulate a list of strings. TStrings contains abstract or, in C++ terminology, pure virtual methods and should not be directly instantiated.

规则说的很清楚。不要实例化 TStrings

抽象错误是调用抽象方法时出现的运行时错误。抽象方法是没有实现的虚方法。不能调用抽象方法。这就是为什么不应该实例化抽象类的原因。

如果您不熟悉什么是抽象方法,那么您需要返回文档并复习您的知识。从这里开始:http://docwiki.embarcadero.com/RADStudio/en/Methods#Virtual_and_Dynamic_Methods

关于delphi - 将 TStringList 更改为 TStrings 时出现抽象错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27196682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com