将TStringList更改为TStrings时的抽象错误

时间:2014-11-28 22:28:25

标签: delphi

好的,这变得非常愚蠢......

这是第二次(第一次是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不被接受......?

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

1 个答案:

答案 0 :(得分:10)

TStrings是一个抽象基类。它不能被实例化。它存在于具体派生类的公共基类。与TStringList类似,例如TStringsTMemo等公开的TListBox派生类。文档说:

  

TStrings是表示字符串列表的对象的基类。

     

从TStrings派生一个类来存储和操作字符串列表。 TStrings包含抽象或C ++术语中的纯虚方法,不应直接实例化。

该规则已明确说明。不要实例化TStrings

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

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