« ■ASAドライバー用エントリ修正 | トップページ | ☆TMyListの使用例 »

☆ArrayListを使ったクラス

[Windowsフォームアプリケーション]
今までTListを多用してきましたが、Windowsフォームアプリケーションでは、基本的にそれが使えません。リストから自作する必要があるのかなとあきらめていたところ System.Collections.ArrayList というものを見つけました。早速簡単なクラスを作ってみましたが、TListと同じように使えるので、これで問題はなさそうです。

<TMyItemクラスをTMyListクラスで管理する。>
uses System.IO;

 TMyItem = class(TObject)
 private
  FNo: Integer;
  FItem: String;
 public
  constructor Create(No: Integer; Item: String);
 published
  property No: Integer read FNo write FNo;
  property Item: String read FItem write FItem;
 end;

 TMyList = class(TObject)
 private
  FList: ArrayList;
  function GetData(Index: Integer): TMyItem;
  procedure SetData(Index: Integer; MyItem: TMyItem);
  function GetCount: Integer;
 protected
  procedure Error;
 public
  constructor Create;
  procedure Clear; 
  function Add(MyItem: TMyItem): Integer;
  procedure Insert(Index: Integer; MyItem: TMyItem);
  procedure Delete(Index: Integer);
  procedure SaveToFile(const FileName: String);
  procedure LoadFromFile(const FileName: String);
  property Items[Index: Integer]: TMyItem read GetData
   write SetData; default;
 published
  property Count: Integer read GetCount;
 end;

{ TMyItem }

constructor TMyItem.Create(No: Integer; Item: String);
begin
 inherited Create;
 FNo := No;
 FItem := Item;
end;

{ TMyList }

constructor TMyList.Create;
begin
 inherited Create;
 FList := ArrayList.Create;
end;

procedure TMyList.Clear;
begin
 FList.Clear;
end;

procedure TMyList.Error;
const
 Mes = 'インデックスがリストの範囲を超えています';
begin
 raise Exception.Create(Mes);
end;

function TMyList.GetCount: Integer;
begin
 Result := FList.Count;
end;

function TMyList.GetData(Index: Integer): TMyItem;
begin
 if (Index < 0) or (Index >= FList.Count) then Error;
 Result := TMyItem(FList[Index]);
end;

procedure TMyList.SetData(Index: Integer; MyItem: TMyItem);
begin
 if (Index < 0) or (Index >= FList.Count) then Error;
 FList[Index] := MyItem;
end;

function TMyList.Add(MyItem: TMyItem): Integer;
begin
 Result := FList.Add(MyItem);
end;

procedure TMyList.Insert(Index: Integer; MyItem: TMyItem);
begin
 FList.Insert(Index, MyItem);
end;

procedure TMyList.Delete(Index: Integer);
begin
 TMyItem(FList[Index]).Free;
 FList.RemoveAt(Index);
end;

procedure TMyList.SaveToFile(const FileName: String);
var
 fs: FileStream;
 I: Integer;
 w: BinaryWriter;
begin
 fs := FileStream.Create(FILENAME, FileMode.CreateNew);
 try
  w := BinaryWriter.Create(fs);
  try
   w.Write(FList.Count);
   for I := 0 to Count -1 do
   begin
    w.Write(TMyItem(FList[I]).No);
    w.Write(TMyItem(FList[I]).Item);
   end;
  finally
   W.Close;
  end;
 finally
  fs.Close;
 end;
end;

procedure TMyList.LoadFromFile(const FileName: String);
var
 fs: FileStream;
 I, J: Integer;
 r: BinaryReader;
 No: Integer;
 Item: String;
begin
 FList.Clear;
 fs := FileStream.Create(FILENAME, FileMode.Open, FileAccess.Read);
 try
  r := BinaryReader.Create(fs);
  try
   J := r.ReadInt32;
   for I := 0 to J -1 do
   begin
    No := r.ReadInt32;
    Item := r.ReadString;
    FList.Add(TMyItem.Create(No, Item));
   end;
  finally
   r.Close;
  end;
 finally
  fs.Close;
 end;
end;

※注釈は面倒なので入れていません。
※かなり適当に書いたので、間違いがあるかもしれません。

|

« ■ASAドライバー用エントリ修正 | トップページ | ☆TMyListの使用例 »