7

Delphi 2009 には次の構造があります。

type
  IndiReportIndi = record
    IndiName: string;
    NameNum: integer;
    ReportIndiName: string;
  end;

var
  XRefList: array of IndiReportIndi;

ここで、XRefList は動的配列です。

XRefList を FileStream に保存したいと考えています。後でその FileStream からロードしたときに、すべての IndiName および ReportIndiName 文字列を再度取得できるようにするにはどうすればよいですか?

4

5 に答える 5

10
type
  IndiReportIndi = record
    IndiName: string;
    NameNum: integer;
    ReportIndiName: string;
    procedure SaveToStream(Stream: TStream);
    procedure LoadFromStream(Stream: TStream);
  end;

type
  TXRefList = array of IndiReportIndi;

function LoadString(Stream: TStream): string;
var
  N: Integer;

begin
  Result:= '';
  Stream.ReadBuffer(N, SizeOf(Integer));
  if N > 0 then begin
    SetLength(Result, N);
//    Stream.ReadBuffer(Result[1], N * SizeOf(Char));
// fast version - see comment by A.Bouchez
    Stream.ReadBuffer(Pointer(Result)^, N * SizeOf(Char));
  end;
end;

procedure SaveString(Stream: TStream; const S: string);
var
  N: Integer;

begin
  N:= Length(S);
  Stream.WriteBuffer(N, SizeOf(Integer));
  if N > 0 then
//    Stream.WriteBuffer(S[1], N * SizeOf(Char));
// fast version - see comment by A.Bouchez
    Stream.WriteBuffer(Pointer(S)^, N * SizeOf(Char));
end;

procedure IndiReportIndi.LoadFromStream(Stream: TStream);
var
  S: string;

begin
  IndiName:= LoadString(Stream);
  Stream.ReadBuffer(NameNum, SizeOf(Integer));
  ReportIndiName:= LoadString(Stream);
end;

procedure IndiReportIndi.SaveToStream(Stream: TStream);
begin
  SaveString(Stream, IndiName);
  Stream.WriteBuffer(NameNum, SizeOf(Integer));
  SaveString(Stream, ReportIndiName);
end;

function LoadXRefList(Stream: TStream): TXRefList;
var
  N: Integer;
  I: Integer;

begin
  Stream.ReadBuffer(N, SizeOf(Integer));
  if N <= 0 then Result:= nil
  else begin
    SetLength(Result, N);
    for I:= 0 to N - 1 do
      Result[I].LoadFromStream(Stream);
  end;
end;

procedure SaveXRefList(Stream: TStream; const List: TXRefList);
var
  N: Integer;
  I: Integer;

begin
  N:= Length(List);
  Stream.WriteBuffer(N, SizeOf(Integer));
  for I:= 0 to N - 1 do
    List[I].SaveToStream(Stream);
end;
于 2010-12-07T05:13:02.110 に答える
6

使用:http ://code.google.com/p/kblib/

type
  IndiReportIndi = record
    IndiName: string;
    NameNum: integer;
    ReportIndiName: string;
  end;

  TXRefList = array of IndiReportIndi;

var
  XRefList: TXRefList;

XRefList全体をストリームに保存するには、次のようにします。

TKBDynamic.WriteTo(lStream, XRefList, TypeInfo(TXRefList));

それをロードバックするには:

TKBDynamic.ReadFrom(lStream, XRefList, TypeInfo(TXRefList));
于 2010-12-07T14:24:41.200 に答える
5
var
  S: TStream;
  W: TWriter;
  A: array of IndiReportIndi;
  E: IndiReportIndi;
  ...
begin
  S := nil;
  W := nil;
  try 
    S := TFileStream.Create(...);
    W := TWriter.Create(S);
    W.WriteInteger(Length(A));
    for E in A do
    begin
      W.WriteString(E.IndiName);
      W.WriteInteger(E.NameNum);
      W.WriteString(E.ReportIndiName);
    end;
  finally
    W.Free;
    S.Free
  end;
end;  

これらのデータを読み取るには、TReader と ReadInteger/ReadString を使用します。

于 2010-12-07T10:17:22.553 に答える
1

変数を保存する単純な TFileStreamEx

http://forum.chertenok.ru/viewtopic.php?t=4642

問題なく、2005年から彼らと一緒に働きます...

于 2011-07-11T07:30:24.037 に答える
0

答えを正確にするために:

TDynArray任意のレコードをバイナリにシリアル化し、動的配列との間でシリアル化できるラッパーを検討することを検討してください。

TList新しいメソッド (ハッシュやバイナリ検索など) を含む、多くの類似のメソッドがあります。

速度とディスクの使用に最適化されており、XE2 までの Delphi 5 とオープン ソースで動作します。

動的配列を TList に格納する方法も参照してください。

于 2011-11-08T07:17:24.840 に答える