全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2025
推到 Plurk!
推到 Facebook!

請教大大們,小弟的timer動作怪怪的,可以告訴我是啥原因嗎

答題得分者是:wameng
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-18 21:54:45 IP:218.163.xxx.xxx 未訂閱
小弟的程式有用到Timer,但總感覺Timer沒動作,單步執行卻又無異常現象,我把Timer設在迴圈裡當延遲用,但總是沒動作迴圈就跑完了,請教大大們可以看一下是哪一行程式用錯了,謝謝  程式說明:當按下按鈕,迴圈從1 to 5,間隔3秒把轉換值由Label秀到畫面,但當我把按鈕按下時,迴圈就已經跑完了,Timer完全沒延遲作用,是小弟犯了邏輯上還是觀念上的錯誤 < class="code"> procedure TForm1.Timer1Timer(Sender: TObject); Timer1.Enabled := False; //Disable Timer //Timer.interval = 3000==>3 Seconds end; procedure TForm1.BitbtnClick(Sender: TObject); var InByte : array[0..6] of byte; i : Integer ; MeterVal : Smallint; begin InByte[0] := $01 ; InByte[1] := $03 ; InByte[2] := $02 ; InByte[3] := $8A ; InByte[4] := $03 ; InByte[5] := $EA ; InByte[6] := $FA ; for i := 0 to 5 do begin MeterVal := HexToSignInt(InByte,i); //每次把InByte陣列的2個元素轉成Sign Integer,i是轉換的起始位址 label1.Caption := IntToStr(MeterVal); //把轉換後的值用label秀在畫面上 Timer1.Enabled := True; [green]//Trigger Timer end end;
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-18 22:39:05 IP:219.86.xxx.xxx 未訂閱
以程式碼看來 Timer1Timer 當然紙會被執行一次。 當Timer.Enablde 為 True 當然會觸發 ENABLEDCHANGED 但並不會馬上執行 OnTimer 事件。 ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-19 00:21:20 IP:61.64.xxx.xxx 未訂閱
那請教大大要怎麼改寫才會執行六次,謝謝
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-19 08:23:39 IP:210.65.xxx.xxx 未訂閱
Hi wychen57,    大致是這樣,你參考一下
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;    type
  TForm1 = class(TForm)
    Button1: TButton;
    Timer1: TTimer;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    Count : Word;
  end;    var
  Form1: TForm1;    implementation    {$R *.dfm}    procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Enabled := False;
  Timer1.Interval := 3000;
end;    procedure TForm1.Button1Click(Sender: TObject);
begin
  Count := 0;
  Timer1.OnTimer(Timer1);
  Timer1.Enabled := True;
end;    procedure TForm1.Timer1Timer(Sender: TObject);
  var
    InByte : array[0..6] of byte;
    i : Integer ;
    MeterVal : Smallint;
begin
  InByte[0] := $01 ;
  InByte[1] := $03 ;
  InByte[2] := $02 ;
  InByte[3] := $8A ;
  InByte[4] := $03 ;
  InByte[5] := $EA ;
  InByte[6] := $FA ;      case count of
    0..6 :  begin
//              MeterVal := HexToSignInt(InByte,i);  //每次把InByte陣列的2個元素轉成Sign Integer,i是轉換的起始位址
              MeterVal := InByte[Count];
              label1.Caption := IntToStr(MeterVal); //把轉換後的值用label秀在畫面上
              Inc(Count);
            end;
  else
    Timer1.Enabled := False;
  end;
end;    end.
---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-19 10:07:14 IP:61.222.xxx.xxx 未訂閱
我覺得倒不如這樣
Procedure sysDelay(aMs: Longint);
var
  TickCount : LongInt;
begin
  TickCount:=GetTickCount;
  while GetTickCount - TickCount < aMs do Application.ProcessMessages
end;    procedure TForm1.BitbtnClick(Sender: TObject);
  var
    InByte : array[0..6] of byte;
    i : Integer ;
    MeterVal : Smallint;
begin
  InByte[0] := $01 ;
  InByte[1] := $03 ;
  InByte[2] := $02 ;
  InByte[3] := $8A ;
  InByte[4] := $03 ;
  InByte[5] := $EA ;
  InByte[6] := $FA ;      for i := 0 to 5 do
  begin
  MeterVal := HexToSignInt(InByte,i);  //每次把InByte陣列的2個元素轉成Sign Integer,i是轉換的起始位址
  label1.Caption := IntToStr(MeterVal); //把轉換後的值用label秀在畫面上
  sysDelay(1000); {停留 1 秒}
  end
end;
發表人 - wameng 於 2005/05/19 10:08:00
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-19 10:39:01 IP:210.65.xxx.xxx 未訂閱
不愧是 wameng 版大,    好主意!佩服!佩服!    
------
Fishman
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-05-19 11:34:09 IP:61.222.xxx.xxx 未訂閱
引言: 不愧是 wameng 版大, 好主意!佩服!佩服! < face="Verdana, Arial, Helvetica"> 不敢 越僭了! 漁人兄 望撥空指教! http://delphi.ktop.com.tw/topic.php?TOPIC_ID=71260 咳!想憑 漁人兄 才高八斗 學富五車 必定有所指教才是! < >< > ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-05-20 00:28:26 IP:211.76.xxx.xxx 未訂閱
哎喲,兩位大大都非常厲害啦,小弟對你們的景仰有如江水,滔滔延綿不絕呀
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-07-07 11:44:06 IP:61.61.xxx.xxx 未訂閱
引言: 我覺得倒不如這樣
Procedure sysDelay(aMs: Longint);
var
  TickCount : LongInt;
begin
  TickCount:=GetTickCount;
大大,這行編譯時會出現undeclared identifier 'gettickcount'
  while GetTickCount - TickCount < aMs do Application.ProcessMessages
這行編譯時會出現undeclared identifier 'Application'
                      missing operator or semicolon
end;
以上錯誤能告訴小弟是啥造成的錯誤,有啥沒uses才會這樣
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-07-07 15:42:23 IP:61.222.xxx.xxx 未訂閱
gettickcount -> Windows Application -> Forms ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~
系統時間:2024-04-20 0:16:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!