Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Sender unterscheiden (https://www.delphipraxis.net/21303-sender-unterscheiden.html)

faux 30. Apr 2004 15:45


Sender unterscheiden
 
Hallo!

Ich will, wenn man in meinem Prog auf ein TMenuItem "Beenden" klickt, etwas anderes passiert als wenn man auf das x im Systemmenu klickt...
Wie geht das?
So nicht:
Delphi-Quellcode:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if Sender is TMenuItem then
    Action := caFree
  else
    Action := caNone;
end;

alcaeus 30. Apr 2004 15:52

Re: Sender unterscheiden
 
Setz in der OnCLick des MenuItems eine Boolean-Variable, welche du dann in der OnClose überprüfst. Ist sie True, darf geschlossen werden, ansonsten nicht...

Smokey 30. Apr 2004 16:04

Re: Sender unterscheiden
 
Leider wird beim close der Sender immer deine Form selber sein.
Sowas kannste auch leicht mit einer Zeile testen :

Delphi-Quellcode:
ShowMessage(Sender.ClassName);
deshalb wirklich nen Boolean setzen im OnClick des MenuItems und dann im Close oder CloseQuery abfragen.
Ich machs immer im CloseQuery und setze CanClose auf False.

faux 30. Apr 2004 16:23

Re: Sender unterscheiden
 
Danke! Hat funktioniert....

Robert_G 30. Apr 2004 17:17

Re: Sender unterscheiden
 
Falls du das Form mit verschiedenen Controls beenden willst :
  • ActionList/ActionManager auf's Form
  • eine Action definiert
  • die Action allen Controls (die das Close enthalten sollen) zuweisen
  • Jetzt kannst du im im OnExecute einfach "Close" eintippen.
  • Im OnCloseQuery des Forms geht dann das
    Delphi-Quellcode:
      With DeineAction Do
        If Assigned(ActionComponent) Then
        Begin
          CanClose := Not ((ActionComponent Is TMenuItem) Or
                           (ActionComponent Is TCustomButtonControl));

          If Not CanClose Then
            ShowMessage('Upps (' + ActionComponent.ClassName + ')')
          Else
            ShowMessage('Fump...');

          ActionComponent := Nil;
        End
        Else
          CanClose := True;

Das ist jetzt nur mal schnell zurecht gezimmert.
Da IMHO alle UI Funktionen in eine/mehrere ActionLists gehören, halte ich das für sauberer als eine bool'sche Variable im Private des Forms.


Ich verstehe aber nicht warum beim Klicken auf Close nix passieren soll :gruebel: .


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