喫茶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;とすると問題ありません。




[6173] Re:RadioGroupについて返信 削除
2012/7/6 (金) 16:38:08 Mr.XRAY
▼ satoさん

> その後、Form2を閉じて、再度Form1のButton1をClickしても、今度は
> Form2.RadioGroup1のItemIndexは0のままです。
> どうしてでしょうか、


えっ!? その.そうななりますね.
そうじゃないと困るんですが...
何か問題でも...

えーと,ちょっと待ってくださいませ.
これから説明文章を考えます (^^;

[6174] Re2:RadioGroupについて返信 削除
2012/7/6 (金) 16:42:09 Mr.XRAY
しまった!! 前のsatoさんのカキコのせいで,少しどもくってしまった.

> そうななりますね.

そうなりますね.<---- 訂正

[6175] Re:RadioGroupについて返信 削除
2012/7/6 (金) 17:51:11 Syake
▼ satoさん

多分

一旦Form2をHideして、次回再表示時にForm2のRadioGroupのItemIndex値
を変更してShowしようとしても、そうはならないのが問題なのでしょう。
Hideした時の値がそのまま生かされてしまうのが気味悪いって感じかな。

まあ、別件として
 Form2:=TForm2.Create(Application);
より
 Form2:=TForm2.Create(Self);
が良いと思います。

重箱・・・重箱・・・(^_^;)


それはそうと、「どうしてか?」ですね。

そこはマスターに・・・・ねぇ。


[6176] Re2:RadioGroupについて返信 削除
2012/7/6 (金) 18:08:40 Sara
▼ Syakeさん
▼ satoさん
▼ Syakeさん

以下にすると期待通り動作します。

if Form2=nil then
  Form2:=TForm2.Create(Application);
Form2.ActiveControl := Form2.RadioGroup1;// nil;でも可
Form2.RadioGroup1.ItemIndex := 1;
Form2.Show;

コードで設定する場合とマウスでクリックした場合でActiveControl
が一致しないことが原因のようですが・・・詳しくは?(^^;

 
> 重箱・・・重箱・・・(^_^;)
>
>
> それはそうと、「どうしてか?」ですね。
>
> そこはマスターに・・・・ねぇ。


ぢゃぁ マスター よろしくです(^^;



[6177] Re3:RadioGroupについて返信 削除
2012/7/6 (金) 18:21:37 Mr.XRAY
> > そこはマスターに・・・・ねぇ。
>
> ぢゃぁ マスター よろしくです(^^;


ちょっ,ちょっ,ちょっと待ってください(satoさんのが完全に感染しているな).
二人ともズルイ!!  嫌!!
あっ,急に腹が痛くなってきた.胃ガンかな?
でも,二人のコードと説明で十分じゃないかと.
それで疑問があれば,Syakeさんか,Saraさんがレスしますので (^^;

[6178] Re4:RadioGroupについて返信 削除
2012/7/6 (金) 18:36:42 Mr.XRAY
>以下にすると期待通り動作します。

そうか,つまり,Createして新規表示した時も,既にインスタンスがある
フォームを再表示した時も,同じ動作仕様にしたいということなんですね.

>それはそうと、「どうしてか?」ですね。

必要があれば説明ということで... (^^;

>Form2:=TForm2.Create(Self);

これは「重箱」ではなく,こちらの方がいいと思います.私自身は.
というのは,Form1から,Form2を表示しているので,親子関係が明確です.
生成,解放の管理がしやすいと思っています.
Applicationの方がいい場合もあると思うのですが,
今は例が思いつきません.

[6180] Re5:RadioGroupについて返信 削除
2012/7/9 (月) 10:32:00 sato
▼ マスター
▼ Saraさん
▼ Syakeさん
みなさんありがとうございました。
Form2.ActiveControl := Form2.RadioGroup1;// nil;でも可
で思うような動作になりました。
尚、今後は親子関係が明確を明確にするため、
Form2:=TForm2.Create(Self);とします。
(知らなかったとはいえ、長い間親子関係が不明瞭でした)

以下は途中で気が付いた疑問ですが、重箱の隅なのか大事なことなのか
分かりません。質問ではありませんので、どうぞお構いなく。
これまでFormの表示時に最初にカーソルを持って行きたいときに
TabOrderを変えたりで面倒だったのですが、ActiveControlの
設定で楽になりました。
#1
Form2.ActiveControl := Form2.RadioGroup1;でも
Form2.ActiveControl := Form2.Edit1;でも
Form2.RadioGroup1.ItemIndex := 1;が設定できるのですが
Form2.ActiveControl := nil;でもできるのが?です。
#2
CheckBox1はFocusがあると、点線で囲まれるので、
RadioGroup1も点線で囲まれているときがFocusが当たっていると
思っていましたが、RadioGroup1.SetFocus;とやると点線が
消えるのが?です。


[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さんに「人柱」になれっていうことです(笑)

[6186] Re4:TFormのShowメソッド返信 削除
2012/7/9 (月) 16:39:37 Mr.XRAY
> こういった処理が山ほどあるので気が重いです。

そうなんてす.
悩んで,悩んで,皆さん,プログラマーは「廃人」になっていくのです.
satoさん,「廃人」の世界にようこそ.ワハハハッ.

[6188] Re:RadioGroupについて返信 削除
2012/7/9 (月) 18:15:31 おかぽん
▼ satoさん
▼ satoさん
こんにちは。

解決した頃に出てきて恐縮ですが、RadioButtonは、フォーカスを受け取るだけで
チェックがついてしまう、ちょっと素敵で、でも困った仕様があります。
当方、相変わらずDelphi5ですが、最新版も同じなんでしょうか?

ItemIndexを変更しただけでは、フォーカスのあるコントロールが移動しません。
フォームを表示しなおすと、閉じたときにフォーカスのあったコントロールに、
フォーカスが当たりますが、そのとき、上記仕様によりチェック状態がフォーカスのある
コントロールに設定されてしまいます。

普通にTRadioButtonでも再現できるので、適当に配置し、RadioButton1.SetFocus とかすると、
フォーカスの点線もついて、チェックもOnになります。
RadioButton1.Checked := True では、チェックがOnになりますが、フォーカスの点線はありません。
・・・と思いましたが、Windows7では、フォーカスの点線が出ませんでした???
えと、クラシック表示とかWindowsXPあたりで確認してみてください。

そんなわけで

Form2.RadioGroup1.ItemIndex:=1;

Form2.RadioGroup1.Controls[1].Perform(WM_SETFOCUS, 0, 0);

に変えてみると、動いてくれたりします。

でもForm2を開いたまま、Form2上のButtonClickイベントあたりに
 RadioGroup1.Controls[1].Perform(WM_SETFOCUS, 0, 0);
とか書いてしまうと、非常に紛らわしいことになります。


情報源は他にあったと思いますが、みつからなかったので、参考資料。
RadioGroupの初期値書き込みに関して
http://hpcgi1.nifty.com/MADIA/DelphiBBS/wwwlng.cgi?print+201007/10070024.txt

ではでは〜。


[6189] Re2:RadioGroupについて返信 削除
2012/7/9 (月) 18:45:49 Mr.XRAY
▼ おかぽんさん,どうもです.

> 解決した頃に出てきて恐縮ですが、RadioButtonは、フォーカスを受け取るだけで
> チェックがついてしまう、ちょっと素敵で、でも困った仕様があります。
> 当方、相変わらずDelphi5ですが、最新版も同じなんでしょうか?


解決なのかな? まっ,雑談系ですから関係ないですね (^^)
では,最新版を持っている私が(エッヘン!)後でテストしてみます.

[6190] Re2:RadioGroupについて返信 削除
2012/7/12 (木) 14:57:59 Mr.XRAY
▼ おかぽんさん

スミマセン.ちょっとやってみたたのですが,
よく現象を把握できません.理解していないのかもしれません.

ただ,以下の現象は確認しました.
実際にマウスで,該当Itemをクリックしないと,点線が表示されません.

> フォーカスの点線が出ませんでした???

何か勘違いしているかも...
http://mrxray.on.coocan.jp/Others/TRadioGroup.htm#02


[6216] Re3:RadioGroupについて返信 削除
2012/7/20 (金) 12:12:46 おかぽん
▼ Mr.XRAYさん
遅レスですいません。

XPでもクラシックでないとフォーカス矩形が表示されないのかもしれません。

紛らわしい画像を一枚添付

「22222」をクリック後
RadioGroup1.Controls[3].Perform(WM_SETFOCUS, 0, 0);

これでフォーカスを当てて、チェックを移動したものです。


[6221] Re4:RadioGroupについて返信 削除
2012/7/24 (火) 17:33:43 Mr.XRAY
> これでフォーカスを当てて、チェックを移動したものです。

う〜む.なるほど,
で,Delphi 7, 2010, XE でやってみましたが,なりません.
Delphi 6 でやろうししたら,
「TRadioGroupが見つかりません」
「TButtonが見つかりません」

? あっ,UAC を無効にして,管理者権限に昇格しないでインストール
するテストしたままだった! (笑)

しかし,私のとろこでは,なぜならないの?

INCM/CMT
Cyclamen v3.82