AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Stack-Überlauf

Ein Thema von Array · begonnen am 9. Mär 2011 · letzter Beitrag vom 10. Mär 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Array
Array

Registriert seit: 11. Feb 2011
33 Beiträge
 
Delphi 2010 Architect
 
#1

Stack-Überlauf

  Alt 9. Mär 2011, 17:02
Hallo Leute!

Hab folgenden Code:

Delphi-Quellcode:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Gespeichert = 'Jathen begin
   Close;
end else begin
if (MessageDlg('Sie haben nicht gespeichern! Wollen Sie vor dem Beenden speichern?', mtWarning, [mbYes, mbNo], 0) = mrYes) then begin
bt_save.click;
close;
end;
if (MessageDlg('Sie haben nicht gespeichern! Wollen Sie vor dem Beenden speichern?', mtWarning, [mbYes, mbNo], 0) = mrNo) then begin
close;
end;
end;
end;
Immer wenn er aus geführt wird kommt ein Stack-Überlauf!

Worauf ist das zurückzuführen?

Danke im Voraus!

Liebe Grüße

Array
LoadfromBrain
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#2

AW: Stack-Überlauf

  Alt 9. Mär 2011, 17:16
Wird wohl an den close liegen.
Kommentiere es mal aus und probiere was passiert.

Delphi-Quellcode:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   if Gespeichert = 'Jathen
   begin
      //close;
   end else begin
      if (MessageDlg('Sie haben nicht gespeichern! Wollen Sie vor dem Beenden speichern?', mtWarning, [mbYes, mbNo], 0) = mrYes) then
      begin
         bt_save.click;
         //close;
      end;
      if (MessageDlg('Sie haben nicht gespeichern! Wollen Sie vor dem Beenden speichern?', mtWarning, [mbYes, mbNo], 0) = mrNo) then
      begin
         //close;
      end;
   end;
end;
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
hans ditter

Registriert seit: 25. Jun 2010
Ort: Niedersachsen
263 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: Stack-Überlauf

  Alt 9. Mär 2011, 17:23
Mal eine andere Anmerkung... ist da nicht eine MessageDlg zu viel? Wenn die erste nicht Ok gedrückt wird, dann wird doch einfach geschlossen, oder nicht? Ansonsten würde ja auch ein einfacher else-Zweig reichen.
Weil so wird ja zweimal eine MessageDlg aufgerufen... vlt führt das auch zum Überlauf?

LG; hans ditter
RudiRüsselSeineSocketKomponente - SirRufo (--> Chat mit PM)

Delphi Programming is the best one!
  Mit Zitat antworten Zitat
Benutzerbild von Array
Array

Registriert seit: 11. Feb 2011
33 Beiträge
 
Delphi 2010 Architect
 
#4

AW: Stack-Überlauf

  Alt 9. Mär 2011, 17:26
Hans:

Ja, hast Recht - hab vergessen das raus zu tun - hab ein wenig herum probiert um den Stackfehler wegzubekommen...

BUG:

Auch du hast Recht - es lag an den Close - die braucht man gar nicht...

Danke!
LoadfromBrain
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#5

AW: Stack-Überlauf

  Alt 9. Mär 2011, 17:26
Hallo,

ein close im Ereignis OnClose ruft wiederrum OnClose auf. Da da aber ein close drin ist, wiederholt sich das ständig, bis der Stack (über-)voll ist.

Solche Abfragen sollten in OnCloseQuery rein.

Beispiel:
Delphi-Quellcode:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  //Beenden erlauben/verweigern
  CanClose := (Gespeichert = 'Ja') or (MessageDlg('Sie haben nicht gespeichern! Wollen Sie vor dem Beenden speichern?', mtWarning, [mbYes, mbNo], 0) = mrYes);
end;
CanClose = true sagt, dass die Anwendung geschlossen werden kann.

Bei Abfrage auf mrYes wird CanClose true wenn der Bediener auf "Ja" klickt. Klickt er auf "Nein" dann ist CanClose false und es wird nicht geschlossen.

Der Code zum Speichern dann in das OnClose. Dies wird nur aufgerufen, wenn das CanClose in OnCloseQuery auf true gesetzt wurde.

Das würde dann so aussehen:

Delphi-Quellcode:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  //Button "sichern" anklicken
  bt_save.click;
end;
[Edit]
Die Abfrage auf gespeichert ebenfalls in das OnCloseQuery gelegt. Dadurch kommt keine Meldung wenn Gespeichert = 'Ja' ist.
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<

Geändert von Helmi ( 9. Mär 2011 um 17:34 Uhr)
  Mit Zitat antworten Zitat
alfold

Registriert seit: 29. Jun 2010
Ort: Neustrelitz
393 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: Stack-Überlauf

  Alt 9. Mär 2011, 17:28
Erstens das, und zweitens kommt er aus seiner close nie raus so wie es jetzt da steht!

Besser ist die Abfrage auch im onCloseQuery zu machen und dann CanClose je nach Bedingung zu setzen!

mist zu langsam

Gruss alfold
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#7

AW: Stack-Überlauf

  Alt 9. Mär 2011, 17:31
mist zu langsam
[OT] HaHa! [/OT]
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#8

AW: Stack-Überlauf

  Alt 9. Mär 2011, 21:47
ich will auch noch

Sagen wir es mal anders, oder man schaue mal in die OH.
Delphi-Referenz durchsuchenTForm.OnClose Delphi-Referenz durchsuchenTForm.OnCloseQuery



OnClose wird aufgerufen, wenn die Form endgültig geschlossen wird

OnCloseQuery wird davor aufgerufen, bevor überhaupt feststeht ob wirklich geschlossen werden soll



PS: hat sich mal jemand den Action-Parameter angesehn?
Vorallem das caMinimize (Delphi-Referenz durchsuchenTCloseAction) ... ich glaub da kann shnell mal was passieren, was ihr eigentlich nicht wollt
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 9. Mär 2011 um 21:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#9

AW: Stack-Überlauf

  Alt 9. Mär 2011, 21:55
Allgemein sollte man bei Stacküberläufen gucken, ob man rekursiver programmiert hat als man vorhatte
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#10

AW: Stack-Überlauf

  Alt 9. Mär 2011, 22:26
Allgemein sollte man bei Stacküberläufen gucken, ob man rekursiver programmiert hat als man vorhatte
Das ist zwar oftmals wirklich der Grund, aaaaaaaber

Delphi-Quellcode:
procedure TForm5.FormCreate(Sender: TObject);
var
  a: array[0..12345678] of Byte;
begin
  if a[0] = 0 then
    // nix (keine Lust)
end;
Und nun such mal den rekursiven Aufruf
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:22 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