喫茶XRAYトップページ

[スレッド全体
]

[10883] Formに配置したコンポーネントの配置場所の一覧を得たい返信 削除
2017/2/26 (日) 16:08:02 taki
マスター 助けてください。

Form1にButton1、Panel1、StringGrid1、等々を配置します。
結果を記録するのにListBox1も配置します。

これらのコンポーネントのLeftやTopの位置情報の一覧が欲しいのです。
書いたコードは以下のようなもので、一応情報は得られるのですが
スマートではありません。

procedure TForm1.Button1Click(Sender: TObject);
var
  i:integer;
  s:string;
  obj:TComponent;
begin
  for i := 0 to Form1.ComponentCount - 1 do begin
    obj := Form1.Components[i];
    s := obj.Name;
    listbox1.Items.Append(s);
    //
    if obj is TButton then begin
      s := inttostr(TButton(obj).top);
      listbox1.Items.Append(s);
    end;
    //
    if obj is TPanel then begin
      s := inttostr(TPanel(obj).top);
      listbox1.Items.Append(s);
    end;
    //
    if obj is TStringGrid then begin
      s := inttostr(TStringGrid(obj).top);
      listbox1.Items.Append(s);
    end;
  end;
end;


Form1.Components[i]ではClassNameも得られるのですが、
具体的な使い方がわかりません。

s := inttostr((obj as obj.ClassName).Top);

とかしたらコンパイラに叱られました。


[10885] Re:Formに配置したコンポーネントの配置場所の一覧を得たい返信 削除
2017/2/26 (日) 17:55:46 Mr.XRAY
▼ takiさん
> マスター 助けてください。

いやです !! 他の人にお願いしてください (笑)
でも,もし分かった...

> スマートではありません。

贅沢です.
プログラムは「勝てば官軍,動けば正義」です.

> Form1.Components[i]ではClassNameも得られるのですが、
> 具体的な使い方がわかりません。
>
> s := inttostr((obj as obj.ClassName).Top);
>
> とかしたらコンパイラに叱られました。


何かあったような...
いわゆる実行時型情報ってやつですね.

[10886] 実行時型情報 RTTI返信 削除
2017/2/26 (日) 18:03:49 Mr.XRAY
> いわゆる実行時型情報ってやつですね.

当サイトにもありますが,取り合えず,山本さんのところで
「実行時型情報」で検索してみてください.

http://www.gesource.jp/weblog/?s=%E5%AE%9F%E8%A1%8C%E6%99%82%E5%9E%8B%E6%83%85%E5%A0%B1&submit=Search


[10887] Re:実行時型情報 RTTI返信 削除
2017/2/26 (日) 19:22:23 taki
▼ Mr.XRAYさん
> > いわゆる実行時型情報ってやつですね.
>
> 当サイトにもありますが,取り合えず,山本さんのところで
> 「実行時型情報」で検索してみてください.
>
> http://www.gesource.jp/weblog/?s=%E5%AE%9F%E8%A1%8C%E6%99%82%E5%9E%8B%E6%83%85%E5%A0%B1&submit=Search


ありがとうございます。m(_ _)m

調べてみます。


[10889] Re2:実行時型情報 RTTI返信 削除
2017/2/26 (日) 20:47:19 taki
uses TypInfo;  // 追加

procedure TForm1.Button1Click(Sender: TObject);
var
  i:integer;
  s:string;
  obj:TComponent;
  V:Variant;    // 追加
begin
  for i := 0 to Form1.ComponentCount - 1 do begin
    obj := Form1.Components[i];
    s := obj.Name;
    listbox1.Items.Append(s);
    //
{
    if obj is TButton then begin
      s := inttostr(TButton(obj).top);
      listbox1.Items.Append(s);
    end;
    //
    if obj is TPanel then begin
      s := inttostr(TPanel(obj).top);
      listbox1.Items.Append(s);
    end;
    //
    if obj is TStringGrid then begin
      s := inttostr(TStringGrid(obj).top);
      listbox1.Items.Append(s);
    end;
}
    try
      V := GetPropValue(obj, 'Top');
      listbox1.Items.Append(V);
    except
      on EPropertyError do listbox1.Items.Append('No property');
    end;
  end;
end;

こんなかんじでいいのかな?


[10891] Re3:実行時型情報 RTTI返信 削除
2017/2/26 (日) 21:39:03 福士
▼ takiさん
> こんなかんじでいいのかな?
Top(やLeft、Width、Height)がほしいだけならRTTIはいりません。
これらのプロパティはTControlで実装されているので、単に
(Components[i] as TControl).Top
で取り出せます。

[10896] Re4:実行時型情報 RTTI返信 削除
2017/2/27 (月) 07:51:15 taki
▼ 福士さん

TComponentのHelpに

「TComponent では、ユーザー インターフェイスや表示用の機能をまったく提供していません。
これらの機能は、TComponent の直接の下位クラスである次の 2 つのクラスで提供されています。

FMX.Types ユニットの TControl。FireMonkey(FMX)フレームワークで構築される
クロスプラットフォーム アプリケーションで使用するビジュアル コンポーネントの基底クラスです。
Vcl.Controls ユニットの TControl。Windows のみの(VCL)アプリケーションで使用する
ビジュアル コンポーネントの基底クラスです。」

…とありました。勉強になりました。


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82