Moin, Moin,
normalerweise ist es wohl uninteressant, welches Control zuletzt den Focus hatte. Für mich gibt es da aber eine Ausnahme: Rufe ich in meinem Programm mit einem Button die Hilfe auf, möchte ich nach Schliessen des Hilfefensters den Focus wieder auf dem zuletzt benutzten Control haben - und nicht auf dem Help-Button. Bisher habe ich das immer recht aufwendig in jedem relevanten Formular lokal programmiert. Blöde Lösung! Heute Abend hatte ich dann eine Idee, die ich dann in folgender Mini-Klasse umgesetzt habe:
Delphi-Quellcode:
unit rzM_WatchFocus;
interface { ----------------------------------------------------------------- }
uses Wintypes,Classes,Controls,Forms;
type TWatchFocus =
class(TComponent)
private
FActControl,
FLastControl : TWinControl;
procedure SaveFocus (Sender:TObject);
public
procedure RestoreFocus;
constructor Create (AOwner:TComponent);
override;
destructor Destroy;
override;
end;
var WatchFocus : TWatchFocus;
implementation { ------------------------------------------------------------ }
procedure TWatchFocus.SaveFocus(Sender:TObject);
begin
if FActControl=nil
then FActControl:=Screen.ActiveControl
else begin FLastControl:=FActControl;
FActControl :=Screen.ActiveControl
end
end;
procedure TWatchFocus.RestoreFocus;
begin
if FLastControl<>
nil then FLastControl.SetFocus
end;
constructor TWatchFocus.Create(AOwner:TComponent);
begin
inherited Create(AOwner);
FActControl :=nil;
FLastControl:=nil;
Screen.OnActiveControlChange:=SaveFocus
end;
destructor TWatchFocus.Destroy;
begin
Screen.OnActiveControlChange:=nil;
inherited Destroy
end;
initialization { ------------------------------------------------------------ }
WatchFocus:=TWatchFocus.Create(
nil);
finalization { -------------------------------------------------------------- }
WatchFocus.Free;
WatchFocus:=nil;
end.
Die Anwendung ist denkbar einfach; die Klasse wird lediglich per USES eingebunden. Damit steht dann die Prozedur "RestoreFocus" zur Verfügung. Anwendungsbeispiel:
Delphi-Quellcode:
procedure TfoConfig.buHelpClick(Sender:TObject);
begin
case PageControl.ActivePageIndex of
0 : Application.HelpJump('ConfigStartup');
1 : Application.HelpJump('ConfigColorAlphablend');
end;
WatchFocus.RestoreFocus // << Focus wieder auf letztes Control vor HelpButton setzen
end;
Bislang funktioniert das wie gewünscht. Habe ich da mal wieder zu aufwendig gedacht, da Delphi diese Funktionalität schon bietet und ich das nur nicht gefunden habe?
PS:
Kann mir bitte mal einer erklären, wieso TWatchFocus.Create(nil) mit NIL erfolgen muss (hatte erst Self probiert, funktionierte aber nicht)