[Erledigt] Zuklappen einer eigenen Komponente

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

[Erledigt] Zuklappen einer eigenen Komponente

Beitrag von Michl »

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?
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;  


Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Zuklappen einer eigenen Komponente

Beitrag von Michl »

Hallo Theo,

vielen Dank für die Wegweisung! Habe jetzt den Timer eliminiert, weiss gar nicht, wieso ich nicht selber daran gedacht habe :wink:

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;  

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Zuklappen einer eigenen Komponente

Beitrag von Michl »

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.
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;  

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: Zuklappen einer eigenen Komponente

Beitrag von theo »


Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Zuklappen einer eigenen Komponente

Beitrag von Michl »

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;  

Socke
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

Beitrag von Socke »

Michl hat geschrieben:Ich hatte auch schon versucht mich in die Combobox zu hineinzudebuggen, finde aber dort nicht den Ansatz :(
Da wirst du auch nichts finden: Die Komponente behält den Fokus -- auch, wenn das Fenster oder die Anwendung gewechselt wird.

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

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Zuklappen einer eigenen Komponente

Beitrag von Michl »

Michl hat geschrieben:Daher solltest du Application.OnDeactivate() verwenden.
Ja, das ist es für den Wechsel in ein anderes Programm, nicht Form.OnDeactivate sondern Application.OnDeactivate. Vielen Dank für die Hilfe :) , manchmal sehe ich den Wald vor lauter Bäumen nicht :oops:

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;  

Antworten