1

使用此过程时,我收到一个抽象错误(仅此而已)。我在其他项目中使用此程序,这是我第一次遇到它。我不确定它是否与输入字符串的语法有关。

procedure SplitString(const Delimiter: Char; Input: string; const Strings: TStrings);
begin
  //Delimits or splits the received string, returns TStrings array
   Assert(Assigned(Strings)) ;
   Strings.Clear;
   Strings.Delimiter := Delimiter;
   Strings.StrictDelimiter := True; //needed otherwise whitespace is used to delimit
   Strings.DelimitedText := Input;
end;

应用程序调用如下:

      try
        LBOMPartLine := TStrings.Create;
        SplitString(',','C:\DATA\Parts\PART4.PS.0,10,10',LBOMPartLine);
      ...

我删除了一些调试代码,这些代码突出了程序失败的事实,之后或之前都没有。我可以不使用逗号作为分隔符吗?

4

2 回答 2

12

问题在于这一行:

LBOMPartLine := TStrings.Create;

TStrings是一个抽象类,你不能创建它的实例。您必须创建后代的实例,例如TStringList文档清楚地说(强调):

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

您通常TStrings用作函数或过程接收的参数的类型,以便您可以接受任何后代,TStrings例如TMemo.Lines`。TStringListTComboBox.Items', or

解决方案是创建后代的实例:

var
  LBOMPartLine: TStrings; // or more clearly, TStringList
begin
  LBOMPartLine := TStringList.Create;
  try
    SplitString(',','C:\DATA\Parts\PART4.PS.0,10,10',LBOMPartLine);
    // Do whatever else
  finally
    LBOMPartLine.Free;
  end;
end;
于 2013-09-07T02:40:54.793 回答
6

TStrings是一个抽象类,这就是你得到抽象错误的原因。LBOMPartLine必须声明为TStringList,它是TStrings类的后代。

编译器警告您实例化具有抽象方法的类 - 我建议您不要忽略警告并尝试编写正确的代码,没有它们。

此外,类创建应该在块之外try/finally完成:

some_class := TSomeClass.Create;
try
  ..
finally
  some_class.Free;
end;
于 2013-09-07T02:33:57.273 回答