掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
複数のペインからなるプログラムで、フォーカスの有無により各ペインのタイトル部の色を変えるには (ID:47525)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
>その結果、モーダルウィンドウでは、期待通りに色が変わりましたが、 ShowMessage のことですよね。FontDialog1 はダメでした…。 >FindDialog1を表示させた状態で、フォームとFontDialog1を交互にクリックして確認 ん? 「フォームとFindDialog1を交互にクリック」ですよね?? >Screen.OnActiveControlChange のイベントが起こらず、そのために色が変わらなかった そんな罠があるとはまったく思いも寄りませんでした。 何かうまい方法はないかと考えたのですが、結局のところOnIdleを使うよりも美しくない、 うんこコードしか作れませんでした…。汚いものですが、陳列しておきます。 ※フォームにTMemo×2、TPanel×2、TSpeedButton×3、TFindDialog、TFontDialogを置きます。 private procedure ActiveControlChange(Sender: TObject); procedure WM_APP_2(var Msg: TMessage); message WM_APP+2; procedure WMActivate(var Msg: TWMActivate); message WM_ACTIVATE; procedure ColorChange(); procedure TForm1.FormCreate(Sender: TObject); begin Screen.OnActiveControlChange:=ActiveControlChange; end; procedure TForm1.FormDestroy(Sender: TObject); begin Screen.OnActiveControlChange:=nil; // 終了時エラー対策 end; procedure TForm1.ActiveControlChange(Sender: TObject); begin Self.ColorChange(); end; // 自前メッセージを受信したらパネルの色を変更 procedure TForm1.WM_APP_2(var Msg: TMessage); begin Self.ColorChange(); end; // フォームが アクティブ/非アクティブ になるときに来る procedure TForm1.WMActivate(var Msg: TWMActivate); begin inherited; // この時点ではまだ各コントロールのフォーカスが変化 // してないので、自分に自前メッセージを送信して時間稼ぎ PostMessage(Self.Handle, WM_APP+2, 0, 0); end; procedure TForm1.ColorChange(); const Colors: array[Boolean] of TColor = (clInactiveCaption, clActiveCaption); begin Panel1.Color:=Colors[Memo1.Focused]; Panel2.Color:=Colors[Memo2.Focused]; end; procedure TForm1.SpeedButton1Click(Sender: TObject); begin ShowMessage('ShowMessage!'); // 通常のモーダルダイアログ end; procedure TForm1.SpeedButton2Click(Sender: TObject); begin FindDialog1.Execute; // モードレスダイアログ end; procedure TForm1.SpeedButton3Click(Sender: TObject); begin FontDialog1.Execute; // モーダルダイアログ end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.