☆TMyListの使用例

[Windowsフォームアプリケーション]
☆ArrayListを使ったクラスで作成したTMyListの使用例です。
Button1をクリックすると、テストデータを作成して、ファイルに書き込みます。
Button2をクリックすると、ファイルからデータを読み込んでListViewに設定します。

 1.Windowsフォームアプリケーションを新規作成します。
 2.Button1, Button2, ListView1を配置します。
 3.フォームのPrivate宣言に
    MyList: TMyList;
   と記述します。
 4.下記の通りプログラムを記述します。

constructor TWinForm1.Create;
begin
 (略)
 MyList := TMyList.Create;

 //ListViewの設定
 ListView1.View := View.Details;
 ListView1.Columns.Add('No', 50, HorizontalAlignment.Center);
 ListView1.Columns.Add('Name', 200, HorizontalAlignment.Left);
end;

//SaveToFile
procedure TWinForm1.Button1_Click(sender: System.Object;
 e: System.EventArgs);
var
 I: Integer;
begin
 //ダミーデータの作成
 for I := 0 to 9 do
  MyList.Add(TMyItem.Create(I, 'Item'+Convert.ToString(I)));
 MyList.SaveToFile('c:\abc.dat');
end;

//LoadFromFile
procedure TWinForm1.Button2_Click(sender: System.Object;
 e: System.EventArgs);
var
 I: Integer;
 LI: ListViewItem;
begin
 MyList.LoadFromFile('c:\abc.dat');
 ListView1.Items.Clear;
 for I := 0 to MyList.Count -1 do
 begin
  LI := ListView1.Items.Add(Convert.ToString(MyList[I].No));
  LI.SubItems.Add(MyList[I].Item);
 end;
end;

※SaveToFileは2回目に実行したときにエラーになります。
 これに対応するためには、TMyListの procedure SaveToFile中の下記部分を変更します。
//fs := FileStream.Create(FILENAME, FileMode.CreateNew);
  fs := FileStream.Create(FILENAME, FileMode.Create);
  (FileMode.CreateNewではなく、FileMode.Createとします。)

|

☆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;

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

|

その他のカテゴリー

ADO | ADT | API | ArrayList | ASP.NET | BDE | BDP.NET | BdpConnection | Borland Developer Studio 2006 | CAPICOM | class | ClipBoard | CodeEditor | Convert.ToString | Custom component | DBExpress | Delphi 2005 | Delphi 2006 | Delphi 2007 | Delphi XE2 | Delphi7 | Delphi8 | Device Driver | Dialog | Docking | DocuWorks | Docuworks SDK | Drag&Drop | Evernote | EXCEL | Firebird | FireMonkey | Game | General | Generics | Google Earth COM API | Google Maps | Google SketchUp | Graphic | IDE | Imm | Indy | InstallAware Express6 | InterBase Admin | JWW | Microsoft SQL Server | MyBase | OnMouseDown | Oracle XE | Paradox | PreviewHandler | PrintDialog | PrintPreviewDialog | PropertyGrid | PSDファイル | Ribbon Controls | RichTextBox | Servers | SubClass | TAction | TActionList | TAnimate | TButton | TCategoryButtons | TClientDataSet | TComboBox | TComboBoxEx | TCustomEdit | TDBGrid | TDockTabSet | TDrawGrid | TEdit | TExcelApplication | TFont | TForm | third party | TImage | TLabel | TList | TListBox | TListView | TMemo | TOpenDialog | TOutlookApplication | TPageControl | TPanel | TRichEdit | TShellResources | TStringGrid | TTabControl | TToolBar | TToolButton | TTreeView | TWebBrowser | Update | VCL Styles | WinInet | XE2 | XPman | オープン配列パラメータ | グループ化 | トランスレーションマネージャー | ファイル処理 | ファイル名処理 | 動的配列 | 投票 | 文字列処理 | 日本語入力 | 暗号 | | 音声合成利用