AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Werkzeuge exe Datei verhält sich anders als in der IDE-Umgebung
Thema durchsuchen
Ansicht
Themen-Optionen

exe Datei verhält sich anders als in der IDE-Umgebung

Ein Thema von Eisenmann · begonnen am 29. Nov 2021 · letzter Beitrag vom 30. Nov 2021
Antwort Antwort
Eisenmann

Registriert seit: 24. Dez 2016
Ort: Saarland, 66663 Merzig
7 Beiträge
 
Delphi 10.4 Sydney
 
#1

exe Datei verhält sich anders als in der IDE-Umgebung

  Alt 29. Nov 2021, 12:14
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
  Mit Zitat antworten Zitat
Achim Kalwa

Registriert seit: 2. Apr 2005
Ort: Lienen
103 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: exe Datei verhält sich anders als in der IDE-Umgebung

  Alt 30. Nov 2021, 10:33
Hallo Eisenmann,
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
Achim

Geändert von Achim Kalwa (30. Nov 2021 um 10:46 Uhr) Grund: Compiler-Meldungen ergänzt
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
711 Beiträge
 
Delphi XE5 Professional
 
#3

AW: exe Datei verhält sich anders als in der IDE-Umgebung

  Alt 30. Nov 2021, 10:49
Hallo Eisenmann,
stürzt auch die im Debug-Modus kompilierte Exe ab?
Gruß, Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.338 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: exe Datei verhält sich anders als in der IDE-Umgebung

  Alt 30. Nov 2021, 12:33
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.

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 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 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?
Peter
  Mit Zitat antworten Zitat
Eisenmann

Registriert seit: 24. Dez 2016
Ort: Saarland, 66663 Merzig
7 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: exe Datei verhält sich anders als in der IDE-Umgebung

  Alt 30. Nov 2021, 13:21
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
  Mit Zitat antworten Zitat
JWBokx

Registriert seit: 8. Jul 2021
2 Beiträge
 
#6

AW: exe Datei verhält sich anders als in der IDE-Umgebung

  Alt 30. Nov 2021, 13:56
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...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: exe Datei verhält sich anders als in der IDE-Umgebung

  Alt 30. Nov 2021, 14:34
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 1. Dez 2021 um 08:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: exe Datei verhält sich anders als in der IDE-Umgebung

  Alt 30. Nov 2021, 14:51
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
Frank Reim
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.346 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: exe Datei verhält sich anders als in der IDE-Umgebung

  Alt 30. Nov 2021, 14:58
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.028 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: exe Datei verhält sich anders als in der IDE-Umgebung

  Alt 30. Nov 2021, 21:41
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.
Michael Kübler
  Mit Zitat antworten Zitat
Antwort Antwort


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 16:48 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