お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"レコード型のデータをTListで読み書き"

この発言に対し以下のコメントが寄せられています
#01384 HATENA さん レコード型のデータをTListで2重ソート
#01385 HATENA さん レコード型データの読み書き(TFlieStream版

 レコード型のデータを、TList にセットしてファイルに保存、読み込みします。 ファイルの入出力は、プリミティブな(Pascal的な)型付きファイルを使っています。  データは DrawGrid に表示します。件数が多いときは、StringGrid よりはるか に高速です。ただし、編集するときは、OnGetEditText, OnSetEditText 等に自前 でコードを書く必要があります。 nifty:FDELPHI/MES/6/34796 の改訂版です。 フォームにボタンを3つと、DrawGrid を置いて下さい。 ボタンの名前は、btnSampleCreate, btnSave, btnLoad DrawGrid の OnDrawCell イベントで、自前でデータを描画します。 DrawGrid.RowCount に、検証したいデータ数をセットして下さい。 btnSampleCreateをクリックすると、サンプルデータを作成します。 unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls{, MMSystem}; type PSData = ^TSData; TSData = Packed Record Index1: Integer; Index2: Byte; Data1: Byte; Data2: Cardinal; end; TForm1 = class(TForm) btnSort: TButton; btnSampleCreate: TButton; btnSave: TButton; btnLoad: TButton; btnMLoad: TButton; Button1: TButton; DrawGrid1: TDrawGrid; procedure btnSortClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure btnSampleCreateClick(Sender: TObject); procedure btnSaveClick(Sender: TObject); procedure btnLoadClick(Sender: TObject); procedure DrawGrid1DrawCell(Sender: TObject; Col, Row: Integer; Rect: TRect; State: TGridDrawState); private { Private 宣言 } SDataList: TList; procedure DataClear; procedure DataLoadfromFile(FileName: String); procedure DataSaveToFile(FileName: String); public { Public 宣言 } end; var Form1: TForm1; // Start: integer; implementation {$R *.DFM} function MySort(Item1, Item2: Pointer): Integer; //2重ソート begin Result := PSdata(Item1)^.Index1 - PSdata(Item2)^.Index1; if Result = 0 then Result := PSdata(Item1)^.Index2 - PSdata(Item2)^.Index2; end; procedure TForm1.btnSortClick(Sender: TObject); begin SDataList.Sort(MySort); DrawGrid1.ReFresh; end; procedure TForm1.FormCreate(Sender: TObject); begin SDataList := TList.Create; end; procedure TForm1.FormDestroy(Sender: TObject); begin DataClear; SDataList.Free; end; procedure TForm1.DataClear; var i: integer; SData: PSdata; begin for i := 0 to (SDataList.Count - 1) do begin SData := SDataList.Items[i]; Dispose(SData); end; SDataList.Clear; end; procedure TForm1.DataLoadfromFile(FileName: String); var F: file of TSData; SData: PSdata; begin // Start := TimeGetTime; AssignFile(F, FileName); ReSet(F); while not eof(F) do begin New(SData); Read(F, SData^); SDataList.Add(SData); end; CloseFile(F); DrawGrid1.RowCount := SDataList.Count; DrawGrid1.ReFresh; // ShowMessage(IntToStr(TimeGetTime - Start)); end; procedure TForm1.DataSaveToFile(FileName: String); var F: file of TSData; SData: PSData; i: integer; begin // Start := TimeGetTime; AssignFile(F, FileName); Rewrite(F); for i := 0 to SDataList.Count-1 do begin SData := SDataList.Items[i]; Write(F, SData^); end; CloseFile(F); // ShowMessage(IntToStr(TimeGetTime - Start)); end; procedure TForm1.btnSampleCreateClick(Sender: TObject); var SData: PSdata; i: integer; begin DataClear; Randomize; for i := 0 to DrawGrid1.RowCount-1 do begin New(SData); SData^.Index1 := Random(1000); // SData^.Index2 := Random(255); SData^.Data1 := 5; SData^.Data2 := i; SDataList.Add(SData); end; DrawGrid1.Refresh; end; procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var SData: PSdata; begin if ARow >= SDataList.Count then Exit; with (Sender as TDrawGrid).Canvas do begin FillRect(Rect); SData := SDataList.Items[ARow]; //検証用なので、選択時の反転処理などは省いています。 case ACol of 0: TextOut(Rect.Left, Rect.Top, IntToStr(SData^.Index1)); 1: TextOut(Rect.Left, Rect.Top, IntToStr(SData^.Index2)); 2: TextOut(Rect.Left, Rect.Top, IntToStr(SData^.Data1)); 3: TextOut(Rect.Left, Rect.Top, IntToStr(SData^.Data2)); end; end; end; procedure TForm1.btnSaveClick(Sender: TObject); begin DataSaveToFile('Sample.dat'); end; procedure TForm1.btnLoadClick(Sender: TObject); begin DataClear; DataLoadFromFileM('Sample.dat'); end; end. 01/09/17(月) 16:22 HATENA(GFC03235)  Original document by HATENA 氏 ID:(GFC03235)



ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum