Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Fehlermeldung "Nicht genügend Timer verfügbar" (https://www.delphipraxis.net/213343-fehlermeldung-nicht-genuegend-timer-verfuegbar.html)

haentschman 14. Jul 2023 05:25

AW: Fehlermeldung "Nicht genügend Timer verfügbar"
 
Moin...8-)

Zitat:

Seit dem ich bei Timerroutinen zuerst den Timer ausschalte und am Ende wieder einschalte, hab' ich das Problem nicht mehr gehabt.
...hatte ich auch noch nie. Wegen schon immer:
Delphi-Quellcode:
FLoadTimer.OnTimer := DoOnLoadTimer;
...
procedure TfoBaseRibbon.DoOnLoadTimer(Sender: TObject);
begin
  LoadTimer;
end;
...
procedure TfoReceipt.DoOnReceiptAfterScroll(Sender: TObject; ReceiptID: Integer; ReceiptDate: TDateTime; ReceiptNumber: string); // kommt von Dataset.AfterScroll
begin
  if (not FInCreation) and (not FIsShowing) then
  begin
    FLoadTimer.Enabled := False;
    FLoadTimer.Enabled := True;
  end;
end;
...
procedure TfoAddress.LoadTimer;
begin
  inherited;
  FLoadTimer.Enabled := False;
Zitat:

Am Ende brauchst du ja nur ein Event für deine Aktion, aber sicher nicht für jedes ScollEvent, sondern nur einmal nach dem letzten ScrollEvent.
Genau. :wink:
Zitat:

ist villeicht ein ganz anderer Ansatz sinnvoller.
...Idee? :wink:

:wink:

jaenicke 14. Jul 2023 06:07

AW: Fehlermeldung "Nicht genügend Timer verfügbar"
 
Zitat:

Zitat von haentschman (Beitrag 1524570)
Zitat:

ist villeicht ein ganz anderer Ansatz sinnvoller.
...Idee? :wink:

Ich verwende dafür wie auch schon genannt wurde Threads. Dafür kannst du dir einmal eine passende Klasse bauen, die auch wirklich sehr einfach ist, und dann immer nutzen.

Das mache ich dann so:
Ich verwende ein TEvent zur Signalisierung, dass ein Scrollevent aufgetreten ist. Daraufhin setzt der Thread das Event zurück und wartet erneut auf das Event mit der vorgegebenen Zeit als Timeout (Event.WaitFor). Tritt nun in der Zwischenzeit das Event erneut auf (Ergebnis wrSignaled), wartet der Thread erneut. Ist das Ergebnis der Warteoperation der Timeout (Ergebnis wrTimeOut), wird ein OnExecute-Ereignis gefeuert, so dass die Verarbeitung starten kann.

So stellst du sicher, dass nach dem letzten Scrollereignis genau die gewünschte Zeit vergeht.

Uwe Raabe 14. Jul 2023 08:02

AW: Fehlermeldung "Nicht genügend Timer verfügbar"
 
Nur so 'ne
Zitat:

Zitat von haentschman (Beitrag 1524570)
...Idee? :wink:

Lass den Timer mit einer höheren Frequenz (z.B. 100ms) durchlaufen. Im AfterScroll merkst du dir den aktuellen TimeStamp mit
Delphi-Quellcode:
TStopWatch.StartNew
. Im Timer-Event prüfst du dann mit
Delphi-Quellcode:
TStopWatch.ElapsedMilliseconds
, ob eine ausreichend lange Zeit nach dem letzten Scroll vergangen ist und falls ja reagierst du entsprechend.

Vorteil: Der Timer wird nur einmal erzeugt und freigegeben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:43 Uhr.
Seite 2 von 2     12   

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