Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Objekt, was zuvor den Fokus hatte ermitteln (https://www.delphipraxis.net/170531-objekt-zuvor-den-fokus-hatte-ermitteln.html)

Ykcim 21. Sep 2012 12:50

Objekt, was zuvor den Fokus hatte ermitteln
 
Hallo Zusammen,

ich möchte gerne die Eigenschaften eines RichEdits ändern (Schrift). Wenn ich aber auf das Objekt zur Schriftauswahl klicke, verliert mein RichEdit seinen Fokus.

Meine Überlegung:
1. Kann ich verhindern, dass das RichEdit den Fokus verliert?
2. Kann ich ermitteln, welches Objekt direkt vorher den Fokus hatte?

Vielen Dank
Ykcim

s.h.a.r.k 21. Sep 2012 13:26

AW: Objekt, was zuvor den Fokus hatte ermitteln
 
Du musst die Markierung bzw. das zuletzt fokusierte Element selbst zwischenspeichern.

Ykcim 21. Sep 2012 13:54

AW: Objekt, was zuvor den Fokus hatte ermitteln
 
In einer globalen Variable?

Das ist eine unschöne Lösung, die ich auch verwendet habe, die mir aber nicht gefällt...

Geht das nicht anders?

Gruß
Ykcim

himitsu 21. Sep 2012 14:07

AW: Objekt, was zuvor den Fokus hatte ermitteln
 
Es gibt Messages im Delphi, welche rumwandern, wenn der Fokus sich ändert.
Da kann man sich z.B. mit TApplicationEvent.OnMessage dranhängen und sich dort das Gewünschte speichern.

Sir Rufo 21. Sep 2012 15:29

AW: Objekt, was zuvor den Fokus hatte ermitteln
 
Nimm diese Form als Template für alle anderen Forms und du hast:
  • eine Eigenschaft LastActiveControl
  • ein Event OnFocusChanged
  • eine Methode BackToLastActiveControl
Delphi-Quellcode:
unit ViewTemplate;

interface

uses
  Winapi.Windows,
  System.Classes,
  Vcl.Forms, Vcl.Controls;

type
  TfrmTemplate = class( TForm )
  private
    FCurrentControl :   TWinControl;
    FLastActiveControl : TWinControl;
    FOnFocusChanged :   TNotifyEvent;
  protected
    procedure CMFocusChanged( var Message : TCMFocusChanged ); message CM_FOCUSCHANGED;
  public
    function BackToLastActiveControl : Boolean;
  published
    property LastActiveControl : TWinControl read FLastActiveControl;
    property OnFocusChanged :   TNotifyEvent read FOnFocusChanged write FOnFocusChanged;
  end;

var
  frmTemplate : TfrmTemplate;

implementation

{$R *.dfm}
{ TfrmTemplate }

function TfrmTemplate.BackToLastActiveControl : Boolean;
begin
  Result := False;
  if Assigned( LastActiveControl ) and LastActiveControl.CanFocus
  then
    begin
      LastActiveControl.SetFocus;
      Result := True;
    end;
end;

procedure TfrmTemplate.CMFocusChanged( var Message : TCMFocusChanged );
begin
  FLastActiveControl := FCurrentControl;
  FCurrentControl   := ActiveControl;

  if Assigned( OnFocusChanged )
  then
    OnFocusChanged( Self );
end;

end.

Ykcim 21. Sep 2012 20:08

AW: Objekt, was zuvor den Fokus hatte ermitteln
 
Hallo Sir Rufo,

VIELEN DANK!

Ich habe es in mein Form eingebaut. Ich musste leider aber trotzdem eine Zwischenspeicherung in eine globale Variable vornehmen, denn
1. wenn ich das DropDownMenü für die Schriftart öffne und eine Schriftart auswähle ist ActiveControl und LastActiveControl nil...
2. wenn ich in das Auswahlfeld klicke um die Schrift reinzuschreiben ist ActiveControl die SchriftCombo und LasActiveControl die Ribbon-Registrierkarte...

Schade, hatte mir sehr gut gefallen und werde ich sichernoch später in meinem Projekt verwenden können.

Daher nochmals meinen Dank

Gruß

Ykcim

Sir Rufo 21. Sep 2012 20:50

AW: Objekt, was zuvor den Fokus hatte ermitteln
 
Ich weiß nicht warum du immer auf dieser globalen Variablen herumreitest.
Leg das einfach in einer Klassenvariablen ab und gut ist ;)

Wenn du solche Spezialfälle hast, dann kannst du aber bestimmt diese auch eingrenzen
z.B. es wird sich nur das Control gemerkt, wo der Parent die Form direkt ist, oder wer auch immer.
Oder eben nicht, wenn der Parent die Menüleiste ist ... die Möglichkeiten sind da vielfältig.

Aber eine globale Variable sehe ich da nirgendwo

Furtbichler 22. Sep 2012 08:51

AW: Objekt, was zuvor den Fokus hatte ermitteln
 
Zitat:

Zitat von Sir Rufo (Beitrag 1183930)
Ich weiß nicht warum du immer auf dieser globalen Variablen herumreitest.
Leg das einfach in einer Klassenvariablen ab und gut ist ;)

Wäre ein privates Feld nicht besser? (Stichwort: mehrere Instanzen einer Form)

Sir Rufo 22. Sep 2012 08:57

AW: Objekt, was zuvor den Fokus hatte ermitteln
 
Zitat:

Zitat von Furtbichler (Beitrag 1183950)
Zitat:

Zitat von Sir Rufo (Beitrag 1183930)
Ich weiß nicht warum du immer auf dieser globalen Variablen herumreitest.
Leg das einfach in einer Klassenvariablen ab und gut ist ;)

Wäre ein privates Feld nicht besser? (Stichwort: mehrere Instanzen einer Form)

Das meinte ich doch :)
Delphi-Quellcode:
type
  TfrmTemplate = class( TForm )
  private
    FCurrentControl : TWinControl;
    FLastActiveControl : TWinControl;

Ykcim 22. Sep 2012 10:54

AW: Objekt, was zuvor den Fokus hatte ermitteln
 
Hallo Zusammen,

vielen Dank für die Unterstützung! Leider verstehe ich sie nicht so richtig, daher erkläre ich Euch, wofür ich die Variable nutze und würde mich freuen, wenn Ihr mir sagt, wie Ihr das lösen würdet...

Mein Projekt beinhaltet ein Formular, auf welchem einige Frames sind. Auf dem Formular ist ein Ribbon und in den Frames sind RichEdits. Damit ich jetzt die Schrift, Schriftgröße und Schriftfarbe ändern kann, muss ich der Procedure in dem Ribbon auf dem Haupformular das jeweils aktive RichEdit übergeben (was in den Frames ist).

Ich habe den Umgang mit Klassen, Klassenvariablen und privaten Variablen leider noch nicht richtig verstanden...

Vielen Dank

Ykcim


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:23 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz