線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2017
推到 Plurk!
推到 Facebook!

如何讓for 迴圈暫停呢?

尚未結案
jchuang
一般會員


發表:41
回覆:36
積分:15
註冊:2003-08-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-13 14:05:38 IP:140.123.xxx.xxx 未訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-13 14:32:52 IP:211.22.xxx.xxx 未訂閱
這種寫法只是在FOR迴圈裡觸發一個事件,一觸發完後不等待,FOR當然就繼續下去,建議將frmStar寫成子程式,以CreateProcess執行後用WaitForSingleObject等待子程式完成,至於主程式接收子程式TimeStop的值,可以設計一共用檔案來存取。 CreateProcess的用法站裡面很多,你可以搜尋的到! ----------------------------------------------- Creation is the fundation of promotion.
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-13 15:07:31 IP:220.132.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-13 15:31:03 IP:140.123.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-13 18:31:31 IP:211.22.xxx.xxx 未訂閱
 
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-14 10:35:08 IP:203.204.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-05-14 10:56:14 IP:61.30.xxx.xxx 未訂閱
這種情形可利用利用 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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-05-16 16:17:48 IP:220.135.xxx.xxx 未訂閱
引言: 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; 
混心雜欲 棄修身~唉
------
唉~
系統時間:2024-05-17 10:50:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!