Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   FreePascal Lazarus-Programm beendet sich einfach (https://www.delphipraxis.net/153006-lazarus-programm-beendet-sich-einfach.html)

bianfable 16. Jul 2010 16:19

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:
ShowMessage('');
, das ich zum Testen angehängt habe, nicht mehr abarbeitet. Der letzte Befehl ist aber nur ein
Delphi-Quellcode:
Canvas.Draw
. Außerdem kann es an dem nicht liegen, denn der Befehl wird noch bearbeitet und erst danach beendet sich das Programm.

Ich hoffe Ihr könnt mir irgendwie helfen,

lg Bianfable

Mithrandir 16. Jul 2010 16:29

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

shmia 16. Jul 2010 16:31

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).

himitsu 16. Jul 2010 16:35

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:

Dann hast du Dir wohl den Stack zerschossen
oder was Anderes.

bianfable 16. Jul 2010 16:36

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;

bianfable 18. Jul 2010 10:30

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:
Image1.Canvas.Draw(0, 0, Bild);
. 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
Delphi-Quellcode:
SaveToFile
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
Delphi-Quellcode:
Draw
kann doch eigentlich nichts schief gehen, sofern das Image und die Bilddatei korrekt im Speicher sind!?!

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:
ShowMessage(ColorToString())
mal ein paar zufällig gewählte Pixel des Bildes aufgerufen: immer "clBlack". Wie kann das jetzt sein, wenn mit
Delphi-Quellcode:
SaveToFile
das Bild korrekt gespeichert wird???

JamesTKirk 18. Jul 2010 15:33

AW: Lazarus-Programm beendet sich einfach
 
Hi!

Zitat:

Zitat von bianfable (Beitrag 1035915)
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:
ShowMessage(ColorToString())
mal ein paar zufällig gewählte Pixel des Bildes aufgerufen: immer "clBlack". Wie kann das jetzt sein, wenn mit
Delphi-Quellcode:
SaveToFile
das Bild korrekt gespeichert wird???

Ich glaube ( :!: ), dass es daran liegt, dass du versuchst außerhalb der Paint-Routine des Image auf dessen Canvas zu zeichnen.

Versuch's doch mal testweise mit
Delphi-Quellcode:
// falls Bild ein TBitmap ist
Image1.Picture.Bitmap.Assign(Bild);
// falls Bild ein TPicture ist
Image1.Picture.Assign(Bild);
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
Delphi-Quellcode:
DeinePaintBox.Invalidate
). Dort kannst du dann soviel Canvas.Draw machen, wie du möchtest. :mrgreen:

Gruß,
Sven

bianfable 20. Jul 2010 13:20

AW: Lazarus-Programm beendet sich einfach
 
Ich hab's jetzt mal so probiert:
Delphi-Quellcode:
//Bild ist Bitmap:
Image1.Picture.Bitmap.Assign(Bild);
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
Delphi-Quellcode:
Image1.Canvas
nutzen, um irgendwas zu zeichnen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:29 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