Thema: Delphi Restore last focus

Einzelnen Beitrag anzeigen

taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#1

Restore last focus

  Alt 21. Mai 2008, 23:42
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)
Ralph
  Mit Zitat antworten Zitat