TDBedit 如何控制前2碼不可改? |
缺席
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
小弟的想法一開始判斷 SelStart 小於 2 時來攔 Key
發現還有 Cut/Paste 等要攔
後來想以控制 SelStart 的值大於 2 的方式
不過利用 Tab 鍵取得 Focus 時就沒法改變 SelStart 值
便在 OnKeyDown 時來改變:
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Edit1.SelStart < 2 then Edit1.SelStart := 2; end; procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_HOME then // 按 Home 鍵 Edit1.SelStart := 2; if Key = VK_LEFT then // 按往左鍵 begin if Edit1.SelStart < 2 then Edit1.SelStart := 2; end; end; procedure TForm1.Edit1Click(Sender: TObject); begin if Edit1.SelStart < 2 then Edit1.SelStart := 2; end; procedure TForm1.Edit1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Edit1.SelStart < 2 then Edit1.SelStart := 2; end; |
pedro
尊榮會員 發表:152 回覆:1187 積分:892 註冊:2002-06-12 發送簡訊給我 |
hi pd
要post時, 看hagar大大已經先po了
大致上思考的方向時相同的,在這裡補充一下按Backspace時,在keypress補回去
procedure TForm1.DBEdit1KeyPress(Sender: TObject; var Key: Char); var val:string; begin if DBEdit1.SelStart<1 then begin SetLength(Val,10); val[1]:=Char('A'); DBEdit1.Text:=val; DBEDit1.SelStart:=1; abort; end; end; |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
感謝兩位提點, 不過 hagar兄的方法是可以解決9成以上的目標, 但要撰寫的位置太多, 例如
如果我有十組edit都要處理的話, 那就不得了, 同時如pedro兄所說的
backspace無法解決, 而pedro兄所提出的做法基本上可行, 不過有一個狀況
就是雖然可以不令 A1 的字串被 backspace除掉, 可是在執行本鍵時在 edit
的欄位被按下backspace, 畫面上仍會顯示是除掉文字的, 等到keypress被引
發時才會還原(放在keydown, keyup也一樣), 我想達到的目標是連cursor根本
就無法可以到達A1這兩個字元, 不知還有沒有更快的方式可以達成?
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
小弟改成如下(不過不知道還有沒有在其它地方可以攔截 BackSpace 鍵):
type TEdit = class(StdCtrls.TEdit) procedure WndProc(var Message: TMessage); override; end; type TForm1 = class(TForm) Edit1: TEdit; procedure Edit1KeyPress(Sender: TObject; var Key: Char); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} { TEdit } procedure TEdit.WndProc(var Message: TMessage); begin inherited WndProc(Message); with Message Do begin case Msg of WM_KEYFIRST..WM_KEYLAST,WM_PAINT, WM_SETFOCUS, WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDBLCLK: begin if SelStart < 2 then SelStart := 2; end; end; end; end; { TForm1 } procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if (TEdit(Sender).SelStart = 2) and (Key = #8) then Key := #0; end; |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
引言: 小弟改成如下(不過不知道還有沒有在其它地方可以攔截 BackSpace 鍵):感謝hagar兄熱心的協助, 上述理論上應可行, 稍早我稍微以上述程式測了一 下, 但程式一進入就出現嚴重的錯誤 (Access ...), 不過最近案子急交案, 暫時無法顧慮到這段, 容後再報告, 謝謝!type TEdit = class(StdCtrls.TEdit) procedure WndProc(var Message: TMessage); override; end; type TForm1 = class(TForm) Edit1: TEdit; procedure Edit1KeyPress(Sender: TObject; var Key: Char); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} { TEdit } procedure TEdit.WndProc(var Message: TMessage); begin inherited WndProc(Message); with Message Do begin case Msg of WM_KEYFIRST..WM_KEYLAST,WM_PAINT, WM_SETFOCUS, WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDBLCLK: begin if SelStart < 2 then SelStart := 2; end; end; end; end; { TForm1 } procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if (TEdit(Sender).SelStart = 2) and (Key = #8) then Key := #0; end; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |