« ☆TListを使ったリスト No1 | トップページ | ☆TListを使ったリスト No3 »

☆TListを使ったリスト No2

前回、作成したTHRBase、THRBaseListを使って本と著者名を管理するリストを作ってみます。 又、リストをファイルに読み書きできるように拡張します。
わざわざ、HRBaseClassesというユニットを作ったのは、このように必要な部分のみを拡張して使うことを意図していたからです。
unit MySampleClasses;

interface

uses
  SysUtils, Classes, HRBaseClasses;

type
  TMyBook = class(THRBase)
  private
    FBookName: String;
    FAuthor: String;
  public
    constructor Create(BookName, Author: String);
    procedure SaveToStream(var Stream: TStream);
    procedure LoadFromStream(Stream: TStream);
    procedure Assign(Source: TPersistent); override;
  published
    property BookName: String read FBookName write FBookName;
    property Author: String read FAuthor write FAuthor;
  end;

  TMyBookList = class(THRBaseList)
  private
    function GetData(Index: Integer): TMyBook;
    procedure SetData(Index: Integer; MyBook: TMyBook);
  public
    procedure SaveToStream(var Stream: TStream);
    procedure LoadFromStream(Stream: TStream);
    procedure SaveToFile(const FileName: String);
    procedure LoadFromFile(const FileName: String);
    procedure Assign(Source: TPersistent); override;
    property Items[Index: Integer]: TMyBook
      read GetData write SetData; default;
  end;

implementation

// Streamに文字列を書き込みます。
procedure WriteStringToStream(var Stream: TStream; Value: String);
var
  I: Integer;
begin
  with Stream do
  begin
    I := Length(Value);
    WriteBuffer(I, SizeOf(Integer));
    WriteBuffer(PChar(Value)^, I);
  end;
end;

// Streamから文字列に読み込みます。
function ReadStringFromStream(const Stream: TStream): String;
var
  I: Integer;
begin
  with Stream do
  begin
    ReadBuffer(I, SizeOf(Integer));
    SetLength(Result, I);
    ReadBuffer(PChar(Result)^, I);
  end;
end;

{ TMyBook }

constructor TMyBook.Create(BookName, Author: String);
begin
  inherited Create;
  FBookName:= BookName;
  FAuthor := Author;
end;

procedure TMyBook.Assign(Source: TPersistent);
begin
  if (Source is TMyBook) then
  begin
    BookName:= (Source as TMyBook).BookName;
    Author := (Source as TMyBook).Author;
    Exit;
  end;
  inherited Assign(Source);
end;

procedure TMyBook.LoadFromStream(Stream: TStream);
begin
  FBookName := ReadStringFromStream(Stream);
  FAuthor := ReadStringFromStream(Stream);
end;

procedure TMyBook.SaveToStream(var Stream: TStream);
begin
  WriteStringToStream(Stream, FBookName);
  WriteStringToStream(Stream, FAuthor);
end;

{ TMyBookList }

procedure TMyBookList.SetData(Index: Integer; MyBook: TMyBook);
begin
  List[Index] := MyBook;
end;

function TMyBookList.GetData(Index: Integer): TMyBook;
begin
  Result := TMyBook(List[Index]);
end;

procedure TMyBookList.Assign(Source: TPersistent);
var
  I: Integer;
  MyBook: TMyBook;
begin
  if (Source is TMyBookList) then
  begin
    Clear;
    for I := 0 to (Source as TMyBookList).Count -1 do
    begin
      MyBook := TMyBook.Create('','');
      MyBook.Assign((Source as TMyBookList)[I]);
      Add(MyBook);
    end;
    Exit;
  end;
  inherited Assign(Source);
end;

procedure TMyBookList.LoadFromStream(Stream: TStream);
var
  I, K: Integer;
  MyBook: TMyBook;
begin
  Clear;
  Stream.ReadBuffer(K, SizeOf(Integer));

  for I := 0 to K -1 do
  begin
    MyBook := TMyBook.Create('','');
    MyBook.LoadFromStream(Stream);
    Add(MyBook);
  end;
end;

procedure TMyBookList.SaveToStream(var Stream: TStream);
var
  I: Integer;
begin
  I := Count;
  Stream.WriteBuffer(I, SizeOf(Integer));

  for I := 0 to Count -1 do
    TMyBook(List[I]).SavetoStream(Stream);
end;

procedure TMyBookList.SaveToFile(const FileName: String);
var
  Stream: TFileStream;
begin
  Stream := TFileStream.Create(FileName, fmCreate or fmShareExclusive);
  try
    Stream.Seek(0, soFromBeginning);
    SaveToStream(TStream(Stream));
  finally
    Stream.Free;
  end;
end;

procedure TMyBookList.LoadFromFile(const FileName: String);
var
  Stream: TFileStream;
begin
  Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    Stream.Seek(0, soFromBeginning);
    LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
end;


end.

TListを使ったリスト No1
TListを使ったリスト No2
TListを使ったリスト No3

|

« ☆TListを使ったリスト No1 | トップページ | ☆TListを使ったリスト No3 »