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); if Prg_Ende then begin Action:= caFree; end else begin Action := caNone; end; end; |
Bis bald Chemiker
Xentar - Fr 12.12.08 20:17
Chemiker hat folgendes geschrieben : |
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); if Prg_Ende then begin Action:= caFree; end else begin Action := caNone; 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 public class function PassWortFreigabe (out Rueckgabe : Boolean): Boolean; end;
implementation
{$R *.dfm}
class function TFormPassWort.PassWortFreigabe (out Rueckgabe : Boolean): Boolean; begin with TFormPassWort.Create(nil) do try Result := ShowModal=mrok; if Result then Rueckgabe := TRUE else Rueckgabe := FALSE; finally free; end; end;
procedure TFormPassWort.Edit1Change(Sender: TObject); begin if Edit1.Text = 'P' then BitBtn3.Enabled := TRUE; 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
Chemiker 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.
Xentar hat folgendes geschrieben : |
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
Xentar hat folgendes geschrieben : |
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
Chemiker hat folgendes geschrieben : |
Mitmischer 1703 hat folgendes geschrieben: | Was für einen Sinn hat dein schöner Knopf, wenn der Taskmanager doch diesen gar nich braucht? |
??? |
Mitmischer 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
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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!