3

メモフィールド内のパラドックステーブルに保存されている大量のデータを調べる必要があります。このデータを1行ずつ処理し、各行を処理する必要があります。

メモフィールドの各行を1行ずつフェッチするようにDelphiに指示するにはどうすればよいですか?

#13#10を区切り文字として使用できますか?

4

2 に答える 2

4

メモフィールドにあるものが行区切り文字として#13#10を使用していると仮定すると、メモフィールドのテキストを別々の行に分割するためTStringListの非常に便利なプロパティであるを使用します。Text

var
  StringList: TStringList;
  Line: string;
.....
StringList.Text := MemoFieldText;
for Line in StringList do
  Process(Line);

メモフィールドがUnixの改行を使用している場合でも、このコードはメモフィールドを正しく解釈します。

于 2012-04-06T20:33:28.883 に答える
1

これは、フィールドがParadoxで実際にどのように宣言されているかによって異なります。TMemoFieldの場合、それは非常に簡単です。

var
  SL: TStringList;
  Line: string;
begin
  SL := TStringList.Create;
  try
    SL.Text := YourMemoField.GetAsString;
    for Line in SL do
     // Process each line of text using `Line`
  finally
    SL.Free;
  end;
end;

TBlobFieldの場合は、もう少し複雑です。を使用してメモフィールドを読み取り、TBlobStreamそのストリームのコンテンツをTStringList:にロードする必要があります。

// For Delphi versions that support it:
procedure LoadBlobToStringList(const DS: TDataSet; const FieldName: string;
  const SL: TStringList);
var
  Stream: TStream;
begin
  Assert(Assigned(SL), 'Create the stringlist for LoadBlobToStringList!');
  SL.Clear;
  Stream := DS.CreateBlobStream(DS.FieldByName(FieldName), bmRead);
  try
    SL.LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
end;

// For older Delphi versions that do not have TDataSet.CreateBlobStream
procedure LoadBlobToStringList(const DS: TDataSet; const TheField: TField; 
  const SL: TStringList);
var
  BlobStr: TBlobStream;
begin
  Assert(Assigned(SL), 'Create the stringlist for LoadBlobToStringList!');
  SL.Clear;
  BlobStr := TBlobStream.Create(DS.FieldByName(TheField), bmRead);
  try
    SL.LoadFromStream(BlobStr);
  finally
    BlobStr.Free;
  end;
end;

// Use it
var
  SL: TStringList;
  Line: string;
begin
  SL := TStringList.Create;
  LoadBlobToStringList(YourTable, YourMemoFieldName, SL);
  for Line in SL do
    // Process each Line, which will be the individual line in the blob field

  // Alternatively, for earlier Delphi versions that don't support for..in
  // declare an integer variable `i`
  for i := 0 to SL.Count - 1 do
  begin
    Line := SL[i];
    // process line of text using Line
  end;
end;
于 2012-04-06T20:52:15.420 に答える