| Autor |
Beitrag |
klezmor
      
Beiträge: 558
delphi 6 personal delphi 2005 personal
|
Verfasst: Fr 12.08.05 11:35
Ich habe ein Programm geschrieben, dass sobald man es beendet, abfragt ob die Änderungen abgspeichert werden sollen. Natürlich soll dies auch geschehen, wenn der Anwender das Formular mit einem Klick auf das kleine Schließen-x rechts oben beenden will.
Hierfür verwende ich die onClose Routine, aber wenn der Anwender bei meinem Dialog, welcher die Entscheidungs des Anwenders überprüfen soll, nun auf Abbrechen klickt, dann wird das Fenster trotzdem geschlossen und dagegen kann ich irgendwie nichts unternehmen. Schließlich ist bei dem Aufruf der OnClose Routine schon fest beschlossen, dass das Fenster geschlossen wird.
|
|
StefanH
      
Beiträge: 1144
Win XP
D5 Standard, D7 Pers, D2005 Pers
|
Verfasst: Fr 12.08.05 11:40
einfach Action auf caNone setzen oder onCloseAction benutzen 
_________________ "Als es noch keine Computer gab, war das Programmieren noch relativ einfach."(Edsger W. Dijkstra)
"Ich bin nicht von Sinnen, sondern ich rede wahre und vernünftige Worte." (Paulus)
|
|
klezmor 
      
Beiträge: 558
delphi 6 personal delphi 2005 personal
|
Verfasst: Fr 12.08.05 11:45
StefanH hat folgendes geschrieben: | einfach Action auf caNone setzen oder onCloseAction benutzen  |
Die OnCloseAction-Routine beitzt Delphi6 Personal glaube ich nicht, und action kann ich seltsamer weise kein Parameter zuordnen.
|
|
chrissivo
      
Beiträge: 130
WIN XP, WIN 2000, WIN MCE, WIN 98
D5 Pers
|
Verfasst: Fr 12.08.05 11:50
Du musst die Eigenschaft CanClose des Formulars auf false setzen. Beim OnCloseQuery machst du dann 'ne Abfrage beim Benutzer und beim Bejahen von Seiten des Benutzers musst du dann CanClose auf True setzen.
Das klappt so wunderbar!
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:
| var Form1: TForm1; nichtschliessen : Boolean; procedure TForm1.Fertig1Click(Sender: TObject);
begin if Application.MessageBox('Wollen Sie das Progamm wirklich beenden?', 'Beenden', MB_ICONQUESTION+MB_YESNO) = IDYES then begin nichtschliessen := false; Close end end; procedure TForm1.FormShow(Sender: TObject);
begin nichtschliessen := true; end; procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose := not nichtschliessen; end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (ssAlt in Shift) and (Key = VK_F4) then Fertig1Click(Fertig1 as TObject) end; |
So ist das im Groben glaube ich gut gelöst, denn sowohl Alt+F4 als auch das Kreuzchen oder jedes andere Close wird abgefangen.
Viel Spaß beim Ausprobieren
Chrissi
//Edit: habe noch was vergessen: Selbstverständlich muss die Show-Prozedur beim OnShow-, die FormCloseQuery-Prozedur beim OnCloseQuery- und die FormKeyDown-Prozedur beim OnKeyDown-Ereignis drinstehen.  Dann sollte es aber wirklich gehen, habe im Übrigen D5.
//Edit2: Außerdem muss Key-Preview auf "True" gesetzt werden, damit Alt+F4 funktioniert
_________________ "... was ich noch zu sagen hätte dauert eine Zigarette, und ein letztes Glas im Steh'n..."
|
|
klezmor 
      
Beiträge: 558
delphi 6 personal delphi 2005 personal
|
Verfasst: Fr 12.08.05 12:22
chrissivo hat folgendes geschrieben: | Du musst die Eigenschaft CanClose des Formulars auf false setzen. Beim OnCloseQuery machst du dann 'ne Abfrage beim Benutzer und beim Bejahen von Seiten des Benutzers musst du dann CanClose auf True setzen.
Das klappt so wunderbar!
|
Ich verstehe das nicht so ganz, wenn ich bei meiner Abfrage cancel erhalte, dann soll das Fenster ja nicht geschlossen werden. Die Abfrage, ob irgendetwas gespeichert werden soll, das soll ja letztendlich bei jedem Aufruf von close; ausgelöst werden, so wie ich das interpretiere, wird immer abgefragt, sobald die TForm1.Fertig1Click aufgerufen wird, diese wird doch aber nicht auf gerufen, wenn der Anwender das Kreuzchen drückt oder?
Kannst du mir erklären was die Eigenschaft canclose in Zusammenhang mit dem Ereignis OnCloseQuery bedeutet: canclose:=true:..?.. und canclose:=false:..?...
|
|
noidic
      
Beiträge: 851
Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
|
Verfasst: Fr 12.08.05 12:38
Das Ereignis OnCloseQuery wird immer dann ausgelöst, wenn ein Formular geschlossen worden ist und dient dazu, festzulegen, ob das Schließen des Formulars erlaubt ist oder nicht.
Wenn CanClose auf true gesetzt wird, wird das Fenster geschlossen, wenn es auf false gesetzt wird, nicht.
Das Ereignis OnClose wird erst beim tatsächlichen schließen des Formulars aufgerufen.
_________________ Bravery calls my name in the sound of the wind in the night...
|
|
StefanH
      
Beiträge: 1144
Win XP
D5 Standard, D7 Pers, D2005 Pers
|
Verfasst: Fr 12.08.05 13:42
_________________ "Als es noch keine Computer gab, war das Programmieren noch relativ einfach."(Edsger W. Dijkstra)
"Ich bin nicht von Sinnen, sondern ich rede wahre und vernünftige Worte." (Paulus)
|
|
klezmor 
      
Beiträge: 558
delphi 6 personal delphi 2005 personal
|
Verfasst: Fr 12.08.05 14:34
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean); var wert:integer; begin if (geaendert) then begin
wert:=messagedlg('Der Text der Datenliste wurde verändert. Aktuelle Änderungen speichern?',mtwarning,[mbyes,mbno,mbcancel],0); if (wert=mryes) then begin if (aufgerufen) then begin abspeichern; form1.Visible:=true; end else begin speichern_unter; form1.Visible:=true; end; end; if (wert=mrcancel) then begin canclose:=false; end; if (wert=mrno) then begin form1.Visible:=true; end; end else begin canclose:=true; form1.visible:=true; end;
end; |
So habe ich jetzt das Problem gelöst es funktioniert einwandfrei, sollte ich irgendwo im Programm close; aufrufen wird diese Routine ausgeführt.
Danke für eure Hilfe.
Moderiert von Christian S.: Code- durch Delphi-Tags ersetzt.
|
|