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++ 用語では純粋仮想メソッド) が含まれており、直接インスタンス化することはできません。

通常、関数またはプロシージャが受け取るパラメータの型として を使用して、TMemo.Lines`などのTStrings任意の子孫を受け入れることができます。TStringsTStringListTComboBox.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 に答える