掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
複数のペインからなるプログラムで、フォーカスの有無により各ペインのタイトル部の色を変えるには (ID:47527)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
上の投稿の続編です。 アプリケーション内のフォーカスが移動・消失するとイベントで通知するクラスを作りました。 それを使ったときのサンプルの変更点と、別ユニットでクラス本体を。 usesにFocusWatcherを追加。 private FFocusWatcher: TFocusWatcher; procedure FocusChange(Sender: TObject); procedure ColorChange(); procedure TForm1.FormCreate(Sender: TObject); begin FFocusWatcher:=TFocusWatcher.Create; FFocusWatcher.OnChange:=Self.FocusChange; end; procedure TForm1.FormDestroy(Sender: TObject); begin FFocusWatcher.Free; end; procedure TForm1.FocusChange(Sender: TObject); begin Self.ColorChange(); end; procedure TForm1.ColorChange(); ≪以下同文≫ ----------------------------------------------------------------------------- unit FocusWatcher; interface uses Windows, Classes, Controls; type TFocusWatcher = class(TObject) private FEventHook: THandle; FEnabled: Boolean; FFocusedCtrl: TWinControl; FOnChange: TNotifyEvent; procedure SetEnabled(Value: Boolean); procedure WinEventFired(); public constructor Create(); destructor Destroy(); override; property Enabled: Boolean read FEnabled write SetEnabled; property FocusedCtrl: TWinControl read FFocusedCtrl; property OnChange: TNotifyEvent read FOnChange write FOnChange; end; implementation uses SysUtils, Forms; { TFocusWatcher } var InstanceList: TList = nil; function GetFocusedCtrl(): TWinControl; begin if Assigned(Screen.ActiveControl) and Screen.ActiveControl.Focused then Result:=Screen.ActiveControl else Result:=nil; end; procedure TFocusWatcher.WinEventFired(); begin if GetFocusedCtrl=Self.FocusedCtrl then Exit; FFocusedCtrl:=GetFocusedCtrl; if Assigned(Self.OnChange) then Self.OnChange(Self); end; procedure WinEventProc(hWinEventHook: THandle; event: DWORD; hwnd: HWND; idObject, idChild: Longint; idEventThread, dwmsEventTime: DWORD); stdcall; var I: Integer; begin for I:=0 to InstanceList.Count-1 do if TFocusWatcher(InstanceList[I]).FEventHook=hWinEventHook then TFocusWatcher(InstanceList[I]).WinEventFired(); end; constructor TFocusWatcher.Create; begin if not Assigned(InstanceList) then InstanceList:=TList.Create; InstanceList.Add(Self); Self.Enabled:=True; end; destructor TFocusWatcher.Destroy; begin Self.Enabled:=False; InstanceList.Remove(Self); if InstanceList.Count=0 then FreeAndNil(InstanceList); end; procedure TFocusWatcher.SetEnabled(Value: Boolean); begin if FEnabled=Value then Exit; FEnabled:=Value; if Value then begin FFocusedCtrl:=GetFocusedCtrl; FEventHook:=SetWinEventHook( EVENT_OBJECT_FOCUS, EVENT_OBJECT_FOCUS, 0, WinEventProc, 0, 0, WINEVENT_OUTOFCONTEXT ); end else begin UnhookWinEvent(FEventHook); end; end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.