[Erledigt] Zuklappen einer eigenen Komponente
[Erledigt] Zuklappen einer eigenen Komponente
Hallo allerseits,
ich habe eine eigene Komponente, die zur Eingabe von Nutzerdaten dient. Diese verwende ich an mehreren Stellen in einem Projekt, soweit so gut.
Nun möchte ich gern, dass diese Komponente zugeklappt wird, sobald der Focus auf eine andere Komponente zeigt bzw. das Programm gewechselt wird.
Zur Zeit starte ich mit dem "Aufklappen" einen Timer, der das Form.Activecontrol abfragt, sobald sich dieses ändert, klappt die Komponente zu. Wenn sich der Focus in der Form ändert, wird die Komponente ordentlich ausgeblendet. Jedoch ein Programmwechsel bzw. ein Mainmenuezugriff wird damit nicht abgefragt. Sicherlich kann ich das auch noch in diesen Timer irgendwie mit einfügen, da ich aber glaube, dass ich auf dem Holzweg bin und man das Ganze einfacher realisieren kann, wollte ich euch erstmal befragen.
Eigentlich entspricht das Verhalten, was ich erreichen möchte, dem einer Combobox. Das heisst, wenn man eine Combobox aufgeklappt hat und irgendwoanders in der Form hinklickt bzw. man das Programm wechselt, klappt sich die Combobox zu (ich nehme an, das Popup-Fenter der Combobox ist in einer eigenen Form und eigenem Thread untergebracht, da wenn man einen Breakpoint im Event "TComboBox.Click" setzt, das aufgeklappte Fenster der Combobox vor dem Fenster der Lazarus-IDE sichtbar bleibt).
Hat jemand einen Tip, wie man es erreicht, dass man die eigene Komponente unsichtbar bekommt, ohne alle möglichen Events "zu Fuß" abfragen zu müssen?
ich habe eine eigene Komponente, die zur Eingabe von Nutzerdaten dient. Diese verwende ich an mehreren Stellen in einem Projekt, soweit so gut.
Nun möchte ich gern, dass diese Komponente zugeklappt wird, sobald der Focus auf eine andere Komponente zeigt bzw. das Programm gewechselt wird.
Zur Zeit starte ich mit dem "Aufklappen" einen Timer, der das Form.Activecontrol abfragt, sobald sich dieses ändert, klappt die Komponente zu. Wenn sich der Focus in der Form ändert, wird die Komponente ordentlich ausgeblendet. Jedoch ein Programmwechsel bzw. ein Mainmenuezugriff wird damit nicht abgefragt. Sicherlich kann ich das auch noch in diesen Timer irgendwie mit einfügen, da ich aber glaube, dass ich auf dem Holzweg bin und man das Ganze einfacher realisieren kann, wollte ich euch erstmal befragen.
Eigentlich entspricht das Verhalten, was ich erreichen möchte, dem einer Combobox. Das heisst, wenn man eine Combobox aufgeklappt hat und irgendwoanders in der Form hinklickt bzw. man das Programm wechselt, klappt sich die Combobox zu (ich nehme an, das Popup-Fenter der Combobox ist in einer eigenen Form und eigenem Thread untergebracht, da wenn man einen Breakpoint im Event "TComboBox.Click" setzt, das aufgeklappte Fenster der Combobox vor dem Fenster der Lazarus-IDE sichtbar bleibt).
Hat jemand einen Tip, wie man es erreicht, dass man die eigene Komponente unsichtbar bekommt, ohne alle möglichen Events "zu Fuß" abfragen zu müssen?
Zuletzt geändert von Michl am Mo 23. Sep 2013, 20:29, insgesamt 1-mal geändert.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: Zuklappen einer eigenen Komponente
Hallo Theo,
vielen Dank für die Wegweisung! Habe jetzt den Timer eliminiert, weiss gar nicht, wieso ich nicht selber daran gedacht habe
Das Problem, was ich aber hauptsächlich habe ist immer noch, da OnExit ausgeführt wird, wenn ein anderes Steuerelement aktiviert wird. Das Ereignis OnExit tritt nicht auf, wenn zwischen Formularen oder zwischen einer anderen Anwendung und dieser Anwendung umgeschaltet wird.
Irgendwie stehe ich da immer noch auf dem Schlauch, hast du da noch eine Idee?!
vielen Dank für die Wegweisung! Habe jetzt den Timer eliminiert, weiss gar nicht, wieso ich nicht selber daran gedacht habe

Das Problem, was ich aber hauptsächlich habe ist immer noch, da OnExit ausgeführt wird, wenn ein anderes Steuerelement aktiviert wird. Das Ereignis OnExit tritt nicht auf, wenn zwischen Formularen oder zwischen einer anderen Anwendung und dieser Anwendung umgeschaltet wird.
Irgendwie stehe ich da immer noch auf dem Schlauch, hast du da noch eine Idee?!
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: Zuklappen einer eigenen Komponente
Ich weiss nicht, vielleicht erkläre ich das auch etwas umständlich. Zum testen, hatte ich mir ein Stringgrid mit einer eigenen "Picklist" gebaut. In meinem Projekt ist die aufgeklappte Auswahl etwas aufwendiger.
Alles funktioniert, außer, wenn man in dem Stringgrid einen String eingibt, die Listbox dann angezeigt wird, dass die Listbox unsichtbar gemacht wird, wenn man z.B. auf das Mainmenue klickt oder in ein anderes Programm wechselt.
Ich habe mal das Bsp. angehangen.
Alles funktioniert, außer, wenn man in dem Stringgrid einen String eingibt, die Listbox dann angezeigt wird, dass die Listbox unsichtbar gemacht wird, wenn man z.B. auf das Mainmenue klickt oder in ein anderes Programm wechselt.
Ich habe mal das Bsp. angehangen.
- Dateianhänge
-
Stringgrid mit Listbox.zip
- (178.88 KiB) 56-mal heruntergeladen
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: Zuklappen einer eigenen Komponente
Hmm, das hatte ich schon probiert: OnDeactivate, OnHide etc. Die Anwendung bleibt aber aktiv, wenn man auf ein anderes Programm klickt. Ich hatte auch schon versucht mich in die Combobox zu hineinzudebuggen, finde aber dort nicht den Ansatz 

Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Lazarusforum e. V.
- Beiträge: 3178
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Zuklappen einer eigenen Komponente
Da wirst du auch nichts finden: Die Komponente behält den Fokus -- auch, wenn das Fenster oder die Anwendung gewechselt wird.Michl hat geschrieben:Ich hatte auch schon versucht mich in die Combobox zu hineinzudebuggen, finde aber dort nicht den Ansatz
Daher solltest du Application.OnDeactivate() verwenden. Bequem erreichbar über die Komponente TApplicationProperties auf dem Reiter "Addidtional"
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Re: Zuklappen einer eigenen Komponente
Ja, das ist es für den Wechsel in ein anderes Programm, nicht Form.OnDeactivate sondern Application.OnDeactivate. Vielen Dank für die HilfeMichl hat geschrieben:Daher solltest du Application.OnDeactivate() verwenden.


Ok, habe jetzt das Verhalten erreicht mit 3 Abfragen (ich dachte, dass man das über irgend ein Handle in einem Aufwasch hätte machen können):
- Self.ActiveControl.OnExit
- Application.OnDeactivate
- zu Fuß: MenuItem.OnKlick
jeweils zum Ereignis, eigene Komponente auf nicht sichtbar stellen.
Werde damit leben können. Vielen Dank nochmals für eure Hilfe

Bis demnächst
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;