【问题标题】:Abstract error when splitting a string拆分字符串时出现抽象错误
【发布时间】:2013-09-07 02:16:30
【问题描述】:

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

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);
      ...

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

【问题讨论】:

  • 你能显示文字错误信息吗?它只是一个弹出对话框,只是说“抽象错误”吗?它与其他项目中的 Delphi 版本是否相同?什么版本?

标签: string delphi split delimiter


【解决方案1】:

问题出在这一行:

LBOMPartLine := TStrings.Create;

TStrings 是一个抽象类,你不能创建它的实例。您必须创建后代的实例,例如 TStringListdocumentation 明确表示(添加了强调):

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

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

解决办法是创建一个后代的实例:

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;

【讨论】:

    【解决方案2】:

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

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

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

    some_class := TSomeClass.Create;
    try
      ..
    finally
      some_class.Free;
    end;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-26
      • 1970-01-01
      • 2018-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      • 1970-01-01
      相关资源
      最近更新 更多