お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
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