Autor Beitrag
klezmor
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1144

Win XP
D5 Standard, D7 Pers, D2005 Pers
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: Fr 12.08.05 11:45 
user profile iconStefanH 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 130

WIN XP, WIN 2000, WIN MCE, WIN 98
D5 Pers
BeitragVerfasst: 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!
ausblenden 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) //Alt+F4 zum Schließen drücken
     then Fertig1Click(Fertig1 as TObject) // ist in meinem Programm schlichtweg ein MenueItem
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. :wink: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: Fr 12.08.05 12:22 
user profile iconchrissivo 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 851

Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1144

Win XP
D5 Standard, D7 Pers, D2005 Pers
BeitragVerfasst: Fr 12.08.05 13:42 
user profile iconklezmor hat folgendes geschrieben:
user profile iconStefanH 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.


:autsch: ich mein natürlich onCloseQuery

_________________
"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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: Fr 12.08.05 14:34 
ausblenden 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 user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.