Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Überforderte For-Schleife oder was? (https://www.delphipraxis.net/27175-ueberforderte-schleife-oder.html)

Andreas L. 5. Aug 2004 13:33


Überforderte For-Schleife oder was?
 
Hi,
ich lasse mit folgender Procedure einen Ordner einlesen. Es wird ein Datei-Filter verwendet:

Delphi-Quellcode:
procedure GetAllFilesEM(Path, ExtMask: String; List: TStrings;
  SubFolder: Boolean);
var
  Attrib, k: Integer;
  Search: TSearchRec;
begin
  Attrib := faArchive + faReadOnly + faHidden;

  if Path[Length(Path)] <> '\' then Path := Path + '\';

  with TStringList.Create do
  try
    CommaText := ExtMask;

    for k := 0 to Count - 1 do
    if FindFirst(Path + '*.' + Strings[k], Attrib, Search) = 0 then
      repeat
        List.Add(AnsiUpperCase(Path + Search.Name));
      until FindNext(Search) <> 0;

    FindClose(Search);
  finally Free end;

  if SubFolder then
  begin
    if FindFirst(Path + '*.*', faDirectory, Search) = 0 then
    begin
      repeat
        if ((Search.Attr and faDirectory) = faDirectory) and
          (Search.Name[1] <> '.') then
          GetAllFilesEM(Path + Search.Name, ExtMask, List, SubFolder);
      until FindNext(Search) <> 0;

      FindClose(Search);
    end;
  end;
end;
Der Aufruf:
Delphi-Quellcode:
procedure TForm4.Button1Click(Sender: TObject);
begin
 if jvdirectoryedit1.text='' then
  begin
   ShowMessage('Bitte einen Grafikordner angeben!');
  end
   else
    if SpinEdit1.Text='0' then
     begin
      ShowMessage('Der Interval muss min. 1 Sekunde betragen!');
     end
    else
     begin
     form1.timer1.interval:=strtoint(spinedit1.Text + '000'); //000 dazu zählen da angabe in milisekunden und nicht in sekunden
     GetAllFilesEM(jvdirectoryedit1.Text, 'bmp, gif, jpg, ico, jpeg, png', form1.ListBox1.Items, false); //dateien einlesen
     form1.timer1.enabled:=true;
     close;
     end;
end;
Das alles geschieht auf form4. die ganzen dateinamen werden in eine listbox auf form1 geladen, dies funktioniert auch.

Wenn ich nun folgende Procedure ausführe dauert es etwas und das Programm stürzt ab, ohne Meldungen...

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
 i : Integer;
begin
  for i:=0 to Listbox1.Count-1 do
   begin
    Image1.Picture.LoadFromFile(listbox1.Items.Strings[i]);
   end;
end;
Wo liegt mein fehler?

Greetz und thx

leddl 5. Aug 2004 14:00

Re: Überforderte For-Schleife oder was?
 
Wenn ich das richtig verstehe, willst du so ne Art Diashow machen, richtig?

Kanns mir nich hundertprozentig erklären, aber denke, der Fehler könnte daran liegen, daß du bei jedem Aufruf von onTimer ALLE (Also z.B jede Sekunde ALLE Bilder nacheinander. Das macht dann bei 10 Bildern schon 1 Bild alle 100ms) Bilder nacheinander darstellst. Warhscheinlich kommt da Delphi nicht mit. :D Aber warum das Programm ohne Fehlermeldung abstürzt?! Kein Plan!
Versuchs evtl mal über nen Zähler, der bei jedem Aufruf von onTimer hochgezählt wird. Und dann schreibst du eben
Delphi-Quellcode:
Image1.Picture.LoadFromFile(listbox1.Items.Strings[counter]);
Ohne die For-Schleife.

Vielleicht geht das an dem vorbei, was du willst. Vielleicht willst du ja ALLE Bilder jede Sekunde (oder eben alle 2,3,... Sekunden, je nach Angabe) nacheinander durchlaufen. Aber das is jetzt das einzige, was mir direkt aufgefallen is.

Werds jetzt gleich bei mir mal ausprobieren obs klappt.

//Edit:
Was mir grad aufgefallen is: Die Anweisung
Delphi-Quellcode:
if Path[Length(Path)] <> '\' then Path := Path + '\';
kannst dir einfacher gestalten. Dafür gibts
Delphi-Quellcode:
Path := IncludeTrailingPathDelimiter[Path];
:wall: Mann, bin ich doof! Is doch klar, warum das "abstürzt"! :D Du hast ja "close" geschrieben. Und Delphi wartet net, bis dein Timer alle Bilder durchlaufen hat. Mach mal das close im ButtonClick weg und schreib die TimerFunktion um wie folgt:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
Begin
  If Counter <= ListBox1.Items.Count - 1 Then
  Begin
    Form1.Caption := IntToStr(Counter);
    Image1.Picture.LoadFromFile(listbox1.Items.Strings[Counter]);
    inc(Counter);
  End
  Else
  Begin
    Timer1.Enabled := false;
    close;
  End;
End;
Den Counter würd ich mir global deklarieren und vor dem Setzen von Enabled auf true auch bitte auf 0 setzten. Ich weiß, da ham manche Probleme mit, ich würds aber trotzdem machen. Kannst aber theoretisch auch den Timer1.Tag dafür benutzen.

Ach ja: Ich bekomm beim Laden von JPGs und GIFs ne Fehlermeldung. Hab noch nie zur Laufzeit Bilder in ne TImage geladen, deswegen kenn ich mich damit nich aus. Aber kanns sein, daß man solche Bilder erst in BMP umwandeln muß?
Naja, aber mit BMPs gehts bei mir jetzt.

Andreas L. 6. Aug 2004 10:07

Re: Überforderte For-Schleife oder was?
 
Zitat:

Den Counter würd ich mir global deklarieren und vor dem Setzen von Enabled auf true auch bitte auf 0 setzten.
Wie jetzt? :wiejetzt:

leddl 6. Aug 2004 10:22

Re: Überforderte For-Schleife oder was?
 
Ok, sorry. Nochmal ganz langsam. Hab mich selbst in Rage geschrieben! :mrgreen:

Du kannst wählen, wie dus machen willst. Entweder du deklarierst dir ne globale Variable (Mögen manchen nicht, deswegen die Alternative) oder du benutzt einfach den Timer1.Tag.

1) Du deklarierst dir die globale Variable (zb Counter) als Integer und setzt sie im Button4Click VOR Zeile 14 auf 0.
Dann schreibst du deinen Timer um, wie ichs geschrieben hab.

2) Wenn dir die globale Variable nich gefällt, dann benutzt du, wie gesagt, den Timer1.Tag. Das läuft eigentlich analog. Um eventuelle Wiederholungen möglich zu machen (dafür müßtest du aber das close im Timer weglassen) solltest du auch hier den Tag vor dem enablen des Timers auf 0 setzen.
Ansonsten überall "Counter" durch "Timer1.Tag" ersetzen.
Ausnahme: inc(counter)! Bin mir nich sicher, ob inc(Timer1.Tag) funktioniert. Evtl mußt du da Timer1.Tag := Timer1.Tag + 1 schreiben.


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