Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Beenden abfangen


MephistoFFF - Fr 12.12.08 18:42
Titel: Beenden abfangen
Meine frage ist eigentlich ganz simpel: Wie fange ich das beenden über das standardmäßige rote "X" ab?
Also ich will nachdem auf das rote X geklicht wird noch befehle ausführen lassen, bevor sich die form schließt.
Wie kann ich das umsetzen?

Danke für eure Hilfe.

mfG


elundril - Fr 12.12.08 18:44

CloseQuery ist das wort das du suchst! Gibs mal in die Hilfe ein und du wirst weiterkommen. ;-)

lg elundril


Delete - Fr 12.12.08 18:45

Oder einfach OnClose noch schnell das abarbeiten, was abzuarbeiten ist.


Yogu - Fr 12.12.08 19:29

Um was handelt es sich denn? Wenn du Variablen, die du in OnCreate erzeugt hast, wieder freigeben willst, ist OnDestroy die richtige Wahl. Willst du das Beenden vielleicht noch abbrechen, verwende OnCloseQuery. Für alles andere ist OnClose gedacht.


Chemiker - Fr 12.12.08 19:51

Hallo MephistoFFF,

um ein Programm nur mit einem Passwort zu schließen, verwende ich das onClose-Ereignis.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TfrmHauptMenue.FormClose(Sender: TObject; var Action: TCloseAction);
var
  Prg_Ende: Boolean;
begin
  Prg_Ende:= FALSE;
  TFormPassWort.PassWortFreigabe (PRG_Ende); // Aufruf des Paßwort-Forms
  if Prg_Ende then
  begin
    Action:= caFree;  // Erst, wenn das richtige Paßwort eingegeben worden ist.
  end else
  begin
    Action := caNone; // Zurück zum Programm
  end;
end;

Bis bald Chemiker


Xentar - Fr 12.12.08 20:17

user profile iconChemiker hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TfrmHauptMenue.FormClose(Sender: TObject; var Action: TCloseAction);
var
  Prg_Ende: Boolean;
begin
  Prg_Ende:= FALSE;
  TFormPassWort.PassWortFreigabe (PRG_Ende); // Aufruf des Paßwort-Forms
  if Prg_Ende then
  begin
    Action:= caFree;  // Erst, wenn das richtige Paßwort eingegeben worden ist.
  end else
  begin
    Action := caNone; // Zurück zum Programm
  end;
end;


WT...? Du greifst direkt auf eine Methode zu, ohne Instanz der Klasse?? Selbst wenn es funktionieren sollte, ist es verdammt unschön.
Btw: Dafür ist das Ereignis "OnCloseQuery" eher gedacht.


Chemiker - Fr 12.12.08 20:25

Hallo Xentar,

warum ist das unschön? Ich finde das eigentlich sehr übersichtlich.

Bis bald Chemiker


Delete - Fr 12.12.08 20:45

In neueren Delphi-Versionen funktioniert das, wenn man die Methode als class procedure deklariert. Innerhalb solcher Methoden kann dann aber natürlich nicht auf instanzspezifische Dinge wie eigene Felder zugegriffen werden.


Chemiker - Fr 12.12.08 20:54

Hallo Xentar und DeddyH,

genau, nicht eine Procedure sondern ich setze eine Function ein.

Ist nur ein Beispiel, Passwort ist nicht sicher! Damit wird ein Button [Beenden] freigegeben.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
type
  TFormPassWort = class(TForm)
    StatusBar1: TStatusBar;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    Edit1: TEdit;
    Label1: TLabel;
    procedure Edit1Change(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    class function PassWortFreigabe (out Rueckgabe : Boolean): Boolean;
  end;

implementation

{$R *.dfm}

class function TFormPassWort.PassWortFreigabe (out Rueckgabe : Boolean): Boolean;
begin
  with TFormPassWort.Create(nildo
    try
      Result := ShowModal=mrok;  // ModalResult auf mrOk
      if Result then
        Rueckgabe := TRUE            // Rückgabe-Wert
       else
        Rueckgabe := FALSE;
     finally
       free;                    // Speicherfreigabe
   end;
end;

procedure TFormPassWort.Edit1Change(Sender: TObject);
begin
  if Edit1.Text = 'P' then   // Das Paßwort muss noch geändert werden.
    BitBtn3.Enabled := TRUE; // Der Button wird freigegeben
end;

end.

Bis bald Chemiker


Delete - Fr 12.12.08 20:57

Sry, ich hatte Klassenmethoden sagen wollen, aber der Begriff war mir nicht mehr eingefallen ;)


turboPASCAL - Fr 12.12.08 20:59

[ot] Ja, das kommt so mit dem Alter... :mrgreen: [/ot]


Delete - Fr 12.12.08 21:01

[OT] Immerhin bin ich nicht der Älteste in diesem Forum :mrgreen: [/OT]


turboPASCAL - Fr 12.12.08 21:05

:lol:


Chemiker - Fr 12.12.08 21:10

[OT] ich auch nicht, glaube ich [OT]

Bis bald Chemiker


Xentar - Fr 12.12.08 22:00

Ach, Klassenmethoden, daran hab ich gar nicht gedacht :(
Hab zwar auch D2007, die Dinger aber noch nie benutzt..
ich würd es immer noch auf die "klassiche" Art machen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.CloseQuery;
begin
  MyPasswordDLG := TPasswordDLG.Create(self);
  try
    MyPasswordDLG.ShowModal;
    CanClose := MyPasswordDLG.PassWortFreigabe;
  finally
    FreeAndNil(MyPasswordDLG);
  end;
end;

Mal so grob ausm Kopf geschriebem


jaenicke - Fr 12.12.08 22:20

Das ist aber deutlich unübersichtlicher als das ganze gekapselt an der Stelle zu machen wo es hingehört. ;-)
Da finde ich hat user profile iconChemiker schon recht. Vor allem muss dann die aufrufende Klasse nix weiter wissen wie das Formular erzeugt und angezeigt wird, sondern nur diese eine Methode aufrufen.

user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
Ach, Klassenmethoden, daran hab ich gar nicht gedacht :(
Hab zwar auch D2007, die Dinger aber noch nie benutzt..
Die gibts schon mindestens seit Delphi 3, also 11 Jahre. :lol: :lol: :lol:


Xentar - Sa 13.12.08 01:54

mkay, geb mich geschlagen, habs grad in D5 ausprobiert, und da ging das auch schon durch den Compiler.
Komisch, könnt schwören, dass diese class function mal bei D2006 auf der "New features" Liste stand.

Naja, habs trotzdem noch nie verwendet, und leb immernoch :D aber könnte ich in Zukunft auch mal verwenden, jo.


alzaimar - Sa 13.12.08 10:28

user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
Naja, habs trotzdem noch nie verwendet, und leb immernoch :D
Das gilt auch für 'Repeat..Until'. :wink:


Mitmischer 1703 - Sa 13.12.08 11:23

Was für einen Sinn hat dein schöner Knopf, wenn der Taskmanager doch diesen gar nich braucht? :gruebel: :mrgreen:


Chemiker - Sa 13.12.08 14:24

Hallo Mitmischer 1703,

Mitmischer 1703 hat folgendes geschrieben:
Was für einen Sinn hat dein schöner Knopf, wenn der Taskmanager doch diesen gar nich braucht?

???

Bis bald Chemiker


Yogu - Sa 13.12.08 20:16

user profile iconChemiker hat folgendes geschrieben Zum zitierten Posting springen:
Mitmischer 1703 hat folgendes geschrieben:
Was für einen Sinn hat dein schöner Knopf, wenn der Taskmanager doch diesen gar nich braucht?

???

user profile iconMitmischer 1703 meint wahrscheinlich, dass deine Passwortabfrage alles andere als sicher ist. Ein beliebiges Programm kann deines trotzdem beenden: Es muss nur den Prozess beenden. Das ist einerseits mit dem Windows Task-Manager möglich, aber auch über Suche im MSDN TERMINATEPROCESS. Wirklich sicher ist es nur, den Prozess zu sperren. Das kenne ich zwar von meiner Firewall, aber ich habe keine Ahnung, wie man das in Delphi realisiert. Tut mir leid :nixweiss:


jaenicke - Sa 13.12.08 20:35

Da gibt es einige Möglichkeiten. Da die aber auch von Viren verwendet werden möchte ich da nicht näher drauf eingehen. Ich gehe einmal davon aus, dass die hier genannten Möglichkeiten ausreichen und wenn es einigermaßen sicher sein soll, dann ist dies ohnehin nicht der richtige Weg.

Für jeden sehr unerfahrenen Computernutzer wird es ausreichen, bei allen anderen eben nicht.


Chemiker - Sa 13.12.08 22:19

Hallo,

es ging ja nur um ein Beispiel und das habe ich nur verkürzt wiedergegeben, wobei der Task-manager das kleinste Problem darstellt.

Aber jaenicke hat Recht, die Verfahren könnten auch für einen Virus eingesetzt werden und deswegen gehe ich auch nicht näher darauf ein.

Bis bald Chemiker