Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Werkzeuge (https://www.delphipraxis.net/63-sonstige-werkzeuge/)
-   -   exe Datei verhält sich anders als in der IDE-Umgebung (https://www.delphipraxis.net/209382-exe-datei-verhaelt-sich-anders-als-der-ide-umgebung.html)

Eisenmann 29. Nov 2021 12:14

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:
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;
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.
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

Achim Kalwa 30. Nov 2021 10:33

AW: exe Datei verhält sich anders als in der IDE-Umgebung
 
Hallo Eisenmann,
Zitat:

Zitat von Eisenmann (Beitrag 1498358)
mein Programm stürzt ab, wenn ich die exeDatei benutze.
Aber in der IDE-Umgebung läuft das Programm ohne Probleme.

Ohne jetzt den Code in die IDE geladen zu haben:
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

Andreas13 30. Nov 2021 10:49

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

Jasocul 30. Nov 2021 12:33

AW: exe Datei verhält sich anders als in der IDE-Umgebung
 
Delphi-Quellcode:
if messageDLG('wollen Sie die vorhandenen "'+inttostr(Objekte.Count)+'" Objekte überschreiben',mtConfirmation,[mbYes,mbNo],0) = mrno then weiter:=False;
Hier muss noch der Fall abgefangen werden, wenn kein Button, sondern das Kreuz zum Schließen verwendet wird.

Delphi-Quellcode:
OB:=Objekte[0];
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.

Es ist nicht sichergestellt, dass Objekte überhaupt einen Wert hat. Ich würde mindestens eine Prüfung mit
Delphi-Quellcode:
assigned
erwarten.

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:
Objekte.Clear
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?

Eisenmann 30. Nov 2021 13:21

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

JWBokx 30. Nov 2021 13:56

AW: exe Datei verhält sich anders als in der IDE-Umgebung
 
Etwa lange her Deutsch zu schreiben....

Code:
    while Objekte.Count>0 do begin
      OB:=Objekte[0];
      OB.loeschen;
      Objekte.Delete(0);
    end;
Welche classtype ist Objecte?
Der liste loeschen mach ich immer vom (count-1) bis 0.
Der Delete muss dan nicht jeder mal indexen scheiben...

himitsu 30. Nov 2021 14:34

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:
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;
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.
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);
  while Objekte.Count> do
    Objekte.Extract(0).loeschen;
  Result := True;
end;
oder
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;

dataspider 30. Nov 2021 14:51

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

jaenicke 30. Nov 2021 14:58

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.

scrat1979 30. Nov 2021 21:41

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 00:41 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