Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Suche Idee, Button soll Options Fenster anzeigen/verbergen (https://www.delphipraxis.net/137055-suche-idee-button-soll-options-fenster-anzeigen-verbergen.html)

Roaster 13. Jul 2009 13:20


Suche Idee, Button soll Options Fenster anzeigen/verbergen
 
Hi,

ich versuche derzeit erfolglos mit einem Button auf meinem Haupfenster ein zweites (Options-)Fenster anzeigen zu lassen das später durch einen Klick auf den Button geschlossen werden soll oder wenn der User irgendwo ins Nirwana klickt.

Der zweite Teil war nicht weiter schwer:

Delphi-Quellcode:
procedure TfrmOptions.FormDeactivate(Sender: TObject);
begin
  Close;
end;
Das eigentliche Problem ergibt sich beim Drücken des Buttons:

Der Button ist eigengeschrieben und abgeleitet von TGraphicControl. Durch das Anklicken mit der Maus, wird der Button, oder besser das Icon darauf, entweder als aufgeklappt oder eingeklappt dargestellt. Das gleiche Verhalten, kann ich auch steuern, wenn ich das Property Expanded des Buttons auf True oder False setze. Dies ist, wie ich weiter unten noch erläutern werde, wichtig.

Wurde der Button gerade mit der Maus angeklickt und aufgeklappt, so wird das Ereignis OnExpanded gerufen, was letztendlich das Options-Fenster erzeugt und anzeigt. So weit so gut.

Wenn der User jetzt ausserhalb des zweiten Fensters klickt schließt sich dieses und ich setze durch ein Callback Ereignis Button.Expanded auf False. Warum das Ganze? Damit der Button wieder den Zustand Eingeklappt erhält!

Auch bisher ist soweit alles OK.

Wenn der User allerdings zum Schließen des Options-Fensters jetzt den Button bemüht, dann wird erstens durch den Callback Mechanismus Button.Expanded auf False gesetzt aber im Anschluß daran gleich wieder Button.OnExpanded (durch den Mausklick auf den Button) gerufen was sofort wieder das zweite Fenster anzeigt.

Ich suche also eine Möglichkeit, das Verhalten so zu steuern, dass sowohl durch einen Klick ausserhalb des Options-Fenster und durch einen Klick auf den Button das Options-Fenster geschlossen werden kann und gleichzeitig der Status des Buttons wieder auf Eingeklappt springt.

Zugegeben, sieht leicht auch, ist es aber nicht, zumindest sitze ich schon eine zeitlang an diesem Problem und komme einfach nicht weiter.
Kann hier jemand noch die ein oder andere Idee beisteuern?

Stormy 13. Jul 2009 13:32

Re: Suche Idee, Button soll Options Fenster anzeigen/verberg
 
Hi,

erstehe ich jetzt nicht so genau wo das Problem ist.
Setze doch im OnExpanded einfach eine Abfrage ob der Button.Expanded ist also

Delphi-Quellcode:
if Button.Expanded then
begin
  //dein Code zum Fenster öffnen
end;

Gruß
Stormy

hoika 13. Jul 2009 13:39

Re: Suche Idee, Button soll Options Fenster anzeigen/verberg
 
Hallo,

verstehen tu ich das auch nicht ...

Das Options-Form wird doch über Frm_Options.ShowModal aufgerufen, oder ?

also

Delphi-Quellcode:
  Button_X.Expanded:= True;
  try
    Frm_Options.ShowModal
  finally
    Button_X.Expanded:= False;
  end;
Egal, wie das Form beendet wird, es wird der finally-Zweig angesprungen.


Heiko

Roaster 13. Jul 2009 13:56

Re: Suche Idee, Button soll Options Fenster anzeigen/verberg
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von hoika
Hallo,
Delphi-Quellcode:
  Button_X.Expanded:= True;
  try
    Frm_Options.ShowModal
  finally
    Button_X.Expanded:= False;
  end;
Egal, wie das Form beendet wird, es wird der finally-Zweig angesprungen.

Das funktioniert so leider nicht, (war auch einer meiner Ansätze), wenn ich das Options-Fenster modal anzeige, dann komme ich nicht mehr auf den Button, der das Fenster erzeugt hat.

Zum weiteren Verständnis noch: das Options-Fenster ist rahmenlos und hat keinen Schließen-Button. D.h. dass ich diese nur wieder durch den besagten Button zuklappen kann oder dadurch, dass der User irgendwo ausserhalb des Options-Fensters klickt.

Man darf sich unter dem Options-Fenster jetzt nicht ein riesengroßes Fenster vorstellen, sondern so eine Art Popup-Fenster mit ein paar Optionen drin, siehe auch Anhang.

Luckie 13. Jul 2009 14:02

Re: Suche Idee, Button soll Options Fenster anzeigen/verberg
 
Warum mahcst du nicht, wie allgemein üblich, eine Schließenschaltfläche auf das Optionsfenster?

Roaster 13. Jul 2009 14:04

Re: Suche Idee, Button soll Options Fenster anzeigen/verberg
 
Zitat:

Zitat von Stormy
Hi,
Setze doch im OnExpanded einfach eine Abfrage ob der Button.Expanded ist also
Delphi-Quellcode:
if Button.Expanded then
begin
  //dein Code zum Fenster öffnen
end;

Leider so nicht möglich, da die Reihenfolge wie die Events im Button abgearbeitet werden trotzdem dazu führen, das letztendlich das Optionsfenster wieder geöffnet wird:

1) User klickt auf Button -> OnExpanded wird gerufen -> Fenster wird erzeugt und angezeigt -> OFFEN
2) User klickt auf Button -> Callback wird gerufen -> .Expanded wird auf False gesetzt -> GESCHLOSSEN, aber
3) Button.Click wird intern gerufen (.Expanded wider von False auf True gesetzt)
4) Button.OnExpanded wird wieder gerufen -> Fenster wird erzeugt und angezeigt -> OFFEN

Eigentlich sollte 3) bis 4) nicht mehr passieren oder eben durch eine Logik unterbunden werden - genau hierzu suche ich eine Lösung.

Roaster 13. Jul 2009 14:09

Re: Suche Idee, Button soll Options Fenster anzeigen/verberg
 
Zitat:

Zitat von Luckie
Warum mahcst du nicht, wie allgemein üblich, eine Schließenschaltfläche auf das Optionsfenster?

Ja, daran dachte ich natürlich auch schon, nur würde dies
erstens nach sich ziehen, dass das Ganze etwas unschön aussieht und als "Fenster" zu erkennen ist, und sich nicht wie im Screenshot von oben als klappbares "Panel" darstellt und
zweitens könnte der User dann das Fenster ggf. verschieben oder evtl. das Parentfenster (mit dem Button darauf) verschieben und das Optionsfenster würde sich nicht mitbewegen.

Stormy 13. Jul 2009 14:10

Re: Suche Idee, Button soll Options Fenster anzeigen/verberg
 
Und wenn du nach 2 bzw. vor 3 ein
Delphi-Quellcode:
exit;
setzt?


Gruß
Stormy

Roaster 13. Jul 2009 14:17

Re: Suche Idee, Button soll Options Fenster anzeigen/verberg
 
Zitat:

Zitat von Stormy
Und wenn du nach 2 bzw. vor 3 ein
Delphi-Quellcode:
exit;
setzt?

Stormy,
Leider auch nicht so einfach möglich. Der besagte Button, funktioniert ja so tadellos, ich verwende diesen bspw. auch dazu ein Panel ein- oder auszuklappen oder Details zu Fehlermeldung ein- bzw. auszublenden.

Das mit dem Panel hatte ich auch bisher statt dem Optionsfenster verwendet, gefiel mir dann aber nicht mehr so und aufgrund neu hinzugekommener Optionen wurde das Panel dann auch zu klein und zu unübersichtlich.

Die Grundfunktion des Buttons ist einwandfrei, der Knackpunkt ist, dass das Optionsfenster ein eigenständiges Fenster ist und zum anderen auch geschlossen werden kann (und soll), wenn der User neben das Fenster klickt.

Modal angezeigt nutzt das Optionsfenster nicht viel, da dann ja die Ein-Ausklappfunktion überflüssig wäre.

hoika 13. Jul 2009 14:27

Re: Suche Idee, Button soll Options Fenster anzeigen/verberg
 
Hallo,

dann packe dein Options-"Form" auf ein Panel unterhalb des Expanded-Buttons,
das Panel ist am Anfang unsichtbar.
Per Button-Klick wird es sichtbar.
Zur Not geht auch ein Frame, der eingeblendet wird.

Wie dann das "woanders hinklicken soll es schliessen" funktioniert,
weiss ich auch nicht.
Ich finde diese Anforderung eh doof ;)
Ich klicke aus Versehen daneben und das "Form" ist weg, ne!.

Mal was anderes. Was benutzt als Komponente für den "Objekt-Inspektor" ?


Heiko

Stormy 13. Jul 2009 14:29

Re: Suche Idee, Button soll Options Fenster anzeigen/verberg
 
Wenn du folgendes versuchst

Delphi-Quellcode:
//nach dem öffnen des Fensters
Button.Tag := 1;
//dann im OnExpanded
if Button.Tag = 0 then
//dein code zum öffnen
else Button.Tag := 0;
Ansonsten Poste mal den Code von den beiden Events dann versteht man besser was du meinst.


Gruß
Stormy

fajac 13. Jul 2009 14:30

Re: Suche Idee, Button soll Options Fenster anzeigen/verberg
 
Hallo,
du könntest, für den Fall dass das Fenster von der Button.Expanded Methode ausgeblendet wird, vorher den Event auf nil setzen, und wenn du das Fenster erneut öffnest, dann wieder auf deine Ereignismethode.

Roaster 13. Jul 2009 14:40

Re: Suche Idee, Button soll Options Fenster anzeigen/verberg
 
Zitat:

Zitat von hoika
dann packe dein Options-"Form" auf ein Panel unterhalb des Expanded-Buttons,
das Panel ist am Anfang unsichtbar.
Per Button-Klick wird es sichtbar.

Das hatte ich zuvor schon, nur wie geschrieben ist es jetzt ein wenig zu unübersichtlich geworden um alle Radiobuttons und Checkboxen dort unterzubringen. Ausserdem würde dann aufgrund der Größe des Panels der Rest des Parentfensters aus dem sichtbaren Bereich rausgeschoben werden.

Zitat:

Zitat von hoika
Ich finde diese Anforderung eh doof ;)
Ich klicke aus Versehen daneben und das "Form" ist weg, ne!.

Es sollte ja auch nicht so der klassische Optionsdialog für die Anwendungseinstellungen sein, sondern eher um auf die Schnelle mal die Suchoptionen zu modifizieren.

Zitat:

Zitat von hoika
Mal was anderes. Was benutzt als Komponente für den "Objekt-Inspektor" ?

TNextInspector von Bergsoft: Bergsoft - NextInspector

Roaster 13. Jul 2009 14:44

Re: Suche Idee, Button soll Options Fenster anzeigen/verberg
 
Zitat:

Zitat von Stormy
Ansonsten Poste mal den Code von den beiden Events dann versteht man besser was du meinst.

Hier bitteschön, zuerst der Code, der das Erzeugen des Optionsfensters auslöst:

Delphi-Quellcode:
procedure TForm2.OnOptionClose(Sender : TObject);
begin
  MyQuickButton1.Expanded := False;
end;

procedure TForm2.MyQuickButton1Expanded(Sender: TObject; Expanded: Boolean);
var
  oPnt: TPoint;
begin
  oPnt := MyQuickButton1.ClientToScreen(Point(0, MyQuickButton1.Height));
  FOptions := TfrmOptions.Create(Nil);
  FOptions.Top := oPnt.Y;
  FOptions.Left := oPnt.X;
  FOptions.FreeOnRelease;
  FOptions.OnCallback := OnOptionClose;
  FOptions.Show;
end;
Und zum anderen die relevanten Zeilen aus meiner Button-Komponente:
Delphi-Quellcode:
procedure TMyQuickButton.SetExpanded(const Value : Boolean);
begin
  if FExpanded <> Value then
  begin
    SetExpandedImg(not FExpanded);
    FExpanded := Value;
    CallEvents;
    Invalidate;
  end;
end;
...
procedure TMyQuickButton.CallEvents;
begin
  // Call expanded event
  if FExpanded and Assigned(FOnExpanded) then
    FOnExpanded(Self, FExpanded);
  // Call collapsed event
  if not FExpanded and Assigned(FOnCollapsed) then
    FOnCollapsed(Self, FExpanded);
end;

procedure TMyQuickButton.Click;
var
  Form: TCustomForm;
begin
  SetExpandedImg(not FExpanded);
  FExpanded := not FExpanded;

  CallEvents;

  Form := GetParentForm(Self);
  if Form <> nil then
    Form.ModalResult := ModalResult;
  inherited;
end;

mirage228 13. Jul 2009 14:44

Re: Suche Idee, Button soll Options Fenster anzeigen/verberg
 
Du könntest den Button mit einer Delphi-Referenz durchsuchenAction versehen. In OnUpdate wird "Expanded" je nach "Visible" Eigenschaft des Optionsfenster gesetzt und beim OnExecute schließt Du das Fenster bzw. negierst die "Visible" Eigenschaft...
Edit: Für FOptions würde sich dann ja ggf. ein "Singleton" anbieten...

Roaster 13. Jul 2009 15:04

Re: Suche Idee, Button soll Options Fenster anzeigen/verberg
 
Zitat:

Zitat von mirage228
Du könntest den Button mit einer Delphi-Referenz durchsuchenAction versehen. In OnUpdate wird "Expanded" je nach "Visible" Eigenschaft des Optionsfenster gesetzt und beim OnExecute schließt Du das Fenster bzw. negierst die "Visible" Eigenschaft...

OK, das Action property habe ich nochmals schnell im Button implementiert. Nur so ganz erschließt sich mir noch nicht der Sinn:
In Action.OnUpdate wird Button.Expanded je nach Optionfenster.Visible gesetzt? So weit so klar,
Warum bei Action.OnExecute das Fenster schließen? Wann erstelle ich denn dann deiner Meinung nach das Optionsfenster?

Zitat:

Zitat von mirage228
Edit: Für FOptions würde sich dann ja ggf. ein "Singleton" anbieten...

So, jetzt hast du mich komplett verwirrt: Singleton was issn das für'n Ding?

mirage228 13. Jul 2009 16:27

Re: Suche Idee, Button soll Options Fenster anzeigen/verberg
 
Ja mit Schließen meinte ich "Anzeigen bzw. Verbergen" (Visible := not Visible).
Singelton ist, wenn Du nur ein Optionsmenü instanzieren kannst, pro Klasse.

Singleton war auch nur ein Vorschlag. Du kannst das Formular auch in einer Variable (private/protected Abschnitt des Aufrufenden Forms) zwischenspeichern. Wenn die Variable zu Anfang = nil ist, erstellst Du das Form, ansonsten musst ja nur "Visible" ändern...


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:59 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