AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Panel automatisch schließen

Ein Thema von Roaster · begonnen am 12. Aug 2009 · letzter Beitrag vom 16. Aug 2009
Antwort Antwort
Seite 1 von 2  1 2      
Roaster

Registriert seit: 21. Jul 2004
Ort: bei mir zu Hause
107 Beiträge
 
#1

Panel automatisch schließen

  Alt 12. Aug 2009, 13:57
Hi,

ich bastle gerade an einem neuen Control, dass im Wesentlichen aus einem Button besteht, der beim Klick darauf ein TPanel mit einer TTrackbar öffnet.

Das funktioniert bereits einwandfrei, nur möchte ich jetzt, dass dieses Panel wieder automatisch schließt, sobald ich bspw. mit der Maus die Größe des Hauptformulars ändere, oder einfach nur irgendwo mit der Maus hinklicke, und zwar nicht auf das Panel oder die TrackBar). Was natürlich bereits geht, ist das Schließen durch einen erneuten Klick auf den Button.

Im Prinzip ist es eigentlich das gleiche Verhalten, dass eine Standard ComboBox zeigt: Nachdem der Button angeklickt wurde, klappt die Liste auf und wieder zu, sobald man irgendwo ausserhalb des Controls/der Liste klickt.

In meinem Fall besteht das neue Control aber aus mehreren einzelnen, so dass bspw. die Nachricht WM_KILLFOCUS oder CM_FOCUSCHANGED hier nicht weiterhilft, zumindest verliert der Button ja bereits den Focus sobald das Panel angezeigt wird. Genau in diesem Fall macht es natürlich noch keinen Sinn das Panel wieder zu schließen.

Wie könnte man dies jetzt lösen?
cu, Michael

Windows 7, WinXP Pro, Vista, WinXP Home, Win98 SE
D4 C/S, D7 Enterprise, Turbo Delphi Pro, Delphi 2009
  Mit Zitat antworten Zitat
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#2

Re: Panel automatisch schließen

  Alt 12. Aug 2009, 14:15
Das Panel hat doch ein Ereignis OnExit, das aufgerufen wird, wenn es den Fokus verliert (und das macht es, wenn du auf ein anderes Element klickst).
  Mit Zitat antworten Zitat
Roaster

Registriert seit: 21. Jul 2004
Ort: bei mir zu Hause
107 Beiträge
 
#3

Re: Panel automatisch schließen

  Alt 13. Aug 2009, 08:55
Hi,

du hast recht, dies funktioniert solang der User auf ein neues Control wie ein TEdit oder eine TCheckbox klickt. Es funktioniert hingegen nicht, wenn der User auf einen freien Platz im Formular klickt, oder die Größe des Formulars verändert.

Gibt's da auch etwas Entsprechendes dafür. WM_SIZE wird ja nur gesendet, wenn sich das Control, in meinem Fall der neue Button, in der Größe ändert, nicht aber, wenn das Formular in der Größe geändert wird.
cu, Michael

Windows 7, WinXP Pro, Vista, WinXP Home, Win98 SE
D4 C/S, D7 Enterprise, Turbo Delphi Pro, Delphi 2009
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Panel automatisch schließen

  Alt 13. Aug 2009, 12:31
Naja dann kannst du doch gucken mit OnMouseDown/Up ob auf das Formular geklickt wurde?

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Roaster

Registriert seit: 21. Jul 2004
Ort: bei mir zu Hause
107 Beiträge
 
#5

Re: Panel automatisch schließen

  Alt 13. Aug 2009, 12:38
Ja,

das könnte ich schon, allerdings regt sich da ein wenig Widerstand in mir, da diese Funktionalität ja das Control mitbringen und nicht vom Programmierer von ausserhalb des Controls gelöst werden soll.

Ich muss ja auch keine ComboBox manuell schließen,indem ich jedesmal nach einem Mausklick prüfe, ob es nicht das Control selbst war, zum Zeitpunkt des Mausklicks. Ich denke da muss es noch irgendetwas anderes geben.

OnExit funktioniert bereits in meinem neuen Control, lediglich für den Klick auf das Formular suche ich noch eine Lösung.

Edit: OnExit funktioniert für fast alle Standard Controls, wenn ich jedoch ein TUpDown Control noch auf's Formular lege und dann bei geöffnetem Panel auf das TUpDown klicke, dann wird komischerweise das OnExit Event nicht aufgerufen und logischerweise auch nicht das Panel geschlossen - sehr seltsam das Ganze.
cu, Michael

Windows 7, WinXP Pro, Vista, WinXP Home, Win98 SE
D4 C/S, D7 Enterprise, Turbo Delphi Pro, Delphi 2009
  Mit Zitat antworten Zitat
Optiplex

Registriert seit: 5. Mär 2008
131 Beiträge
 
Delphi 2005 Personal
 
#6

Re: Panel automatisch schließen

  Alt 14. Aug 2009, 12:39
Hallo, ich weis nicht ob dir das hilft aber mit GetParentForm kann man auf das Formular zugreifen und eventuell die Ereignisse auf eigene Methoden umleiten. Weis allerdings nicht ob das so funktioniert, war nur so eine Idee.

Gruß
Dieter
  Mit Zitat antworten Zitat
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#7

Re: Panel automatisch schließen

  Alt 16. Aug 2009, 01:53
Probier mal SetCapture.

Starthilfe:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Panel1.Visible := false;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Panel1.Visible := true;
  SetCapture(Panel1.Handle);
end;

procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  Pnt: TPoint;
  Rct: TRect;
begin
  GetCursorPos(Pnt);
  GetWindowRect(Panel1.Handle, Rct);
  if not PtInRect(Rct, Pnt) then
    Panel1.Visible := false
  else
    SetCapture(Panel1.Handle);
end;
Das ist nun zunächst mal ein Rundumschlag, der dir den systemweiten Mouseinput sichert, bis ein MouseUp oder -Down eintrifft. Den Feinschliff kannst du vielleicht mit PtInRect durchführen.

Guido.

Edit:
Beispiel-Code verbessert.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.651 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Panel automatisch schließen

  Alt 16. Aug 2009, 04:45
SetCapture funktioniert aber nur solange der Benutzer in das angegebene Control geklickt hat und dann die Maus außerhalb zieht. Wenn die linke Maustaste nicht gedrückt bleibt, klappt das nicht...
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#9

Re: Panel automatisch schließen

  Alt 16. Aug 2009, 04:55
Hallo Sebastian,

ich kann dir gerade nicht folgen. Hast du den Code oben getestet? Der Ablauf wurde von Roaster vorgegeben und funktioniert in meinem Beispiel oben (halt im Ansatz). Zum Starten wird der Button geklickt, dadurch wird das Beispiel-Panel angezeigt und erhält das nächste MouseEvent, egal wo geklickt wird.

Ich weiß jetzt nicht, wie du auf das Ziehen und Festhalten kommst. Oder hab ich was falsch verstanden.

Guido.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.651 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Panel automatisch schließen

  Alt 16. Aug 2009, 04:59
Nein, ich habe den Code oben nicht getestet, aber SetCapture funktioniert so nicht. Hast du es getestet? Siehe Dokumentation:
Zitat:
SetCapture captures mouse input either when the mouse is over the capturing window, or when the mouse button was pressed while the mouse was over the capturing window and the button is still down. [...]

If the mouse cursor is over a window created by another thread, the system will direct mouse input to the specified window only if a mouse button is down.
Heißt: Zumindest, wenn man mit der Maus über ein anderes Programm geht, bekommt das Programm das Mausereignis nicht.

// EDIT:
Aber es funktioniert trotzdem. Tut mir leid, damit hatte ich nicht gerechnet.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:28 Uhr.
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