☆TListを使ったリスト No2
前回、作成したTHRBase、THRBaseListを使って本と著者名を管理するリストを作ってみます。
又、リストをファイルに読み書きできるように拡張します。
わざわざ、HRBaseClassesというユニットを作ったのは、このように必要な部分のみを拡張して使うことを意図していたからです。
☆TListを使ったリスト No1
☆TListを使ったリスト No2
☆TListを使ったリスト No3
わざわざ、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
| 固定リンク