喫茶XRAYトップページ

[スレッド全体
]

[6169] RadioGroupについて返信 削除
2012/7/6 (金) 14:22:38 sato
ふたたびよろしくお願いします。(コーヒーのお代わりみたいですが)
Form1にButton1、Form2にRadioGroup1を置き
Form1.Button1Clickで
if Form2=nil then
  Form2:=TForm2.Create(Application);
Form2.RadioGroup1.ItemIndex:=1;
Form2.Show;

とすると、Form2.RadioGroup1のItemIndexは1になり、
2番目のボタンが選択状態になります。(FocusはTabOrderが0の
コンポーネントにあります)
ここで、RadioGroup1の1番目のボタンを選択すると、RadioGroup1に
Focusが移ります。
その後、Form2を閉じて、再度Form1のButton1をClickしても、今度は
Form2.RadioGroup1のItemIndexは0のままです。
どうしてでしょうか、
たびたびで申し訳ありませんがよろしくお願いします。
ただ、当然のことながら
Form2.Show;とせずに
Form2.ShowModal;
・・・
Form2.Release;
Form2:=nil;とすると問題ありません。




[6181] TFormのShowメソッド返信 削除
2012/7/9 (月) 11:45:24 Mr.XRAY
> その後、Form2を閉じて、再度Form1のButton1をClickしても、今度は
> Form2.RadioGroup1のItemIndexは0のままです。
> どうしてでしょうか、


上手く説明できるか不安ですが,
この動作は,「どうして」というよりも,「仕様」と考えた方が
いいのではないかと思われます.

プロジェクトにFrom1とForm2があるとします.
Form2は既に作成済みとします
(実行中にCreateしたか,自動生成とする)
Form1からForm2をShowメソッドで表示するとします.

Form2.Show;
は,Form2のVisibleプロパティをTrueにします.
Form2.Closeは基本的にVisibleプロパティをFalseにします.
もちろん,Form2がメインフォームの時は,アプリの終了になります.

From2は,何かの設定ダイアログだとします.
Form2を表示して,何かを設定します.
TMemoに,あるいは,TEditに何かを入力することを想像してください.
Form2を閉じます.
再度,Form2を表示します.前の設定した状態が再現されます.
この時,もし前の設定が再現されないと,既にレスにあるように
Form2を表示する前に,前の設定をどこかに保存しておいて,
Form2の上にあるコントロールに対して設定しなければなりません.
そうしないと,「あ〜ぁ,折角入力したのにぃ」となります.

こういう用途というのは結構あります.
もちろん,ダイアログの{OK]で閉じた場合は,次のShowメソッドで設定を再現,
{Cancel}の場合は,再現させない,という仕様の場合もあるでしょう.

こういう動作仕様というのは,
「これこれになるようにしたい」という人もいれば
「これこれにならないようにしたい」
という人もいるのが普通です.

コミュニティの場で質問された方が,自分の希望する動作をしないと,
あたかも,その言語の仕様に問題があるようなことを書く方がいます.
こういった内容の発言を,何回も見たことがあります.
しかし,必ずしもそうとは言えない場合もあるということです.

納得していただけるでしょうか?

[6182] Re:TFormのShowメソッド返信 削除
2012/7/9 (月) 14:53:17 Syake
▼Saraさん

>コードで設定する場合とマウスでクリックした場合でActiveControl
>が一致しないことが原因のようですが


なるほどです。
前回のTOpenDailogと同様に勉強になりました。

▼ Mr.XRAYさん
> 納得していただけるでしょうか?

なるほど、仕様です・・・(^_^;)
言語の仕様や、もっと根本的なOS自体の仕様などで、何故?などと
疑問に思うことは多多あるようです。

解放しているわけでは無いので、Hide前の状態が再現されるのは必然
と思いますし、そうで無ければ困ります。
んが、しかしながら今回の場合では、Showを行う時点でプロパティー
値を意図的に変更しているので、それが反映されないのはどうしても
混乱を生じさせます。

ただ、
>Form2.ActiveControl := Form2.RadioGroup1;// nil;でも可
で、解決できるということは、別の観点から見て何某かそうせざるを
得ない仕組みを作る事情があるのでしょう。
OSの仕様がらみな気がしますが・・・。




[6183] Re2:TFormのShowメソッド返信 削除
2012/7/9 (月) 15:03:10 Mr.XRAY
▼ Syakeさん

> 得ない仕組みを作る事情があるのでしょう。
> OSの仕様がらみな気がしますが・・・。


ですね.Delphiと言えども,コントロール,コンポーネント類の多くは,
Windows の相当コントロールのラッパーやコンテナクラスですから.
ある程度は納得して使用するしかないと,消極的かも知れませんが.

あまりにも,「なぜか?」を追求すると,
それを設計した人にまで遡及してしまうことになります.
といって,なぜそうしたかが分かっても,仕様変更となると,
それらを使用したアプリ全体に影響を及ぼしかねません.

こういった意味でも,FireMonkeyへの移行は意味があるのではと...
わたしゃ,やるつもりないですけど (^^;

[6184] Re3:TFormのShowメソッド返信 削除
2012/7/9 (月) 16:02:21 sato
▼ 皆さん
了解しました。
Form2.ListBox1.ItemIndex:=1;
Form2.ComboBox1.ItemIndex:=1;
は、セットできるのですが、
Form2.RadioGroup1.ItemIndex:=1;
が他と違う動きをするのは、RadioGroupが、
>コードで設定する場合とマウスでクリックした場合でActiveControl
>が一致しないことが原因のようですが

と言うことですね。
Form2でマスターの設定をしているのですが、「保存」「閉じる」ボタンが
SpeedButtonなので、最後に操作したのがRadioGroupだと、Focusがそのまま
なので、次にファイルから値をセットする場合に正しくセットできてない時
があることが分かり、原因が分からずこのような質問にいたった次第です。
こういった処理が山ほどあるので気が重いです。
Saraさん、対処法を教えていただき助かりました。
みなさん、いろいろと教えていただきありがとうございました。



[6185] Re4:TFormのShowメソッド返信 削除
2012/7/9 (月) 16:35:40 Mr.XRAY
▼ satoさん

RadioGroupとか,ListViewとか,複数のItemがあるコントロールでは,
フォーカスを失った場合,前にフォーカスがあったItemに,
フォーカス線が表示されるのが(Windowsの)仕様のようです.
SetFocusすると,そこが選択状態になります.

これがいやな場合は,非表示の処理も可能なようです.自力になりますが.
でも,個人的にはあった方がいいとは思っています.

> みなさん、いろいろと教えていただきありがとうございました。

今後も,嫌でなかったら,こういう話題(あえて質問とは言いません)
を書いてください.
結構疑問に思っている方はいると思うんです.
つまり,satoさんに「人柱」になれっていうことです(笑)

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