Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Timer - Kann den fehler nicht finden


Waldkauz - Sa 04.07.09 12:57
Titel: Timer - Kann den fehler nicht finden
Hallo

Ich habe ein Problem, und ich kann den Fehler nicht finden.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var t:integer=6;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
t:=t-1;
if t=5 then
 image1.picture.loadfromfile('bild01.jpg');
if t=3 then image1.picture.loadfromfile('bild02.jpg');
if t=2 then image1.picture.loadfromfile('bild03.jpg');
if t=4 then image1.picture.loadfromfile('bild04.jpg');
if t=1 then image1.picture.loadfromfile('bild05.jpg');
if t=0 then t:=6;
end;


Der Timer soll im Abstand von 1 Sekunde (also Timer1.Interval 1000) ein neues Bild ins Image1 laden, à la Diashow.
Das Problem ist, dass immer wieder Bilder übersprungen werden.


Delete - Sa 04.07.09 13:07

Versuch es mal so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var t:integer=6;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  dec(t);
  if t = 0 then
    t := 6
  else
    image1.picture.loadfromfile(Format('%s\bild%.2d.jpg',[ExcludeTrailingPathDelimiter(KompletterPfadzumBild),t]));
end;


Allerdings wird auf diese Weise kein Bild geladen, wenn t in der ersten Zeile 0 wird.


jaenicke - Sa 04.07.09 13:15

Ist das Absicht im Originalquelltext oben, dass die Reihenfolge der Bilddateien anders ist als das Herunterzählen?
user profile iconWaldkauz hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
t:=t-1;
if t=5 then
 image1.picture.loadfromfile('bild01.jpg');
if t=3 then image1.picture.loadfromfile('bild02.jpg');
if t=2 then image1.picture.loadfromfile('bild03.jpg');
if t=4 then image1.picture.loadfromfile('bild04.jpg');
if t=1 then image1.picture.loadfromfile('bild05.jpg');
if t=0 then t:=6;
end;


R4id - Sa 04.07.09 13:34

Glaube ich nehmlich nicht :D


Blackheart666 - Sa 04.07.09 14:12

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ist das Absicht im Originalquelltext oben, dass die Reihenfolge der Bilddateien anders ist als das Herunterzählen?
user profile iconWaldkauz hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
t:=t-1;
if t=5 then
 image1.picture.loadfromfile('bild01.jpg');
if t=3 then image1.picture.loadfromfile('bild02.jpg');
if t=2 then image1.picture.loadfromfile('bild03.jpg');
if t=4 then image1.picture.loadfromfile('bild04.jpg');
if t=1 then image1.picture.loadfromfile('bild05.jpg');
if t=0 then t:=6;
end;

Was da nicht wirklich eine Rolle spielt ! :wink:


jaenicke - Sa 04.07.09 14:20

Doch, wenn das den Eindruck verursacht, dass da Bilder "ausgelassen" werden. ;-)


Xentar - Sa 04.07.09 15:29

Relative Dateipfade sind böse und wurden vom Teufel erschaffen :evil: :D

Besser:

Delphi-Quelltext
1:
image1.picture.loadfromfile(ExtractFilePath(Application.Exename) + 'bild05.jpg');                    

Damit gehst du immer vom Anwendungspfad aus, und nicht vom Arbeitsverzeichnis.


ffgorcky - Sa 04.07.09 16:47

Also ich hätte das ganze eher so geschrieben (also die Bilder dementsprechend anders durchnummeriert):

Delphi-Quelltext
1:
image1.picture.loadfromfile(ExtractFilePath(Application.Exename)+'\bild0'+IntToStr(t)+'.jpg');                    

Wobei ich immer nicht so ganz weiß, ob die Funktion ExtractFilePath(Pfad:String):String denn hinter das direkte Mutter-Verzeichnis auch noch ein \ setzt...
...und solange Du nicht das Arbeitsverzeichnis beim Programmstart (also in der aufrufenden Verknüpfung) anders angibst, brauchst Du dieses ja auch gar nicht extra machen!

Wenn Du aber lieber für jeden Integer-Wert Deiner Variable t eine eigene Behandlung hast, dann wäre es doch so einfacher:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
t:=t-1;
case t of
   5: image1.picture.loadfromfile('bild01.jpg');
   4: image1.picture.loadfromfile('bild04.jpg');
   3: image1.picture.loadfromfile('bild02.jpg');
   2: image1.picture.loadfromfile('bild03.jpg');
   1: image1.picture.loadfromfile('bild05.jpg');
   0: t:=6;
   end//der Case-Anweisung

Wobei bei dieser Behandlung dann ja das bild05.jpg doppelt so lange angezeigt wird.


jaenicke - Sa 04.07.09 16:49

user profile iconffgorcky hat folgendes geschrieben Zum zitierten Posting springen:
Wobei ich immer nicht so ganz weiß, ob die Funktion ExtractFilePath(Pfad:String):String denn hinter das direkte Mutter-Verzeichnis auch noch ein \ setzt...
Du hast eins zu viel.
ExtractFilePath fügt eins hinzu am Ende, ExtractFileDir macht das selbe und fügt keins hinzu.


jasocul - Mo 06.07.09 11:29

Ihr seid alle tolle Programmierer, aber vielleicht solltet ihr euch mal auf die eigentliche Frage konzentrieren. :wink:

Mögliche Ursachen für den Fehler:
1. Die Bilder stehen nicht im richtigen Verzeichnis.
2. Die Variable t wird noch woanders verändert.
3. Die Bilder sind so groß, dass das Laden und Anzeigen länger dauert, als die Timer-Laufzeit.