![]() |
exe Datei verhält sich anders als in der IDE-Umgebung
Hallo Delphi-Praxis-Team,
mein Programm stürzt ab, wenn ich die exeDatei benutze. Aber in der IDE-Umgebung läuft das Programm ohne Probleme. Ich habe mit Hilfe einer Showmessage Anweisung die Stelle herausgefunden, an der das Programm abstürzt. Jetzt läuft die ausführbare Datei mit dem "Stop", also einer Showmessage Anweisung durch, aber halt mit einer ungewollten Meldung als Showmessage Anweisung. Folgend der Quellecode an der besagten Stelle:
Code:
Es ist natürlich eigentlich nicht möglich, auf diese Art einen Fehler zu erkennen. Aber vielleicht weis jemand, wo ich meine Aufmerksamkeit hin lenken muss, da ich so nicht weiter weis.
Function TFormStart.LoescheObjektListe(ohneWarnmeldung:Boolean):Boolean;
Var geloescht,weiter:Boolean; begin geloescht:=False; if ohneWarnmeldung then begin weiter:=True; end else begin if Objekte.Count>0 then begin if messageDLG('wollen Sie die vorhandenen "'+inttostr(Objekte.Count)+'" Objekte überschreiben',mtConfirmation,[mbYes,mbNo],0) = mrno then weiter:=False; end; end; if weiter then begin while Objekte.Count>0 do begin OB:=Objekte[0]; OB.loeschen; Objekte.Delete(0); end; Objekte.Clear; geloescht:=True; end; Result:=weiter; //showmessage ('Result= '+boolToStr(Result)+' weiter '+BoolToStr(weiter)); end; Also, Klammere ich am Schluss der Funktion dass showmessage aus, stürzt es an der Stelle ab. Mit der Unterbrechung durch eine Meldung, läuft das Programm nach der Meldung problemlos durch. Die Funktion wird nach dem laden einer Filestream-Datei aufgerufen. Danke einfach schon mal, für das Durchlesen. Grüße aus dem Saarland, der Eisenmann |
AW: exe Datei verhält sich anders als in der IDE-Umgebung
Hallo Eisenmann,
Zitat:
Wenn der Parameter "ohneWarnmeldung" = false ist, und die Liste(?) "Objekte" leer ist (Count=0), dann ist der Wert der Variable "weiter" nicht definiert. Setze hinter "geloescht = False;" noch ein "weiter := False;". Gibt der Compiler bei der Zuweisung zu "Result" keine Warnung aus? Nachtrag: Bei mir meldet der Compiler zwei Hinweise und eine Warnung: H2077 Value assigned to 'geloescht' never used. H2077 Value assigned to 'geloescht' never used. W1036 Variable 'weiter' might not have been initialized |
AW: exe Datei verhält sich anders als in der IDE-Umgebung
Hallo Eisenmann,
stürzt auch die im Debug-Modus kompilierte Exe ab? Gruß, Andreas |
AW: exe Datei verhält sich anders als in der IDE-Umgebung
Delphi-Quellcode:
Hier muss noch der Fall abgefangen werden, wenn kein Button, sondern das Kreuz zum Schließen verwendet wird.
if messageDLG('wollen Sie die vorhandenen "'+inttostr(Objekte.Count)+'" Objekte überschreiben',mtConfirmation,[mbYes,mbNo],0) = mrno then weiter:=False;
Delphi-Quellcode:
Ist OB eine globale Variable? Würde ich an dieser Stelle auf keinen Fall machen. Wer weiß, was dann an anderer Stelle im Programm möglicherweise in OB steht.
OB:=Objekte[0];
Es ist nicht sichergestellt, dass Objekte überhaupt einen Wert hat. Ich würde mindestens eine Prüfung mit
Delphi-Quellcode:
erwarten.
assigned
Die kritischen Stellen sind ohne try..except/finally. Du schreibst auch nicht, mit welcher Meldung das Programm abstürzt. Mit einem Exception-Handling könntest du vermutlich noch mehr Infos bekommen. Das Löschen der Objekte wirkt auch etwas merkwürdig. Vom
Delphi-Quellcode:
würde ich erwarten, dass es sich um die Freigabe der Objektliste kümmert. Läuft hier vielleicht irgendwas doppelt und der Absturz resultiert aus der Doppelbehandlung?
Objekte.Clear
|
AW: exe Datei verhält sich anders als in der IDE-Umgebung
Hallo,
erst mal vielen Dank für die schnellen Antworten. Jetzt kann ich da mal einiges ausprobieren und melde mich dann wieder. Grüße aus dem Saarland, der Eisenmann |
AW: exe Datei verhält sich anders als in der IDE-Umgebung
Etwa lange her Deutsch zu schreiben....
Code:
Welche classtype ist Objecte?
while Objekte.Count>0 do begin
OB:=Objekte[0]; OB.loeschen; Objekte.Delete(0); end; Der liste loeschen mach ich immer vom (count-1) bis 0. Der Delete muss dan nicht jeder mal indexen scheiben... |
AW: exe Datei verhält sich anders als in der IDE-Umgebung
joar
* "geloescht" wird niemals verwendet * "weiter" wird oft garnicht gesetzt/zugewiesen (warum liest niemand das, was der Compiler sagt?) * * siehe Objekte.Count=0 oder nicht mbYes * Clear ist etwas nutzlos, weil dort die Liste immer schon leer ist (bei Dem wie du es da oben machst) * das letzte ShowMessage: Result sind weiter sind immer gleich ... wozu dann Beides anzeigen? * ...
Delphi-Quellcode:
Genau das, was dein Code von da oben macht, nur ohne die "nichtinitialisierten Variablen" (vor dem zwei IF noch ein weiter:=True; eingefügt) und die IFs auch direkt zusammengefasst.
begin
if ohneWarnmeldung then begin Result := True; end else begin Result := (Objekte.Count=0) or (MessageDlg('Wollen Sie die vorhandenen '+Objekte.Count.ToString+' Objekte überschreiben',mtConfirmation,[mbYes,mbNo],0)=mrYes); end; { Result := ohneWarnmeldung or (Objekte.Count=0) or (MessageDlg('Wollen Sie die vorhandenen '+Objekte.Count.ToString+' Objekte überschreiben',mtConfirmation,[mbYes,mbNo],0)=mrYes); } if Result then begin while Objekte.Count>0 do begin OB := Objekte[0]; OB.loeschen; Objekte.Delete(0); end; { while Objekte.Count>0 do begin //OB := Objekte.Extract(0); // Extract = Auslesen+Delete //OB.loeschen; Objekte.Extract(0).loeschen; end; } { for var i := Objekte.Count-1 downto 0 do Objekte[i].loeschen; Objekte.Clear; } { // Warum "loeschen" und nicht Free/Destroy? // Warum keine ObjectList mit Owns=True? // Und schon reicht ein einziger Befehl. Objekte.Clear; } end; end;
Delphi-Quellcode:
oder
begin
if not ohneWarnmeldung and (Objekte.Count>0) and (MessageDlg('Wollen Sie die vorhandenen '+Objekte.Count.ToString+' Objekte überschreiben?',mtConfirmation,[mbYes,mbNo],0)=mrYes) then Exit(False); while Objekte.Count> do Objekte.Extract(0).loeschen; Result := True; end;
Delphi-Quellcode:
begin
if not ohneWarnmeldung and (Objekte.Count>0) and (MessageDlg('Wollen Sie die vorhandenen '+Objekte.Count.ToString+' Objekte überschreiben?',mtConfirmation,[mbYes,mbNo],0)=mrYes) then Exit(False); for var i := 0 to Objekte.Count-1 do Objekte[i].loeschen; Objekte.Clear; // ob noch ein Try-Finally oder die Variante mit Extract ... kommt drauf an, wie man die Fehlerbehandlung braucht, falls es im "loeschen" knallt Result := True; end; |
AW: exe Datei verhält sich anders als in der IDE-Umgebung
Welcher Typ ist Objekte?
Was macht OB.Loeschen? Wenn Objekte eine TObjectList ist, dann wird es wohl weiter knallen, wenn du AOwnsObjects im Create auf True gelassen hast. OB.Loeschen wird hoffentlich nicht das Objekt mit einer eigenen Methode freigeben... Frank |
AW: exe Datei verhält sich anders als in der IDE-Umgebung
Ich würde als erstes einmal FastMM4 mit FullDebugMode einbinden und schauen, ob das nicht schon etwas ausspuckt. Wenn da ein Objekt doppelt freigegeben wird oder ähnliches, würde das dort anschlagen.
|
AW: exe Datei verhält sich anders als in der IDE-Umgebung
Ich hatte mal den Fall von unerklärlichen Fehlern beim Arbeiten mit einer TObjecrList (einer generischen). Den Fehler habe ich kaum gefunden, Schuld war ein fehlendes inherited im Konstruktor der TObjectList. Aber auf jeden Fall mal meine Vorredner beherzigen. Der Hund könnte auch beim Objekt selber begraben sein…
Viel Erfolg. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz