如何讓for 迴圈暫停呢? |
尚未結案
|
jchuang
一般會員 發表:41 回覆:36 積分:15 註冊:2003-08-08 發送簡訊給我 |
deal all:
想問一下如何讓for暫停呢?因為我要在jdx=1時啟動跑一個function等到function跑完時回傳 timeStop= false 再跑jdx=2以些類推,可是我發現for會一直跑不會停下來,要怎麼做呢? for jdx:= 1 to 300 do
begin
AOVoltVal:=AOVoltVal jdx; frmStar.btnRun.Click;//讓frmStar的function run
//--------想等function跑完時傳回timeStop= false
//------run if 裡面的程式
if timeStop= false then
begin
Procemax(InputVoltage,MaxInVoltage);
Procemax(OutputVoltage,MaxOutVoltage);
timeStop:= true;
end;
//------run 完後再做jdx=2...3...4.....到300
end; 謝謝各位大大喔!! 新手上路
------
新手上路 |
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
這種寫法只是在FOR迴圈裡觸發一個事件,一觸發完後不等待,FOR當然就繼續下去,建議將frmStar寫成子程式,以CreateProcess執行後用WaitForSingleObject等待子程式完成,至於主程式接收子程式TimeStop的值,可以設計一共用檔案來存取。
CreateProcess的用法站裡面很多,你可以搜尋的到! -----------------------------------------------
Creation is the fundation of promotion.
|
ko
資深會員 發表:28 回覆:785 積分:444 註冊:2002-08-14 發送簡訊給我 |
jchuang 你好:
雖然我的答非所問,但是希望對你有幫助
根據你的說法可以用一個timer來做
限制的條件當然是
procedure TForm1.Timer1Timer(Sender: TObject);
begin
timer1.enable=false;
if jdx=1 then
begin
...
end;
if jdx=2 then
begin
...
end;
...
..
.
jdx:=jdx 1;
timer1.enable=True;
end;
------
====================== 昏睡~ 不昏睡~ 不由昏睡~ |
jchuang
一般會員 發表:41 回覆:36 積分:15 註冊:2003-08-08 發送簡訊給我 |
deal all:
我突然想到一個寫法就是用 if 來寫
//-----------在frmMain下------- if timeStop= false then
begin
Procemax(InputVoltage,MaxInVoltage);
Procemax(OutputVoltage,MaxOutVoltage); timeStop:= true; frmStar.btnRun.Click; AOVoltVal:=AOVoltVal jdx; jdx:=jdx 1; end;
這樣應該就可以了吧!!可是這是在button下的code,如果我要跑300次,不就要按300下了嗎??不知道各位有沒有比較好的寫法. 新手上路
------
新手上路 |
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
if timeStop= false then begin Procemax(InputVoltage,MaxInVoltage); Procemax(OutputVoltage,MaxOutVoltage); timeStop:= true; //frmStar.btnRun.Click; //如果你這樣寫可以達到目的話,那這行改成下方這樣,讓系統幫你呼叫! SendMessage(frmStar.btnRun.Handle, BM_CLICK, nil, nil); AOVoltVal:=AOVoltVal jdx; jdx:=jdx 1; end;----------------------------------------------- Creation is the fundation of promotion. |
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
for jdx:= 1 to 300 do begin AOVoltVal:=AOVoltVal jdx; // frmStar.btnRun.Click;//讓frmStar的function run frmStar.btnRun.OnClick(nil); // 改成直接呼叫OnCLick事件(其實就是個procedure) //這樣就會等該程序執行完後才會繼續下一行程式 //--------想等function跑完時傳回timeStop= false //------run if 裡面的程式 if timeStop= false then begin Procemax(InputVoltage,MaxInVoltage); Procemax(OutputVoltage,MaxOutVoltage); timeStop:= true; end; //------run 完後再做jdx=2...3...4.....到300 end;_______________________________________ 深藍的魚,祝您好運..........連連 |
chris_shieh
高階會員 發表:46 回覆:308 積分:240 註冊:2004-04-26 發送簡訊給我 |
這種情形可利用利用 timer 開關 與 全域變數 iCurrentIndex來控制流程
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TfmStar = class(TForm) btnRun: TButton; Timer1: TTimer; btnStop: TButton; procedure Timer1Timer(Sender: TObject); procedure btnRunClick(Sender: TObject); procedure btnStopClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var fmStar: TfmStar; implementation {$R *.DFM} const MaxIndex = 300; var AOVoltVal, iCurrentIdx:integr; bStopRun:Boolean; procedure TfmStar.RunVolCalc; begin //Do anything with AOVoltVal //如果裡面需要有迴圈 利用bStopRun來回應 btnStop.Click中斷 While (not bStopRun) and (...) do begin //do something end; //on finished, we trigger the following procedures if not bStopRun then //user 未按下停止 begin Procemax(InputVoltage,MaxInVoltage); Procemax(OutputVoltage,MaxOutVoltage); Timer1.Enabled:=True; //go to the next iCurrentIdx end; end; procedure TfmStar.Timer1Timer(Sender: TObject); begin Timer1.Enabled:=False; inc(iCurrentIdx); if i<=MaxIndex then begin AOVoltVal:=AOVoltVal iCurrentIdx; RunVolCalc; end; end; procedure TfmStar.btnRunClick(Sender: TObject); //開始 begin iCurrentIdx:=0; Timer1.Enabled:=True; bStopRun:=False; end; procedure TfmStar.btnStopClick(Sender: TObject); //停止 begin iCurrentIdx:= MaxIndex 1; Timer1.Enabled:=False; bStopRun:=True; end; procedure TfmStar.btnSuspendClick(Sender: TObject); //暫停 begin Timer1.Enabled:=False; bStopRun:=True; end; procedure TfmStar.btnResumeClick(Sender: TObject); //繼續 begin bStopRun:=False; Timer1.Enabled:=True; end; end.@瞭解越多.懂得越少@ 發表人 - Chris_Shieh 於 2005/05/14 22:22:39 |
speedup
資深會員 發表:19 回覆:259 積分:280 註冊:2003-07-04 發送簡訊給我 |
引言: deal all: 想問一下如何讓for暫停呢?因為我要在jdx=1時啟動跑一個function等到function跑完時回傳 timeStop= false 再跑jdx=2以些類推,可是我發現for會一直跑不會停下來,要怎麼做呢?奇怪問題很簡單阿 直接判斷 jdx= 1 就好ㄚ for jdx:= 1 to 300 do begin AOVoltVal:=AOVoltVal jdx; if jdx= 1 then begin frmStar.btnRun.Click;//讓frmStar的function run //--------想等function跑完時傳回timeStop= false //------run if 裡面的程式 if timeStop= false then begin Procemax(InputVoltage,MaxInVoltage); Procemax(OutputVoltage,MaxOutVoltage); timeStop:= true; end; end; //------run 完後再做jdx=2...3...4.....到300 end;混心雜欲 棄修身~唉
------
唉~ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |