![]() |
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 |
AW: Objekt, was zuvor den Fokus hatte ermitteln
Du musst die Markierung bzw. das zuletzt fokusierte Element selbst zwischenspeichern.
|
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 |
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. |
AW: Objekt, was zuvor den Fokus hatte ermitteln
Nimm diese Form als Template für alle anderen Forms und du hast:
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. |
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 |
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 |
AW: Objekt, was zuvor den Fokus hatte ermitteln
Zitat:
|
AW: Objekt, was zuvor den Fokus hatte ermitteln
Zitat:
Delphi-Quellcode:
type
TfrmTemplate = class( TForm ) private FCurrentControl : TWinControl; FLastActiveControl : TWinControl; |
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 |
AW: Objekt, was zuvor den Fokus hatte ermitteln
Das schnüffelt mir eher nach einer statischen Klasse, die sich um solche Dinge kümmert. (Im Grunde eine Art Singleton.) Die verhält sich am Ende ähnlich wie eine globare Variable, ist aber neben OOP konform auch durch die Notwendigkeit der qualifizierteren Referenzierung sicherer zu verwenden als globale Variablen.
Delphi-Quellcode:
unit uGlobalControlManager;
interface type TGlobalControlManager = class private class var FLastActiveControl: TWinControl; public class procedure FocusChanged(var Message: TCMFocusChanged); class procedure FocusLastActiveControl; // Und weitere wie in Sir Rufos frmTemplate Klasse end; implementation class procedure TGlobalControlManager.FocusChanged(var Message: TCMFocusChanged); begin // Wie von Sir Rufo in seiner frmTemplate Klasse end; ... Und dann das in die Basisklasse von Sir Rufo einfuckeln:
Delphi-Quellcode:
Und auf gleiche Weise ließe sich eine Basisklasse für deine Frames zwischen schieben, die die gleichen Funktionen mit Weiterleitung auf die TGlolbalControlManager-Klasse implementiert, und schon kannst du diese Funktionalität überall nutzen, und es ist völlig egal in welcher Form oder in welchem Frame das zuzletzt fokussierte Control lag.
unit RofuForm;
uses ..., uGlobalControlManager; type TfrmTemplate = class(TForm) private procedure CMFocusChanged(var Message: TCMFocusChanged); message CM_FOCUSCHANGED; protected procedure FocusLastControl; public end; implementation procedure TfrmTemplate.CMFocusChanged(var Message: TCMFocusChanged); message CM_FOCUSCHANGED; begin TGlobalControlManager.FocusChanged(Message); end; procedure TfrmTemplate.FocusLastControl; begin TGlobalControlManager.FocusLastControl; end; ... |
AW: Objekt, was zuvor den Fokus hatte ermitteln
Und was ist, wenn zwei Formulare deine statische Klasse verwenden?
Zitat:
Und "ja", ich bin ein Schlugkeisser. |
AW: Objekt, was zuvor den Fokus hatte ermitteln
Zitat:
Aber hast du da nicht noch den Meister bei deinem Titel vergessen? :mrgreen: |
AW: Objekt, was zuvor den Fokus hatte ermitteln
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz