Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Schleife mit Timer (https://www.delphipraxis.net/207288-schleife-mit-timer.html)

buko 10. Mär 2021 08:28

Schleife mit Timer
 
Hallo,

hallo ich muss mehrere Strings zeitversetzt aus einer Stringlist versenden.
wenn ich innerhalb eines Timers in einer for schleife die Strings versenden
will arbeitet er im OnTimer ereignis die komplette Schleife ab.
Wie kann ich es hinbekommen das er innerhalb des Timmers nur den nächsten
Eintrag aus der Stringlist abarbeitet?

Ich stehe da auf dem Schlauch

haentschman 10. Mär 2021 08:32

AW: Schleife mit Timer
 
Hallöle...8-)

:dp: Willkommen im Club...

Zitat:

ich muss mehrere Strings zeitversetzt aus einer Stringlist versenden
...entweder habe ich noch zu wenig Kaffee :gruebel: ...aber ich verstehe das Problem nicht bzw. was du erreichen willst. (Ablaufplan)

KodeZwerg 10. Mär 2021 08:36

AW: Schleife mit Timer
 
Du brauchst einen globalen Zähler für Deine StringList.
Im Timer-Event den Zähler jedesmal +1 hochzählen lassen bis er max. StringList.Count entspricht.

Frage beantwortet?

KodeZwerg 10. Mär 2021 08:42

AW: Schleife mit Timer
 
Zitat:

Zitat von haentschman (Beitrag 1484768)
:dp: Willkommen im Club...

Dem schließe ich mich an!

//edit
falls von Dir noch Versionsbedingte Fragen kommen, ist es hilfreich dem Forum im Benutzerkonto die genutzte Delphi Version bescheid zu geben.

lxo 10. Mär 2021 09:03

AW: Schleife mit Timer
 
Wenn du die Liste abarbeiten willst und die Einträge danach nicht mehr brauchst, wäre TStack<T> oder TList<T> auch eine Option.

Delphi-Quellcode:
uses
 System.Generics.Collections

FList: TList<String>;

var lErsterEintrag := FList.Extract( FList.First);
var lLetzterEintrag := FList.Extract( FList.Last);
Zitat:

System.Generics.Collections.TList.Extract
Entfernt einen Listeneintrag und gibt ihn zurück.

Extract entfernt den Eintrag Value aus der Liste und gibt diesen Wert zurück. Wenn sich Value nicht in der Liste befindet, gibt diese Funktion den Standardwert des Typs T zurück.

buko 10. Mär 2021 09:16

AW: Schleife mit Timer
 
Zitat:

Zitat von KodeZwerg (Beitrag 1484770)
Du brauchst einen globalen Zähler für Deine StringList.
Im Timer-Event den Zähler jedesmal +1 hochzählen lassen bis er max. StringList.Count entspricht.

Frage beantwortet?

könnte sein, ich probiere das gleich mal aus!

buko 10. Mär 2021 09:17

AW: Schleife mit Timer
 
vielen Dank für die Unterstützung, ich probiere eure Vorschläge das gleich mal aus

Delphi.Narium 10. Mär 2021 09:18

AW: Schleife mit Timer
 
nur hingedaddelt:
Delphi-Quellcode:
  // irgendwo die Stringliste laden
  StringList.LoadFromFile('dateiname');
  // Timer.Tag auf "Startwert" = 1. Eintrag in der Stringliste setzen.
  Timer.Tag := 0;
  // Timer aktivieren, wenn was in der Stringliste ist.
  Timer.Enabled := StringList.Count > 0;

// Timerroutine:
procedure TForm1.TimerTimer(Sender: TObject);
begin
  // Timer deaktivieren, damit er nicht bei der Verarbeitung eines Listeneintrages startet ...
  Timer.Enabled := false;
  // Den Eintrag der Liste, der der Position des aktuellen Wertes von Timer.Tag entspricht, verarbeiten.
  Mache_was_mit_Stringlisteintrag(StringList[Timer.Tag]);
  // Den Wert von Timer.Tag um 1 erhöhen, für die Verarbeitung des nächsten Eintrages.
  Timer.Tag := Timer.Tag + 1;
  // Den Timer aktivieren, sofern noch nicht das Ende der Liste erreicht wurde.
  Timer.Enabled := Timer.Tag < StringList.Count;
end;

Klaus01 10. Mär 2021 09:22

AW: Schleife mit Timer
 
.. alternativ (wenn möglich) den versendeten Eintrag aus der StringList entfernen
und dann immer den Eintrag aus Index 0 versenden

Grüße
Klaus

KodeZwerg 10. Mär 2021 09:28

AW: Schleife mit Timer
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1484780)
nur hingedaddelt:
Delphi-Quellcode:
  // irgendwo die Stringliste laden
  StringList.LoadFromFile('dateiname');
  // Timer.Tag auf "Startwert" = 1. Eintrag in der Stringliste setzen.
  Timer.Tag := 0;
  // Timer aktivieren, wenn was in der Stringliste ist.
  Timer.Enabled := StringList.Count > 0;

// Timerroutine:
procedure TForm1.TimerTimer(Sender: TObject);
begin
  // Timer deaktivieren, damit er nicht bei der Verarbeitung eines Listeneintrages startet ...
  Timer.Enabled := false;
  // Den Eintrag der Liste, der der Position des aktuellen Wertes von Timer.Tag entspricht, verarbeiten.
  Mache_was_mit_Stringlisteintrag(StringList[Timer.Tag]);
  // Den Wert von Timer.Tag um 1 erhöhen, für die Verarbeitung des nächsten Eintrages.
  Timer.Tag := Timer.Tag + 1;
  // Den Timer aktivieren, sofern noch nicht das Ende der Liste erreicht wurde.
  Timer.Enabled := Timer.Tag < StringList.Count;
end;

.Tag ist klar besser als 'ne globale variable! :thumb:
Auch nett mit auto-shut-off feature :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:45 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf