[Delphi] Wo ist denn dieser s***** Fehler
lima-city → Forum → Programmiersprachen → Delphi & Pascal
anweisung
beitrag
bild
control
datei
eckige klammer
error
fehler
ketchup
lesbarkeit
lngen
mau
not
quelltext
rekursion
schleifen
sender
speicher
stack
zeile
-
Hallo
Bin ich blind? Ich finde keinen Fehler in diesem Quelltext:
procedure TForm1.FormCreate(Sender: TObject);
var
map: textfile;
zeile :string;
laenge,i,y: integer;
part: Timage;
begin
assignfile(map, 'maps\easy.txt');
reset(map);
while eof(map) <> true do begin
y:=y+1;
readln(map,zeile);
laenge:=length(zeile);
Part:=part.Create(self);
i:=1;
for i:=1 to laenge-1 do begin
if zeile = '0' then begin
part.Picture.LoadFromFile('images\mauer.jpg'); // Bild festlegen
part.Left:=(i*60); // Position
part.Top:=(y*60); // bestimmen
part.Picture.Free;
end
else if zeile = '1' then begin
part.Picture.LoadFromFile('images\weg.jpg'); // Bild festlegen
part.Left:=i*60; // Position
part.Top:=y*60; // bestimmen
part.Picture.Free;
end;
end; // For schleifen ende
end; // While schleifen ende
part.Free;
end;
Aber es kommt immer die Fehlermeldung:
Project BPac.exe raised exeption class EStackOverflow with a message 'Stack overflow' Process Stopped
mfg Ketchup -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Achja Noch etwas:
Ich hab mal gegoogelt und ahbe gefundenn das ein Estackoverflow auftritt wenn
#1 Eine Endlosschleife im Programm ist
#2 Eine anwendung zu viel virtullenspeicher braucht
zu 1#:
Also entweder ich bin doch blind oder ich habe recht und es ist keine rekursion im Quelltext.
zu #2:
Das kann durchaus sein aber ich glaub es nicht.
Hat jemad eine bessere idee wie ich sowas machen könnte?
Ich brauch die beiden Schleifen halt um meine Maps individuel zusammen zu setzen.
mfg Ketchup -
RFehtl da nicht noch irgendwo eine Copy anweisung, oder was soll das Programm machen, vermutlich eine Map zeichnen.
-
Danke schon mal für dei Antwort
RFehtl da nicht noch irgendwo eine Copy anweisung, oder was soll das Programm machen, vermutlich eine Map zeichnen.
Ich wüsste nicht wo du meinst..
In einer Datei (easy.txt) Stehen mehere 0en und 1en in mehreren Reihen.
z.b. So
010101010111
101011101010
...
Und jetzt soll das Programm Reiche für Reihe durgehen und für jede 0 das Bild mauer.jpg eifügen ,unf für jede 0 das Bild weg.jpg
Beitrag geaendert: 20.4.2007 17:58:02 von ketchupfleck -
Wenn es am Speicher liegen sollte, dann mach aus den JPG Dateien doch einfach GIF Dateien, die sind in der Regel bei wenig Farben kleiner.
Außerdem solltest du versuchen die Bilder zu cachen, also nicht immer neu aus der Datei laden. KP, wie das geht, oder ob das überhaupt sinnvoll ist, aber es klingt für mich logisch. ^^ -
Ich habe im Code selbst einige Fehler gefunden:
procedure TForm1.FormCreate(Sender: TObject); var map: textfile; zeile :string; laenge,i,y: integer; part: TImage; begin AssignFile(map, 'maps\easy.txt'); //Ich würde hier den Pfad mit angeben! Reset(map); while not eof(map) do begin y := y + 1; //wo hast du y initialisiert?? ReadLn(map, zeile); laenge := length(zeile); Part := part.Create(self); i := 1; //Das brauchst du nicht!! for i := 1 to (laenge-1) do begin // hier paßt was nicht! //da fehlt was in der Art: if zeile[i] = '0' then begin // auch hier würde ich den Pfad angeben! part.Picture.LoadFromFile('images\mauer.jpg'); // Bild festlegen part.Left := (i*60); // Position part.Top := (y*60); // bestimmen part.Picture.Free; end else if zeile[i] = '1' then begin part.Picture.LoadFromFile('images\weg.jpg'); // Bild festlegen part.Left:=i*60; // Position part.Top:=y*60; // bestimmen part.Picture.Free; end; end; // For schleifen ende end; // While schleifen ende part.Free; end;
Des weiteren ein paar Sachen:
- gewöhn' dir einen besseren Stil an, um die Lesbarkeit (auch für dich selbst bei größeren Projekten) zu erhöhen.
- Was hast du mit dem TImage namens part vor? Du erzeugst es, ja das versteh' ich. Du lädst das Bild, versteh ich auch. Du verschiebst es (Left und Top), und löscht dann das Bild aus dem Speicher (part.Picture.Free)?? Was hast du da vor??
Versteh' ich nicht!
Edit: Im Code-Teil wird etwas nicht richtig angezeigt, weil das als kursiv (italic) angezeigt wird: ich habe geschrieben: if zeile(eckige Klammer auf)i(eckige Klammer zu) = '0' then
Beitrag geaendert: 21.4.2007 16:46:49 von burgi -
ich hab hier mal das copy hingeschrieben, wo ich denke, das es hin muss:
procedure TForm1.FormCreate(Sender: TObject); var map: textfile; zeile,zeichen :string; laenge,i,y: integer; part: TImage; begin AssignFile(map, 'maps\easy.txt'); Reset(map); y:= 0; // hier while not eof(map) do begin y := y + 1; ReadLn(map, zeile); laenge := length(zeile); Part := part.Create(self); for i := 1 to (laenge-1) do begin // hier das copy() zeichen:= copy(zeile,i,1); if zeichen = '0' then begin part.Picture.LoadFromFile('images\mauer.jpg'); // Bild festlegen part.Left := (i*60); // Position part.Top := (y*60); // bestimmen part.Picture.Free; end else if zeichen = '1' then begin part.Picture.LoadFromFile('images\weg.jpg'); // Bild festlegen part.Left:=i*60; // Position part.Top:=y*60; // bestimmen part.Picture.Free; end; end; // For schleifen ende end; // While schleifen ende part.Free; end;
-
Ich glaube nicht, dass der Fehler irgendwo in der Schleife an sich liegt, sondern was er mit dem Bild macht bzw. nicht macht. In der Schleife wird vom TImager der Constructor mehrmals aufgerufen, der Destruktor erst außerhalb der Schleife. Er ändert Left und Top-Werte, obwohl er keinen Parent zugewiesen hat, auf dem das Control verschoben werden soll ...
@ketchup. Mach mal ein ZIP, und schick's mir, dann schau ich mir das an ... -
Huch ...
Mir ist aufgefallen das das völlig schwachsinng ist das ich das bild immer wieder aus dem speicher lösche. Ausserdem muss es zusätzlich noch über ein array laufen, da ja mehere Bilder geladen werden sollen.
Da sind einige Fehler drin aber selbst wenn ich alles unnötige wegstreiche (hab ich mal in einem anderen Projekt gemacht) kommt immer noch der "Access Violation Error".
procedure TForm1.FormCreate(Sender: TObject);
var
s: string;
i: timage;
begin
s:='0';
if s[1]= '1' then begin
i:=i.Create(self);
i.Top:=0;
i.Left:=0;
i.Picture.LoadFromFile('images/weg.jpg');
i.Height:=60;
i.Width:=60;
i.Visible:=true;
end
else begin
i:=i.Create(self);
i.Top:=0;
i.Left:=0;
i.Picture.LoadFromFile('images/mauer.jpg');
i.Height:=60;
i.Width:=60;
i.Visible:=true;
end;
end;
@burgi OK danke (was würde ich nur ohne dich machen XD ) e-mail kommt gleich -
Also ein Fehler ist sicher mal: i := TImage.Create(self) und nicht i := i.Create(self)
-
Achso ein blöder anfänger fehler aber auch.... Mist
Naja Jetz Passiert folgendes:
Er bringt mir kein error (juhu) Aber:
Er zeigt mir trotzdem kein bild an!! -
Alles klar.
Der thread kann geschlossen werden.
Funktioniert alles Prima
mfg Ketchup -
ketchupfleck schrieb:
Alles klar.
Der thread kann geschlossen werden.
Funktioniert alles Prima
mfg Ketchup
***Closed***
Bei Rückfragen PN an mich
gruß patrick91 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage