我想做一个秒表,精度是1/10秒。如何实现在每1/10秒的跳动。
菜鸟--我,使用sleep(100),但是没成功。

解决方案 »

  1.   

    给你一个例子:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ExtCtrls, StdCtrls, mmsystem;type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Edit2: TEdit;
        Edit3: TEdit;
        Button1: TButton;
        Button2: TButton;
        Timer1: TTimer;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      acttime1,acttime2:cardinal;
      smmcount,stimercount,spcount:single;
      htimeid:integer;
      iten:integer;
      protimecallback:tfntimecallback;  procedure timeproc(utimerid, umessage: uint; dwuser, dw1, dw2: dword) stdcall;
      procedure proendcount;
    implementation{$R *.DFM}//timesetevent的回调函数
    procedure proendcount;begin
      acttime2:=gettickcount-acttime1;
      form1.button2.enabled :=false;
      form1.button1.enabled :=true;
      form1.timer1.enabled :=false;
      smmcount:=60;
      stimercount:=60;
      spcount:=-1;  timekillevent(htimeid);
    end;procedure timeproc(utimerid, umessage: uint; dwuser, dw1, dw2: dword) stdcall;
    begin
      form1.edit2.text:=floattostr(smmcount);
      smmcount:=smmcount-0.01;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      button1.caption :='开始倒计时';
      button2.caption :='结束倒计时';
      button2.enabled :=false;
      button1.enabled :=true;
      timer1.enabled :=false;
      smmcount:=60;
      stimercount:=60;
      spcount:=60;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      lgtick1,lgtick2,lgper:tlargeinteger;
      ftemp:single;
    begin
      button2.enabled :=true;
      button1.enabled :=false;
      timer1.enabled :=true;
      timer1.interval :=10;
      protimecallback:=timeproc;
      htimeid:=timesetevent(10,0,protimecallback,1,1);
      acttime1:=gettickcount;  //获得系统的高性能频率计数器在一毫秒内的震动次数
      queryperformancefrequency(lgper);
      ftemp:=lgper/1000;
      iten:=trunc(ftemp*10);
      queryperformancecounter(lgtick1);
      lgtick2:=lgtick1;
      spcount:=60;  while spcount>0 do
      begin
        queryperformancecounter(lgtick2);    //如果时钟震动次数超过10毫秒的次数则刷新edit3的显示
        if lgtick2 - lgtick1 > iten then
        begin
          lgtick1 := lgtick2;
          spcount := spcount - 0.01;
          edit3.text := floattostr(spcount);
          application.processmessages;
        end;
      end;end;procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      edit1.text := floattostr(stimercount);
      stimercount:=stimercount-0.01;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      proendcount;  //显示从开始记数到记数实际经过的时间
      showmessage('实际经过时间'+inttostr(acttime2)+'毫秒');
    end;end.
      

  2.   

    Delphi自带有一个DEMOSX:\Program Files\Borland\Delphi6\Demos\Clx\StopWatch
      

  3.   

    unit main;interfaceuses
      SysUtils, Types, Classes, QGraphics, QControls, QForms, QDialogs,
      QStdCtrls, QTypes, QExtCtrls;type
      TForm1 = class(TForm)
        LCDNumber1: TLCDNumber;
        Timer1: TTimer;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        procedure Timer1Timer(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure LCDNumber1MouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
      private
        { Private declarations }
        FRunning: Boolean;
        procedure SetRunning(Value: Boolean);
      public
        { Public declarations }
        StartTime: Extended;
        ElapsedTime: Extended;
        Reset: Boolean;
        property Running: Boolean read FRunning write SetRunning;
      end;var
      Form1: TForm1;implementation{$R *.xfm}procedure TForm1.SetRunning(Value: Boolean);
    begin
      if FRunning <> Value then
      begin
        FRunning := Value;
        StartTime := ElapsedTime;
        if Value then Reset := False;
      end;
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      if Reset then ElapsedTime := Now else ElapsedTime := Now - StartTime;
      if Running then
        LCDNumber1.Value := FormatDateTime('nn:ss.zzz', ElapsedTime);
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      Running := True;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      Running := not Running;
    end;procedure TForm1.Button3Click(Sender: TObject);
    begin
      if not Running then
      begin
        LCDNumber1.Value := '00:00.000';
        Reset := True;
      end;
    end;procedure TForm1.LCDNumber1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      NewBorderStyle: Integer;
      NewSegmentStyle: Integer;
    begin
      case Button of
        mbLeft:
          begin
            NewBorderStyle := Ord(LCDNumber1.BorderStyle) + 1;
            if NewBorderStyle > Ord(High(TBorderStyle)) then
              NewBorderStyle := Ord(Low(TBorderStyle));
            LCDNumber1.BorderStyle := TBorderStyle(NewBorderStyle);
          end;
        mbRight:
          begin
            NewSegmentStyle := Ord(LCDNumber1.SegmentStyle) + 1;
            if NewSegmentStyle > Ord(High(TLCDSegmentStyle)) then
              NewSegmentStyle := Ord(Low(TLCDSegmentStyle));
            LCDNumber1.SegmentStyle := TLCDSegmentStyle(NewSegmentStyle);
          end;
      end;
    end;end.
      

  4.   

    给你一例子,毫秒级的
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ExtCtrls, StdCtrls, mmsystem;type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Edit2: TEdit;
        Edit3: TEdit;
        Button1: TButton;
        Button2: TButton;
        Timer1: TTimer;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      acttime1,acttime2:cardinal;
      smmcount,stimercount,spcount:single;
      htimeid:integer;
      iten:integer;
      protimecallback:tfntimecallback;
      procedure timeproc(utimerid, umessage: uint; dwuser, dw1, dw2: dword) stdcall;
      procedure proendcount;implementation
    {$R *.DFM}procedure proendcount;//timesetevent的回调函数
    begin
      acttime2:=gettickcount-acttime1;
      form1.button2.enabled :=false;
      form1.button1.enabled :=true;
      form1.timer1.enabled :=false;
      smmcount:=60;
      stimercount:=60;
      spcount:=-1;
      timekillevent(htimeid);
    end;procedure timeproc(utimerid, umessage: uint; dwuser, dw1, dw2: dword) stdcall;
    begin
      form1.edit2.text:=floattostr(smmcount);
      smmcount:=smmcount-0.01;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      button1.caption :='开始倒计时';
      button2.caption :='结束倒计时';
      button2.enabled :=false;
      button1.enabled :=true;
      timer1.enabled :=false;
      smmcount:=60;
      stimercount:=60;
      spcount:=60;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      lgtick1,lgtick2,lgper:tlargeinteger;
      ftemp:single;
    begin
      button2.enabled :=true;
      button1.enabled :=false;
      timer1.enabled :=true;
      timer1.interval :=10;
      protimecallback:=timeproc;
      htimeid:=timesetevent(10,0,protimecallback,1,1);
      acttime1:=gettickcount; //获得系统的高性能频率计数器在一毫秒内的震动次数
      queryperformancefrequency(lgper);
      ftemp:=lgper/1000;
      iten:=trunc(ftemp*10);
      queryperformancecounter(lgtick1);
      lgtick2:=lgtick1;
      spcount:=60;
      while spcount>0 do
      begin
        queryperformancecounter(lgtick2);//如果时钟震动次数超过10毫秒的次数则刷新edit3的显示
        if lgtick2 - lgtick1 > iten then
        begin
          lgtick1 := lgtick2;
          spcount := spcount - 0.01;
          edit3.text := floattostr(spcount);
          application.processmessages;
        end;
      end;
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      edit1.text := floattostr(stimercount);
      stimercount:=stimercount-0.01;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      proendcount;  //显示从开始记数到记数实际经过的时间
      showmessage('实际经过时间'+inttostr(acttime2)+'毫秒');
    end;end.