好的,这变得非常愚蠢......
这是第二次(第一次是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,并在尝试调用时得到此Abstract错误;
我还尝试将其更改为过程,如
procedure TFrom2.GetDriveList(List: TStrings);
从代码中删除结果,并在最后使用List.Add;
这个(程序的功能)在我的第一个案例中以某种方式解决了这个问题,但是没有解决这个问题。
我的问题是: 上面的代码有什么问题,为什么TStrings不被接受......?
和:这些抽象错误究竟是什么,如何识别它们,因为它们在函数/过程的最后出现(通过调试检查),基本上已经完成了?
答案 0 :(得分:10)
TStrings
是一个抽象基类。它不能被实例化。它存在于具体派生类的公共基类。与TStringList
类似,例如TStrings
,TMemo
等公开的TListBox
派生类。文档说:
TStrings是表示字符串列表的对象的基类。
从TStrings派生一个类来存储和操作字符串列表。 TStrings包含抽象或C ++术语中的纯虚方法,不应直接实例化。
该规则已明确说明。不要实例化TStrings
。
抽象错误是调用抽象方法时出现的运行时错误。抽象方法是一种没有实现的虚方法。抽象方法无法调用。这就是不应该实例化抽象类的原因。
如果您不熟悉抽象方法,那么您需要回到文档并提升您的知识。从这里开始:http://docwiki.embarcadero.com/RADStudio/en/Methods#Virtual_and_Dynamic_Methods