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

Delphi 将TStringList更改为TStrings时出现抽象错误,delphi,Delphi,好吧,这变得很愚蠢 这是第二次,第一次是30分钟前,在一个获取目录树的函数上,我曾经看到过错误抽象错误,真的不知道为什么会发生 我有这个功能,列出所有硬盘: function TForm2.GetDriveList:TStringList; var s:string; i:integer; DriveStr:array[1..255] of char; t:integer; begin GetLogicalDriveStrings(255,@Driv

好吧,这变得很愚蠢

这是第二次,第一次是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;
从代码中删除结果,并在末尾添加List.Adds

在我的第一个案例中,这个函数以某种方式解决了这个问题,但在这个案例中没有

我的问题是: 上面的代码有什么错误,为什么不接受T字符串

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

是一个抽象基类。它不能被实例化。它是具体派生类的公共基类。比如TStringList,比如TMemo、TListBox等公开的TStrings派生类。文件说:

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

从tstring派生一个类来存储和操作字符串列表。TSRON包含抽象的或C++的术语,纯的虚拟方法,不应该直接实例化。 这条规则规定得很清楚。不要实例化tstring

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

如果您不熟悉什么是抽象方法,那么您需要返回文档并复习您的知识。从这里开始:

是一个抽象基类。它不能被实例化。它是具体派生类的公共基类。比如TStringList,比如TMemo、TListBox等公开的TStrings派生类。文件说:

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

从tstring派生一个类来存储和操作字符串列表。TSRON包含抽象的或C++的术语,纯的虚拟方法,不应该直接实例化。 这条规则规定得很清楚。不要实例化tstring

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


如果您不熟悉什么是抽象方法,那么您需要返回文档并复习您的知识。从这里开始:

您不应该实例化tstring。请查阅精细文档。这是什么意思?实例化。。。?如果我尝试将StringList结果分配给TStrings类型的变量,则会出现相同的错误。。。为什么它与Listbox1.Items.Assign一起工作,其中Items是Tstring…?这是因为TListBox.Items在内部不是Tstring,但这是完全不同的情况。好的,现在知道了。从大卫的回答中,我明白你们俩的意思了…@TLama谢谢!看起来不错。我必须尝试一下,虽然现在上面的代码也可以根据需要工作,所以。。。但最好有另一个/更好的选择:不应该实例化tstring。请查阅精细文档。这是什么意思?实例化。。。?如果我尝试将StringList结果分配给TStrings类型的变量,则会出现相同的错误。。。为什么它与Listbox1.Items.Assign一起工作,其中Items是Tstring…?这是因为TListBox.Items在内部不是Tstring,但这是完全不同的情况。好的,现在知道了。从大卫的回答中,我明白你们俩的意思了…@TLama谢谢!看起来不错。我必须尝试一下,虽然现在上面的代码也可以根据需要工作,所以。。。但是有另一个/更好的选择很好:Ok。所以说,永远不要使用TStrings类型。承认。。。我不知道。。。老兄,那太有趣了不,你可以使用TStrings。例如,作为参数类型,以便与任何子代兼容。只是不要实例化它。就像TStream一样。是的,我知道我仍然可以将它作为参数传递,但是我不能声明它,否则…?你可以将一个变量声明为TStrings类型,并分配一个派生类的实例。您只是不能实例化tstring。你唯一不能做的事情就是TStrings.Create。@LDFreak也许你根本不理解instantiate这个词的意思。简单地说,就是在创建实例时,因此使用术语similarity.Ok。所以说,永远不要使用TStrings类型。承认。。。我不知道。。。老兄,那太有趣了不,你可以使用TStrings。例如,作为参数类型,以便与任何子代兼容。只是不要实例化它。就像TStream一样。是的,我知道我仍然可以把它作为参数传递,但是
否则我不能声明它…?您可以将变量声明为TStrings类型,并分配派生类的实例。您只是不能实例化tstring。你唯一不能做的事情就是TStrings.Create。@LDFreak也许你根本不理解instantiate这个词的意思。简单地说,就是在创建实例时,因此术语相似性。
procedure TFrom2.GetDriveList(List: TStrings);