喫茶XRAYトップページ

[スレッド全体
]

[7378] Re2:Form1.Components[]の使い方返信 削除
2014/3/18 (火) 17:12:58 snail
▼ takiさん

>教えてもらいたいことは、エラー処理の方法です。
>プログラムはとりあえず動くのですが、Form1.Components[]
>命令の使い方に自信がありません。


いつも教えていただいているので、私で解る範囲で
お答えしたいのですが。「何が知りたいのか」わかりません。

とりあえず

  if Form1.Components[AComponentIndex] is TLabel
  begin
    if 0 <= ComboBox1.ItemIndex then
      TLabel(Form1.Components[AComponentIndex]).Caption :=
          ComboBox1.Items.Strings[ComboBox1.ItemIndex];
  end;

エラーチェックを追加してみました。
※ 頭上デバッグなのでコンパイルエラーが発生するかもしれません。



[7379] Re3:Form1.Components[]の使い方返信 削除
2014/3/18 (火) 19:28:35 taki
▼ snailさん
 
早速の回答ありがとうございます。

> 私で解る範囲で
> お答えしたいのですが。「何が知りたいのか」わかりません。


今回初めてForm1.Components[]を使ったプログラムを書きました。

Labelの情報はSenderを介してComboBoxに得ることができるのですが、
ComboBoxのイベント手続きでComboBoxの選択した結果をどうやって
元のLabelに渡したらいいのかがわからず、色々調べて
Form1.Components[]にたどり着きました。

もやもやとした「このままのコードではやばいだろうな」という
レベルの質問となってしまいました。

型は if ○ is T○ でチェックすれば良いことがわかりました。

if 0 <= ComboBox1.ItemIndex then…においては、ComboBox1の
ドロップダウンリスト以外はどこをクリックしてもComboBox1の
Clickイベントは発生しなかったので、たぶんチェックする必要は
無いように思います。
また、ドロップダウンリストの要素が無い状態でもイベントは
発生しませんでした。

クリックするLabelを変えるとComboBoxのドロップダウンリストの要素を
変える手続きSetDataComboBoxをもう少し工夫しないといけないと思います。

考えてみます。



[7381] Re4:Form1.Components[]の使い方返信 削除
2014/3/18 (火) 20:26:13 taki
> クリックするLabelを変えるとComboBoxのドロップダウンリストの要素を
> 変える手続きSetDataComboBoxをもう少し工夫しないといけないと思います。
>
> 考えてみます。
>


度々すみません。m(_ _)m

AComponentIndexにこだわり過ぎていました。

procedure TForm1.SetDataComboBox(oya:string);
begin
  if oya = 'Label1' then ComboBox1.Items.CommaText := 'タイ,マグロ,シャケ';
  if oya = 'Label2' then ComboBox1.Items.CommaText := 'たんぽぽ,すみれ,パンジー';
  if oya = 'Label3' then ComboBox1.Items.CommaText := 'サクラ,ウメ,マツ';
end;

にして、

// label1,label2,label3で共有するイベント
procedure TForm1.Label1Click(Sender: TObject);
begin
    (省略)
  // ComboBoxにデータをセット
  SetDataComboBox(TLabel(Sender).Name);
    (省略)
end;

とすれば良いみたいです。

それと、グローバル変数AComponentIndexを使わずに、ComboBox1.Tagを変数として
使ってもプログラムは動きました。



[7384] Re5:Form1.Components[]の使い方返信 削除
2014/3/18 (火) 21:11:54 snail
▼ takiさん

何がしたいか理解できていませんが

procedure TForm1.SetDataComboBox(oya:string);
     ↓
procedure TForm1.SetDataComboBox(oya:TObject);
begin
  if oya = Label1 then
    ComboBox1.Items.CommaText := 'タイ,マグロ,シャケ'
   else if oya = Label2 then
    ComboBox1.Items.CommaText := 'たんぽぽ,すみれ,パンジー'
   else if oya = Label3 then
    ComboBox1.Items.CommaText := 'サクラ,ウメ,マツ';
end;

と書いてもいいですよね。



[7385] Re6:Form1.Components[]の使い方返信 削除
2014/3/18 (火) 22:54:35 taki
▼ snailさん

> 何がしたいか理解できていませんが

はい。ComboBoxをそのまま使わせてもらえたらこんな苦労を
しなくて済むのに。

> procedure TForm1.SetDataComboBox(oya:TObject);

なるほど。
名前に変えなくてもObjectで比較すればいいんですね。
また、if ○ then else if ○…を使うのがベストですし。
いっぱい無駄な事をしています…。

大変勉強になります。

話は変わりますが、Labelにはhandleが無いんですね。
ComboBox1.TagにLabelのhandleを代入したら何とかできるかもと
考えたのですが砕け散りました。


[7386] Re7:Form1.Components[]の使い方返信 削除
2014/3/19 (水) 09:19:38 Mr.XRAY
う〜ん.なるほど.
コンポーネントの実行時管理は結構面倒ですね.
複数の種類の違うコントロールの連携ですね.

どんな方法がいいんでしょうね.


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