AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein FreePascal Lazarus-Programm beendet sich einfach
Thema durchsuchen
Ansicht
Themen-Optionen

Lazarus-Programm beendet sich einfach

Offene Frage von "bianfable"
Ein Thema von bianfable · begonnen am 16. Jul 2010 · letzter Beitrag vom 20. Jul 2010
Antwort Antwort
bianfable

Registriert seit: 20. Nov 2007
23 Beiträge
 
#1

Lazarus-Programm beendet sich einfach

  Alt 16. Jul 2010, 16:19
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 ShowMessage(''); , das ich zum Testen angehängt habe, nicht mehr abarbeitet. Der letzte Befehl ist aber nur ein 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
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#2

AW: Lazarus-Programm beendet sich einfach

  Alt 16. Jul 2010, 16:29
Eventuell erzählt dir der Debugger aber auch Schmuh. Ohne Quellcode bzw. dem Projekt als Solches könnte es schwer werden.
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

AW: Lazarus-Programm beendet sich einfach

  Alt 16. Jul 2010, 16:31
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).
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Lazarus-Programm beendet sich einfach

  Alt 16. Jul 2010, 16:35
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
bianfable

Registriert seit: 20. Nov 2007
23 Beiträge
 
#5

AW: Lazarus-Programm beendet sich einfach

  Alt 16. Jul 2010, 16:36
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;
  Mit Zitat antworten Zitat
bianfable

Registriert seit: 20. Nov 2007
23 Beiträge
 
#6

AW: Lazarus-Programm beendet sich einfach

  Alt 18. Jul 2010, 10:30
Ich habe jetzt durch auskommentieren einzelner Zeilen festgestellt, dass der Fehler in der letzten Zeile erzeugt wird, also beim 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 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 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 ShowMessage(ColorToString()) mal ein paar zufällig gewählte Pixel des Bildes aufgerufen: immer "clBlack". Wie kann das jetzt sein, wenn mit SaveToFile das Bild korrekt gespeichert wird???

Geändert von bianfable (18. Jul 2010 um 11:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von JamesTKirk
JamesTKirk

Registriert seit: 9. Sep 2004
Ort: München
604 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Lazarus-Programm beendet sich einfach

  Alt 18. Jul 2010, 15:33
Hi!

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 ShowMessage(ColorToString()) mal ein paar zufällig gewählte Pixel des Bildes aufgerufen: immer "clBlack". Wie kann das jetzt sein, wenn mit 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 DeinePaintBox.Invalidate ). Dort kannst du dann soviel Canvas.Draw machen, wie du möchtest.

Gruß,
Sven
Sven
[Free Pascal Compiler Entwickler]
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
bianfable

Registriert seit: 20. Nov 2007
23 Beiträge
 
#8

AW: Lazarus-Programm beendet sich einfach

  Alt 20. Jul 2010, 13:20
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 Image1.Canvas nutzen, um irgendwas zu zeichnen...
  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 12:55 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