AGB  ·  Datenschutz  ·  Impressum  







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

Eigene Timer Komponente

Ein Thema von Surrounder · begonnen am 21. Mär 2006
Antwort Antwort
Benutzerbild von Surrounder
Surrounder

Registriert seit: 26. Sep 2003
Ort: Stuttgart
177 Beiträge
 
Delphi 2006 Professional
 
#1

Eigene Timer Komponente

  Alt 21. Mär 2006, 14:25
Hallo Forum,

da ich in vielen Projekten einen eigenen Timer verwende dachte ich, ich könnte aus der Unit schnell mal eine eigene Komponente machen. Ich weiss es gibt schon einen Timer, aber ich hab eine Kommunikation mit einer Hardware die ich selber Triggern muss und ich sollte das ca. alle 10ms tun, und der Standard Timer schafft das nicht.

Leider komm ich irgendwie nicht weiter, hab schon so ziemlich alle Tutorials gelesen die ich ergoogelt habe nur hab ich immer noch Probleme mit einem selber erzeugten Event.

Ich poste mal den Code:

Delphi-Quellcode:
unti MTimer101

uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, ExtCtrls, mmsystem;

const
   Time_Elapsed_Msg = WM_User + 12;

type
   TOnMTimer = procedure of object;

   TMTimer      = class( TCustomControl )
   private
      FTime      : Integer;
      FEnabled : Boolean;
      Zeit      : Int64;
      Timerid   : Integer;
      FOnTimer : TOnMTimer;
   protected
      //
   public
      constructor Create( AOwner : TComponent ); override;
      destructor   Destroy; override;
      procedure   Enable( State : Boolean );
      procedure   WndProc(var Msg: TMessage); override;
      procedure   OnMyMessage( var Msg : TMessage ) ; message Time_Elapsed_Msg;
   published
      property      Time       : Integer         read FTime       write FTime;
      property      Enabled   : Boolean         read FEnabled   write FEnabled;
      property      OnTimer   : TOnMTimer       read FOnTimer   write FOnTimer;
   end;

procedure Register;

implementation

procedure Register;
begin
   RegisterComponents('Standard', [TMTimer]);
end;

{ TmtsppTimer }

procedure TimeCallBack(TimerID, Msg: Uint; dwUser, dw1, dw2: DWORD); stdcall; pascal;
begin
//   Sendmessage( HWnd( dwUser ), Time_Elapsed_Msg, 0, 0 );//eine Message wird verschickt
   Sendmessage( HWnd( HWND_BROADCAST ), Time_Elapsed_Msg, 0, 0 );//eine Message wird verschickt
end;

constructor TMTimer.Create( AOwner : TComponent );
begin
   inherited Create( AOwner );
end;

destructor TMTimer.Destroy;
begin
   if FEnabled then
      timeKillEvent( Timerid ); //Timer freigeben
   inherited Destroy;
end;

procedure TMTimer.Enable( State : Boolean );
begin
   FEnabled := State;
   if FEnabled then begin
         Timerid := TimeSetEvent( 1, 0, @TimeCallBack, 0, TIME_PERIODIC );
         Zeit := Timegettime ; //Die Startzeit wird ermittelt
   end
   else begin
      timeKillEvent( Timerid ); //Timer freigeben
   end;
end;

procedure TMTimer.OnMyMessage(var Msg: TMessage);
begin
   if Msg.Msg = Time_Elapsed_Msg then begin
      OnTimer; //Timercode ausführen
   end;
end;

procedure TMTimer.WndProc(var Msg: TMessage);
begin
   if Msg.Msg = Time_Elapsed_Msg then begin
      OnTimer; //Timercode ausführen
   end;
   inherited;
end;
Und hier mein Testprogramm das den Timer einbindet:

Delphi-Quellcode:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, MTimer101, Menus, cxLookAndFeelPainters, StdCtrls, cxButtons;

type
  TForm1 = class(TForm)
    cxButton1: TcxButton;
    procedure cxButton1Click(Sender: TObject);
    procedure OnTimer();
  private
    { Private-Deklarationen }
  public
      Test : TMTimer;
      Count : Integer;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.cxButton1Click(Sender: TObject);
begin
   Count := 0;
   Test := TMTimer.Create( nil );
   Test.OnTimer := OnTimer;
   Test.Enable( True );
end;

procedure TForm1.OnTimer;
begin
   INC( Count );
end;
Problem ist dass wie gesagt das Event das ich dachte so einfach mal selber zu erzeugen ( OnTimer ) entweder nicht ausgeführt wird, oder aber eine Exception kommt.

Danke für jeden Tip und Hinweis.
In C geschrieben und schön war zuletzt Franz Schuberts 9. Symphonie
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:29 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz