|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"起動時にキャプションを初期化"
みなさん、こんにちは。十兵衛です。
TLabelやTEditをたくさん使ったアプリケーションではそのラベルやエディット
の初期化作業が面倒ですよね。
Label1.Caption := '';Edit1.Text := '';のようにコンポによってテキストを保
持するプロパティ名が違うので処理内容の分岐を考慮したコーディングが必要で
す。しかしこれらのプロパティはTCaption型なので実行時型情報を使えば何とか
なりそうです。
《参考:InsideDelphi》
TCaptionを初期化作業するクラスとして実現しています。
------------------------ここから---------------------------------------
unit CaptionInit;
interface
uses
SysUtils, Classes, Forms, TypInfo;
type
TCapInit = class
private
FInitStr: string;
FForm:TCustomForm;
FTargetTag: Integer;
procedure SetTargetTag(const Value: Integer);
protected
procedure SetInitStr(Value:string);
procedure InitializeCaption(AComponent:TComponent);virtual;
public
constructor Create(AForm:TCustomForm);virtual;
procedure Execute;
//初期化する文字列を設定する
property InitStr:string read FInitStr write SetInitStr;
//初期化対象のコンポーネントのTagプロパティを設定する
property TargetTag:Integer read FTargetTag write SetTargetTag;
end;
implementation
{ TCapInit }
constructor TCapInit.Create(AForm: TCustomForm);
begin
if not Assigned(AForm) then
raise Exception.Create('TCapInitクラスを生成出来ません');
FForm := AForm;
FTargetTag := 1;
FInitStr := '';
end;
procedure TCapInit.Execute;
var
IDX,Cnt:Integer;
begin
if Assigned(FForm) then begin
Cnt := FForm.ComponentCount;
for IDX := 0 to Cnt -1 do begin
if FForm.Components[IDX].Tag = FTargetTag then
InitializeCaption(FForm.Components[IDX]);
end;
InitializeCaption(FForm);
end;
end;
procedure TCapInit.InitializeCaption(AComponent:TComponent);
var
PList:PPropList;
IDX,Cnt:Integer;
begin
Cnt := GetTypeData(AComponent.ClassInfo)^.PropCount;
PList := AllocMem(Cnt * SizeOf(Pointer));
try
GetPropInfos(AComponent.ClassInfo,PList);
for IDX := 0 to Cnt-1 do begin
if (AnsiCompareStr(PList^[IDX].PropType^.Name,'TCaption')=0) then
SetStrProp(AComponent,PList[IDX],FInitStr);
end;
finally
FreeMem(PList,Cnt * SizeOf(Pointer));
end;
end;
procedure TCapInit.SetInitStr(Value: string);
begin
if FInitStr <> Value then FInitStr := Value;
end;
procedure TCapInit.SetTargetTag(const Value: Integer);
begin
if FtargetTag <> Value then FTargetTag := Value;
end;
end.
------------------------ここまで---------------------------------------
【使い方例】
フォームにEditコンポやLabelコンポ、Panelコンポなどをぺたぺた貼り付けます。
初期化しないコンポのtagプロパティを「1」にします。初期化するものは「0」
のままにしておきます。
※usesにCaptionInitを追加してください
フォームのOnCreateイベントハンドラに
procedure TForm1.FormCreate(Sender: TObject);
var
ACapInit:TCapInit;
begin
//引数にはTCustomForm型を指定する。
ACapInit := TCapInit.Create(Self);
try
//初期化文字列の設定(デフォルトではブランクです)
ACapInit.InitStr := 'Init';
//初期化対象にするコンポのTagプロパティ(デフォルトは「1」)
ACapInit.TargetTag := 0;
//初期化実行
ACapInit.Execute;
finally
//オブジェクトの破棄
ACapInit.Free;
end;
end;
実行するとtagプロパティが「0」のコンポで「TCaption」型のプロパティが
「Init」の文字列に変更されます。
99/01/26(火) 12:59 十兵衛(BZT01311)
Original document by 十兵衛 氏 ID:(BZT01311)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|