新しい文字列リストを作成する
文字列リストの操作 への移動
通常、文字列リストはコンポーネントの一部です。ただし、検索テーブルの文字列を保存する場合など、独立した文字列リストを作成すると便利な場合があります。文字列リストの作成と管理の方法は、文字列リストが短期リストか(単一のルーチンで作成、使用、破棄する)長期リストか(アプリケーションが終了するまで有効)によって異なります。どちらの文字列リストを作成する場合でも、使用しなくなる時点でリストを解放するように設計する必要があります。
短期文字列リスト
単一ルーチンの存続期間の中でのみ文字列リストを使用する場合は、作成、使用、破棄のすべてを 1 つの場所で行えます。これは、文字列リストを操作する最も安全な方法です。
メモリは文字列リスト自体と各文字列に割り当てられます。したがって、例外が生じた場合でもメモリが解放されるように、try... finally ブロックで保護する必要があります。
短期文字列リストを作成するには:
- 文字列リスト オブジェクトを作成します。
- try... finally ブロックの try 部で、文字列リストを使用します。
- finally 部で文字列リスト オブジェクトを解放します。
メモリは文字列リスト自体と各文字列に割り当てられます。したがって、例外が生じた場合でもメモリが解放されるように、try...__finally
ブロックで保護する必要があります。
短期文字列リストを作成するには:
- 文字列リスト オブジェクトを作成します。
try...__finally
ブロックの try 部で、文字列リストを使用します。__finally
部で文字列リスト オブジェクトを解放します。
次の例に示すイベント ハンドラは、ボタン クリックに応答して文字列リストを作成して使用してから、文字列リストを破棄しています。
procedure TForm1.Button1Click(Sender: TObject);
var TempList: TStrings;{ リストを宣言する }
begin
TempList := TStringList.Create;{ リスト オブジェクトを構築する }
try { 文字列リストを使用する }
finally TempList.Free;{ リスト オブジェクトを破棄する }
end;
end;
void __fastcall TForm1::ButtonClick1(TObject *Sender)
{
TStringList *TempList = new TStringList; // リストを宣言する
try {
// 文字列リストを使用する
}
__finally {
delete TempList; // リスト オブジェクトを破棄する
}
}
長期文字列リスト
アプリケーションの実行中に文字列リストをいつでも利用できるようにするには、アプリケーションの起動時に文字列リストを作成し、アプリケーションの終了前に破棄します。
長期文字列リストを作成するには:
- アプリケーションのメインフォーム用のユニット ファイルで、フォームの宣言部に TStrings 型のフィールドを追加します。
- メイン フォームの OnCreate イベントのイベント ハンドラを記述します。このイベント ハンドラはフォームが表示される前に実行されます。これにより文字列リストが作成され、手順 1 で宣言したフィールドに文字列リストが代入されます。
- フォームの OnClose イベント用に、文字列リストを解放するイベント ハンドラを作成します。
以下に示す例では、長期文字列リストを使ってユーザーのメイン フォーム上のマウス クリックを記録し、アプリケーション終了前にリストをファイルに保存しています。
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
type TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
private
{ private 宣言 }
public
{ public 宣言 }
ClickList: TStrings;{ フィールドを宣言する }
end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
ClickList := TStringList.Create;{ リストを構築する }
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
ClickList.SaveToFile(ChangeFileExt(Application.ExeName, '.log'));{ リストを保存する }
ClickList.Free;{ リスト オブジェクトを破棄する }
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ClickList.Add(Format('Click at (%d, %d)', [X, Y]));{ 文字列をリストに追加する }
end;
end.
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
ClickList = new TStringList;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
ClickList->SaveToFile(ChangeFileExt(Application->ExeName, ".LOG"));// リストを保存する
delete ClickList;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
TVarRec v[] = {X,Y};
ClickList->Add(Format("Click at (%d, %d)",v,ARRAYSIZE(v) - 1));// 文字列をリストに追加する
}
メモ: OnCreate や OnDestroy などのイベントを使ってクラスを割り当て、解放できますが、通常は、クラスのコンストラクタとデストラクタを使用する方が安全なコーディング方法です。