Dwuetapowa procedura w pętli

0

Mam coś takiego, że w pętli wykonuję procedurę wczytania pliku. W pętli, ponieważ jestem przygotowany na możliwość wybrania kilku plików jednocześnie. A więc:

 For I:=0 to OpenDialog1.Files.Count-1 do
  begin
  OpenFile;
  end;

Problem w tym, że moja procedura jest "dwuetapowa". Najpierw wykonywana jest jedna część (z OpenFile), a potem przenosi się do Timera (bo od tego uzależnione jest kontynuowanie czynności).

Niestety o ile działa to w normalnych warunkach, to w pętli już nie. Wykonuje ona pierwszą część (z OpenFile) ale nie zważa na Timer, od razu powtarzając OpenFile dla kolejnego pliku. W rezultacie pierwszy plik wczytuje się poprawnie a reszta już nie...

Chciałbym uzyskać coś takiego:

 For I:=0 to OpenDialog1.Files.Count-1 do
  begin
  OpenFile;
  Poczekaj aż timer zrobi swoje i wtedy kontynuuj (czyli ponownie wykonaj OpenFile).
  end;

Czytałem o Break, Continue, Halt, Exit itd, ale nie wydaję mi się, by której z nich miało tu zastosowanie ;/.

0

E...
Ale przecież timer właśnie w taki sposób działa :|

0

Ale nie o timer tutaj chodzi... Procedura OpenFile, kończy się wierszem:

Timer1.Enabled:=True;

A więc kończy swoje działanie, i dalszą część zadań, "przerzuca" na Timer. A gdy odpalę to w pętli, OpenFile za każdym razem odpala timer (daje mu enabled), ale już nie czeka aż wykona on swoje czynności.

0

nie prościej zadanie timera wykonać jako kolejną procedurę wywołaną po OpenFile?

0

Myślałem o tym, ale nie wiem jak to zrobić. Znaczy się teoretycznie:

  1. Wykonaj procedurę
  2. Odpal Timer
  3. Poczekaj aż timer zwróci wiadomość że skończył
  4. Kontynuuj.

Ale nie wiem jak wykonać punkt 3.

A w timerze musi być (przynajmniej ja nie widzę innego wyjścia), gdyż mój program działa na bazie innej aplikacji (zewnętrznej). Możliwość komunikacji z nią jest ograniczona, mogę tylko odczytywać logi z jej działania. Ustawiłem więc sobie timer, który odświeża otrzymany log, do momentu aż jego ostatnia linijka zawiera "Done", co oznacza że skończył, i można przejść dalej.

0

Przepraszam, nadal nie widzę tutaj zastosowania dla Timera. Nie prościej będzie tak:

  1. Wykonaj procedurę
  2. Zrób to co miałby zrobić timer
  3. Kontynuuj.
    Na prawdę nie potrafię znaleźć tutaj zastosowania dla Timera.
0

A może coś takiego:

 For I:=0 to OpenDialog1.Files.Count-1 do
  begin
  OpenFile;
   while not ( done) do
    begin
       done:= result z procedury Timera (owe done?)
       Application.ProcessMessage;
    end;
  end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1