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

关于DBEDIT焦点的问题

尚未結案
fangwy
中階會員


發表:99
回覆:139
積分:62
註冊:2003-09-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-16 11:53:56 IP:218.5.xxx.xxx 未訂閱
我使用DBEDIT做为输入栏,并在相应TFIELD的OnValidate中检查输入的有效性,如果无效则用raise Exception('error')引发一个异常,效果是如是输入无效无法跳离.但是有一个问题: 虽然输入无效,但想按'取消'取消当前记录的修改或按'退出'退出窗体.可是焦点一离开DBEDIT就引发错误提示,根本无法执行'取消'或'退出'. 有什么好的方法解决,谢谢?
sos_admin
版主


發表:121
回覆:697
積分:768
註冊:2003-07-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-16 13:09:48 IP:61.155.xxx.xxx 未訂閱
您可以在它失去焦点的时候做数据合法性检测! procedure TForm1.DBEdit1Exit(Sender: TObject); begin 。。。。 end;
fangwy
中階會員


發表:99
回覆:139
積分:62
註冊:2003-09-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-16 13:42:01 IP:218.5.xxx.xxx 未訂閱
谢谢SOS_ADMIN, 只是我希望如果数据无效不允许跳到下一栏位,如果用ONEXIT中检查,输入值无效则强制其回到原DBEDIT,前面提到的情况下依然无法解决.
sos_admin
版主


發表:121
回覆:697
積分:768
註冊:2003-07-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-16 17:42:41 IP:61.155.xxx.xxx 未訂閱
你的意思,我不太理解! 您可以在onexit时候来检测数据与控制焦点哦setfoucs
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-16 17:46:16 IP:202.39.xxx.xxx 未訂閱
您在焦點一離開那個 DBEdit 的時候做了什麼事?    --- 歡迎光臨 KTop 研究院
fangwy
中階會員


發表:99
回覆:139
積分:62
註冊:2003-09-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-10-17 11:20:05 IP:218.5.xxx.xxx 未訂閱
procedure TForm1.DBEdit1Exit(Sender: TObject); begin if Trim(DBEdit1.Text)='000' then begin ShowMessage('不能为000!'); DBEdit1.SetFoucs; end; end; procedure TOperF.bbCancelClick(Sender: TObject); begin tbTAX_OPER.Cancel; end; procedure TOperF.bbExitClick(Sender: TObject); begin Close; end; 上例中当DBEDIT1中输入错误值'000',不允许跳离DBEDIT1.去做其他数据的输入,但用户此时可能会想按bbCancel取消当前记录的修改或按bbExit关闭窗体.但因DBEDIT1中有无效的值, 所有焦点一离开就提示'不能为000!',必须先删除无效值.我希望实现的是如果此时按bbCancel,bbExit不触发这个提示信息. 其实目前我有一个方法,就是用TSpeedButton代替TButton来做bbCancel和bbExit.因为TSpeedButton不能聚焦,点击时不会使焦点跳离DBEDIT1,也就不会提示'不能为000!'.但又能取消当前记录的修改或关闭窗体. 但用TSpeedButton也有问题,因不能聚集,所有按TAB键就无法移到TSpeedButton上,不知两位版主有没有更好的方法. 發表人 - fangwy 於 2003/10/17 11:27:15
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-10-17 12:12:59 IP:211.75.xxx.xxx 未訂閱
一個想法, 那個檢查不要寫在那個 DBEdit1 的 OnExit, 寫在其它欄位的 OnEter,  若有錯誤, 再 DBEdit1.SetFocus; 不過這樣比較麻煩就是了.    --- 歡迎光臨 KTop 研究院
fangwy
中階會員


發表:99
回覆:139
積分:62
註冊:2003-09-10

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-10-17 15:00:54 IP:218.5.xxx.xxx 未訂閱
谢谢hagar,这确实也是一种方法,可以考虑在输入项较少的情况使用,如登录窗体使用.
sos_admin
版主


發表:121
回覆:697
積分:768
註冊:2003-07-23

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-10-17 16:13:20 IP:61.155.xxx.xxx 未訂閱
unit Unit1;    interface    uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, StdCtrls, Mask, DBCtrls, DB, DBTables;    type   TForm1 = class(TForm)     DBEdit1: TDBEdit;     Button1: TButton;     cancelButton: TButton; Edit1: TEdit; Table1: TTable; DataSource1: TDataSource; procedure DBEdit1Exit(Sender: TObject); private procedure checkcancel; { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure Tform1.checkcancel; var Pt : TPoint; WinCon : TWinControl; WND : HWND; begin GetCursorPos(Pt); WND :=Handle; repeat WinCon := FindControl(WND); WND := ChildWindowFromPoint(WinCon.Handle,WinCon.ScreenToClient(Pt)); if WND = 0 then exit; until (WND = WinCon.Handle) or (WinCon.ControlCount <= 0); if WinCon is Tbutton then if WinCon.Name='cancelButton' then abort; end; procedure TForm1.DBEdit1Exit(Sender: TObject); begin checkcancel; if dbedit1.Text='1111' then dbedit1.SetFocus; end; ...................
fangwy
中階會員


發表:99
回覆:139
積分:62
註冊:2003-09-10

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-10-20 10:18:42 IP:218.5.xxx.xxx 未訂閱
sos_admin: 使用您的方法效果很好,谢谢.
系統時間:2024-07-01 21:15:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!