![]() |
Lazarus-Programm beendet sich einfach
Hallo Liebe DP,
ich habe mal wieder ein Problem mit Lazarus (unter Ubuntu 10.04). Mit dem Click auf eine List-Box wird eine Prozedur aufgerufen, die dann eine Datei lädt und ein paar Daten aus dieser in ein Array abspeichert. Nun zeigt mir Lazarus aber nach dem Click auf die List-Box sofort die Nachricht "Ausführung beendet!" und das Programm schließt sich. Ich habe dann einen Haltepunkt an den Anfang der Prozedur gesetzt und per Einzelschritt festgestellt, dass er tatsächlich die ganze Prozedur abarbeitet und sich DANACH beendet. Merkwürdig ist allerdings, dass er ein
Delphi-Quellcode:
, das ich zum Testen angehängt habe, nicht mehr abarbeitet. Der letzte Befehl ist aber nur ein
ShowMessage('');
Delphi-Quellcode:
. Außerdem kann es an dem nicht liegen, denn der Befehl wird noch bearbeitet und erst danach beendet sich das Programm.
Canvas.Draw
Ich hoffe Ihr könnt mir irgendwie helfen, lg Bianfable |
AW: Lazarus-Programm beendet sich einfach
Eventuell erzählt dir der Debugger aber auch Schmuh. Ohne Quellcode bzw. dem Projekt als Solches könnte es schwer werden. ;)
|
AW: Lazarus-Programm beendet sich einfach
Dann hast du Dir wohl den Stack zerschossen oder du hast eine endlose Rekursion (hier gibt es wegen Speichermangel manchmal Probleme noch eine Exception auszulösen).
|
AW: Lazarus-Programm beendet sich einfach
Wie lädst du denn die Datei und wie befüllst du das Array?
Spontan würde ich einfach mal an einen Bufferoverrun denken, also daß du beim Befüllen irgendwas "wichtiges" überschreibst. [add] @RedBox: faules Ding du Zitat:
|
AW: Lazarus-Programm beendet sich einfach
Also, rekursiv aufgerufen wird da nichts. Ich häng mal den Code-Teil an:
Delphi-Quellcode:
procedure TForm1.ListBox1Click(Sender: TObject);
begin if ListBox1.ItemIndex >= 0 then LoadLevel(PP + 'Level/' + ListBox1.Items.Strings[ListBox1.ItemIndex] + '.txt'); end; procedure TForm1.LoadLevel(const FileName: String); var F: TStringList; i: Integer; Bildpfad: String; begin GameRunning := false; F := TStringList.Create; try F.LoadFromFile(FileName); if (F.Count < 4) or ((F.Count - 1) div 3 <> (F.Count - 1) / 3) then begin ShowMessage('Fehlerhafte Datei!'); exit; end; //Bild laden Bildpfad := PP + 'Grafik/' + F.Strings[0]; if FileExists(Bildpfad) then Bild.LoadFromFile(Bildpfad) else begin ShowMessage('Die angegebene Bilddatei "' + Bildpfad + '" konnte nicht gefunden werden!'); exit; end; F.Delete(0); //Daten laden SetLength(S, 0); for i := 1 to F.Count div 3 do begin SetLength(S, Length(S) + 1); S[Length(S) - 1].Name := F.Strings[0]; try S[Length(S) - 1].x := StrToInt(F.Strings[1]); S[Length(S) - 1].y := StrToInt(F.Strings[2]); except ShowMessage('Ungültige Koordinaten!'); exit; end; F.Delete(0); F.Delete(0); F.Delete(0); end; finally F.Free; end; GameRunning := true; Index := -1; Label2.Visible := true; NextTown; ShowMessage(''); //TEST -> wird nicht mehr angezeigt end; procedure TForm1.NextTown; begin inc(Index); if Index > Length(S) - 1 then ShowMessage('Game Over') else begin Label2.Caption := S[Index].Name; Image1.Canvas.Draw(0, 0, Bild); end; end; |
AW: Lazarus-Programm beendet sich einfach
Ich habe jetzt durch auskommentieren einzelner Zeilen festgestellt, dass der Fehler in der letzten Zeile erzeugt wird, also beim
Delphi-Quellcode:
. Zum testen habe ich etwas anderes auf das Image gezeichnet - funktioniert einwandfrei, also am Image liegt es nicht. Dann hab' ich zum testen einmal das Bild per
Image1.Canvas.Draw(0, 0, Bild);
Delphi-Quellcode:
auf die Festplatte gespeichert - funktioniert (Programm beendet sich nicht) und sieht auch richtig aus (im Dateimanager geöffnet). Also liegt es auch nicht am Bild. Wie kann dann der Fehler in dieser Zeile erzeugt werden? Bei einem
SaveToFile
Delphi-Quellcode:
kann doch eigentlich nichts schief gehen, sofern das Image und die Bilddatei korrekt im Speicher sind!?!
Draw
Edit: Ich habe jetzt einmal das Bild Pixel für Pixel auf das Image übertragen (hat ewig gedauert, war ja nur zum testen): Alles ist schwarz. Dann hab ich mit
Delphi-Quellcode:
mal ein paar zufällig gewählte Pixel des Bildes aufgerufen: immer "clBlack". Wie kann das jetzt sein, wenn mit
ShowMessage(ColorToString())
Delphi-Quellcode:
das Bild korrekt gespeichert wird???
SaveToFile
|
AW: Lazarus-Programm beendet sich einfach
Hi!
Zitat:
Versuch's doch mal testweise mit
Delphi-Quellcode:
Wenn das funktioniert, dann solltest du eventuell eher eine TPaintBox verwenden und in deren OnPaint-Ereignis alles zeichnen, was du zeichnen musst (auslösen kannst du das dann per
// falls Bild ein TBitmap ist
Image1.Picture.Bitmap.Assign(Bild); // falls Bild ein TPicture ist Image1.Picture.Assign(Bild);
Delphi-Quellcode:
). Dort kannst du dann soviel Canvas.Draw machen, wie du möchtest. :mrgreen:
DeinePaintBox.Invalidate
Gruß, Sven |
AW: Lazarus-Programm beendet sich einfach
Ich hab's jetzt mal so probiert:
Delphi-Quellcode:
Das gleiche Problem, ändert nichts. TPaintBox wäre natürlich eine Alternative, allerdings hat das mit dem Image bisher immer so funktioniert, ich verwende das eigentlich schon zum 100. Mal genau so, nämlich einfach irgendwo
//Bild ist Bitmap:
Image1.Picture.Bitmap.Assign(Bild);
Delphi-Quellcode:
nutzen, um irgendwas zu zeichnen...
Image1.Canvas
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:15 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