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

關於abort

尚未結案
dispper
一般會員


發表:8
回覆:9
積分:3
註冊:2002-05-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-25 15:37:13 IP:211.20.xxx.xxx 未訂閱
請問各位大大 我在畫面上放入一個speedbutton,二個edit 程式如下 procedure TForm1.Edit1Exit(Sender: TObject); begin if (edit1.text='A') then begin Edit1.SetFocus; abort; end; end; procedure TForm1.SpeedButton1Click(Sender: TObject); begin perform(WM_NEXTDLGCTL,0,0); showmessage('a'); end; 當我在edit1輸入值時直接按下speedbutton時會檢查edit1的內容當為某值時就不能繼續往下做 可是abort好像沒有用處的樣子 看help-----abort是會跳出所有程序的意思,不知道正不正確 麻煩各位大大解惑.................thx
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-25 16:05:56 IP:218.15.xxx.xxx 未訂閱
引言: 請問各位大大 我在畫面上放入一個speedbutton,二個edit 程式如下 procedure TForm1.Edit1Exit(Sender: TObject); begin if (edit1.text='A') then begin Edit1.SetFocus; abort; end; end; procedure TForm1.SpeedButton1Click(Sender: TObject); begin perform(WM_NEXTDLGCTL,0,0); showmessage('a'); end; 當我在edit1輸入值時直接按下speedbutton時會檢查edit1的內容當為某值時就不能繼續往下做 可是abort好像沒有用處的樣子 看help-----abort是會跳出所有程序的意思,不知道正不正確 麻煩各位大大解惑.................thx
dispper你好 这里说下OnExit事件与OnKeyPress事件的区别 OnExit事件:当输入的焦点从一个组件移到另一个组件时,触发该事件; OnKeyPress事件:当用户按下一个单字符键时,触发该事件; 也就是说,如你上面所用,只有当你按下speedbutton時才触发OnExit事件,不切换焦点,则该事件不起作用。所以如果你想在Edit中输入A,做判断是A,则不给用户往下输入,你可以将代码写入OnKeyPress事件中: procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if (edit1.text='A') then begin Edit1.SetFocus; abort; end; END;试试看,有没有理解错你的意思 ——行径窄处,留一步与人行—— ===== 为什么,经过多年以后,得失的过程如此冷漠 为什么,经过多年以后,风干的伤口心痛依旧
dispper
一般會員


發表:8
回覆:9
積分:3
註冊:2002-05-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-25 16:42:05 IP:211.20.xxx.xxx 未訂閱
deity你好 首先先感謝你的回覆..... 不過依你所說移到KeyPress的話也沒有檢查的功用 因為edit1的值'A'已經輸入了 使用者會直接點speedbutton執行function 所以我必須在使用者點speedbutton時去觸發edit1的onexit 也就是用perform(WM_NEXTDLGCTL,0,0); 做檢查的動作若符合條件就 abort, 不再繼續做下去 可是abort好像沒有作用,做完onexit後還是回到 speedbutton的oncilck事件繼續做往下做 這就是頭痛地方
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-25 17:43:19 IP:218.15.xxx.xxx 未訂閱
dispper你好: 你的意思是说先在edit1中输入A,然后进行判断, 如果是A则不让showmessage('a')执行,返回焦点, 你何不直接这样写: procedure TForm1.SpeedButton1Click(Sender: TObject); begin if (edit1.text='A') then begin Edit1.SetFocus; abort; end; showmessage('a'); end; 因为你abort是写在onexit事件中,所以对speedbutton1click是不起作用的,只是中断当前过程. ——行径窄处,留一步与人行—— ===== 为什么,经过多年以后,得失的过程如此冷漠 为什么,经过多年以后,风干的伤口心痛依旧
dengguo
一般會員


發表:41
回覆:49
積分:23
註冊:2004-01-09

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-25 17:45:59 IP:218.16.xxx.xxx 未訂閱
procedure TForm1.SpeedButton1Click(Sender: TObject); begin  if (edit1.text='A') then begin   Edit1.SetFocus;   abort;  end;   perform(WM_NEXTDLGCTL,0,0);   showmessage('a'); end; ------------------------------------------- 好像這樣能達到你的要求吧?    ############################### 初學delphi,請各位多多提點!謝謝! ###############################
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-25 17:56:59 IP:218.160.xxx.xxx 未訂閱
當我在edit1輸入值時直接按下speedbutton時會檢查edit1的內容當為某值時就不能繼續往下做 可是abort好像沒有用處的樣子 看help-----abort是會跳出所有程序的意思,不知道正不正確 Hi dispper 您好: 抱歉有點不解問題, 有沒有想過直接用exit跳出程序就好, 當按下SpeedButton1去判斷, 不對就直接exit跳出程序 我不是高手, 高手是正在銀幕前微笑的人.
------


我不是高手, 高手是正在銀幕前微笑的人.
dispper
一般會員


發表:8
回覆:9
積分:3
註冊:2002-05-30

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-05-25 21:53:22 IP:218.171.xxx.xxx 未訂閱
感謝dengguo,deity,Miles的回應 當然直接在sppenbutton中對edit1的內容做判斷是可以的 可是我的專案中有很多的edit, 有些要做而有些不用做 若要加再speedbutton中可能造成程式很難看, 而且要做異動時也不是很方便 所以我才選擇在edit onexit中, 只要使用者不管停在那個edit, 在speedbutton onclick時 我只要去觸發onclick就好了 另外我試了一下若用bitbtn,button則abort是可以正確達到我要的效果 所以我想是不是speedbutton的關係???? (可是用speedbutton可輕鬆達到其它效果) 不知道各位大大是否有其它方法可解決abort跟speedbutton的關係
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-05-25 22:06:04 IP:218.160.xxx.xxx 未訂閱
Hi dispper 是不是這樣:
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
   if ActiveControl is TEdit then begin
      if Assigned(TEdit(ActiveControl).OnExit) then
         TEdit(ActiveControl).OnExit(ActiveControl);
   end;
   perform(WM_NEXTDLGCTL,0,0);
   showmessage('a');
end;
我不是高手, 高手是正在銀幕前微笑的人.
------


我不是高手, 高手是正在銀幕前微笑的人.
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-05-26 00:07:41 IP:203.67.xxx.xxx 未訂閱
你的問題並不是在abort上..
引言:
請問各位大大
我在畫面上放入一個speedbutton,二個edit
程式如下    procedure TForm1.Edit1Exit(Sender: TObject);  元件焦點離開,觸發!!
begin
  if (edit1.text='A') then begin
    Edit1.SetFocus;
    abort; 這個在此無意義
  end;
  
  //就好比..
  if Edit1.Text='A' then Edit1.SetFocus;
  
end;    使用Button等有焦點元件,會觸發其他元件的OnExit事件
焦點轉移前,會先企判斷OnExit事件,要是沒焦點就不會執行!
procedure TForm1.Button1Click(Sender:TObject);
begin
end;    這元件沒有Handle,不會觸發OnExit事件,所以會直接執行!
所以這兒我們要自己處理!!
procedure TForm1.SpeedButton1Click(Sender: TObject); 
var  Obj:TWinControl;    begin
  Obj:=ActiveControl; 
  perform(WM_NEXTDLGCTL,0,0); //焦點轉移會企執行OnExit;
  if(Obj=ActiveControl)then Exit; //要是焦點沒轉移,OnExit又將焦點轉回來了!!,故不處理!這兒也可以拿abort來用了..
  showmessage('a');
end;     
學而時習之不亦樂乎! 發表人 - jest0024 於 2004/05/26 00:17:51
lijenyun
一般會員


發表:3
回覆:19
積分:9
註冊:2003-06-22

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-05-26 01:24:39 IP:203.67.xxx.xxx 未訂閱
這樣應該也行:
type
  TForm1 = class(TForm)
  private
    FValid: Boolean;    ...    procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  perform(WM_NEXTDLGCTL, 0, 0);
  if not FValid then
    showmessage('a');
end;    procedure TForm1.Edit1Exit(Sender: TObject);
begin
  FValid := edit1.text <> 'A';      if not FValid then
    Edit1.SetFocus;
end;
發表人 - lijenyun 於 2004/05/26 01:31:32
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-05-26 02:11:50 IP:203.204.xxx.xxx 未訂閱
引言: 看help-----abort是會跳出所有程序的意思,不知道正不正確
dispper 你好 Delphi HELP Use Abort to escape from an execution path without reporting an error. Abort raises a special "silent exception" (EAbort), which operates like any other exception, but does not display an error message to the end user. Abort redirects execution to the end of the last exception block. Abort Procedure 其實是會舉發一個eAbort的例外物件(一個不會顯示例外訊息的例外物件),所以執行程序會沿著執行路徑回朔,直到遇try ..Except. End;try ..Finally. End;為止,再從Except或Finally區段的程式執行。 寫在Edit的OnExit事件中的Abort應該是被元件中的Try區段欄截下來,而無法在元件外部欄截到Abort的例外,所以你才會感到沒有作用。 對於你的需求,可以用以下的方法達到:
procedure TForm1.Edit1Exit(Sender: TObject);
begin
  if (edit1.text='A') then begin
    Edit1.SetFocus;
    //abort;  // 不須要
  end;
end;    procedure TForm1.SpeedButton1Click(Sender: TObject);
Var
  SaveControl : TWinControl ;
begin
  SaveControl :=  ActiveControl ; // 記錄原來的Control
  perform(WM_NEXTDLGCTL,0,0);
  If ActiveControl = SaveControl Then  // 檢查Control是否有移動
    ShowMessage('Not OK')
  Else
    ShowMessage('Ok');
end;
====================================================================
特別聲明:貼完後才注意到,原來與jest0024兄的做法竟然
是一致的,所以以上程式碼的部份可以忽略它,只看文字說明部份即可。
====================================================================
============== 題外話 僅供參考 =================================== PS:你的這個SpeedButton好像一般資料維護程式的[存檔]按鈕,通常我的作法是 1.建立一個Function SaveCheck:Boolean;把所有的安全把關通通寫在此Function內,檢查通過則傳回True若檢查不過,除了將Focus移到不過的Control然後設定Result:=False;之後直接Exit;結束檢查的Function。
Function TForm1.SaveCheck:Boolean;
Begin
  Result := False; // 先預設為False
  第一項檢查
  If Edit1.Text='A' Then Begin
    Edit1.SetFocus;
    Result := False;
    Exit;
  End;
  第二項檢查
  If Edit2.Text<> .... Then Begin
    Edit2.SetFocus;
    Result := False;
    Exit;
  End;
  其他檢查
  ........
  Result := True;
End;    3.在存檔按鈕中
TForm1.SpeedButton1Click(Sender: TObject);
Begin
  If SaveCheck Then Begin
    // 檢查通過
//  End Else Begin
    // 檢查不通過 ,或不理它也關係
  End;
End;
發表人 - chance36 於 2004/05/26 02:25:15
dispper
一般會員


發表:8
回覆:9
積分:3
註冊:2002-05-30

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-05-26 09:32:33 IP:211.20.xxx.xxx 未訂閱
非常感謝各位大大熱情的回應 讓小弟能解決問題及疑惑 也讓我有另外一種新的想法 再次跟大大說聲謝謝
系統時間:2024-06-27 1:36:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!