AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Eigene Timer Komponente aus der MMSystem

Ein Thema von Zacherl · begonnen am 4. Nov 2006 · letzter Beitrag vom 1. Apr 2009
 
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
446 Beiträge
 
Delphi 10.3 Rio
 
#5

Re: Eigene Timer Komponente aus der MMSystem

  Alt 1. Apr 2009, 07:37
Eine überarbeitete Variante ohne Probleme mit Sleep:

Delphi-Quellcode:
unit compFastTimer;

interface

uses
  Windows, SysUtils, MMSystem, Classes;

type
  TFastTimer = class(TComponent)
  private
    fTimerID: Longword;
    fInterval: Integer;

    pSelfData : PMMTimerData;
    FOnTimer: TNotifyEvent;
    fEnabled: Boolean;
    procedure SetInterval(Value: integer);
    function GetInterval: integer;
    procedure SetEnabled(const Value: Boolean);
  public
    constructor Create(Owner: TComponent); Override;
    destructor Destroy; override;

  published
    property Enabled: Boolean read fEnabled write SetEnabled;
    property Interval: integer read GetInterval write SetInterval;
    property OnTimer: TNotifyEvent read FOnTimer write FOnTimer;
  end;


implementation

Const
  TIME_KILL_SYNCHRONOUS = $0100;


procedure TimerCallback(uTimerID, uMessage: UINT; dwUser, dw1, dw2: DWORD) stdcall; pascal;
var
  ATimer: TFastTimer;
begin
  if dwUser <> 0 then
  begin
    ATimer := TFastTimer(dwUser);

    if Assigned(ATimer.fOnTimer) then
      ATimer.fOnTimer(ATimer);
  end;
end;



{ TFastTimer }

constructor TFastTimer.Create(Owner: TComponent);
begin
  inherited;
  fTimerID := 0;
  fInterval := 1000;
end;

destructor TFastTimer.Destroy;
begin
  Enabled := FALSE;
  inherited;
end;

function TFastTimer.GetInterval: integer;
begin
  Result := fInterval;
end;

procedure TFastTimer.SetInterval(Value: integer);
begin
  fInterval := Value;
end;



procedure TFastTimer.SetEnabled(const Value: Boolean);
begin
  if fEnabled <> Value then
  begin
    fEnabled := Value;
    if fEnabled then
    begin
      // Timer starten ...
      fTimerID := timeSetEvent(fInterval, 0, @TimerCallback, Integer(Self), TIME_PERIODIC Or TIME_KILL_SYNCHRONOUS);
    end
    else
    begin
     timeKillEvent(fTimerID);
     fTimerID := 0;
    end;
  end;
end;


end.
Das ganze könnte dann auch in die Tool-Palette installiert werden, und natürlich auch noch um die eine oder andere Eigenschaft (z.B.: Resolution) erweitert werden.

ACHTUNG!!! Updates der grafischen Oberfläche in OnTimer sind natürlich verboten!! (siehe MSDN-Library durchsuchentimeSetEvent ->Remarks). Mit MSDN-Library durchsuchenPostMessage(...) kann man aber aus OnTimer wieder in den Kontext des Hauptthreads kommen und dann von dort die Oberfläche aktuallisieren.
Whookie

Software isn't released ... it is allowed to escape!
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:44 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