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

TDBedit 如何控制前2碼不可改?

缺席
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-12 22:00:52 IP:61.71.xxx.xxx 未訂閱
請問各位! 我想要 TDBedit 的前2碼為記錄保留字不可以改, 例如 DBedit1 對應的資料為 A1???????, 當新增時我會先填入A1字串, 然後 利用 selstart=2 的方式游標調到第3碼, 但因為 A為MASK的保留字元, 所 以如果我移動游標仍可以移到A的位置而改掉, 如果我希望這個欄位的 A1字元是不可以修正的, 在Dbedit完整資料情況下(不拆成兩個欄位)有沒有 辦法可以達成, 謝謝!
hagar
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-13 08:43:54 IP:202.39.xxx.xxx 未訂閱
小弟的想法一開始判斷 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-13 08:55:43 IP:210.61.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-15 13:03:33 IP:61.71.xxx.xxx 未訂閱
感謝兩位提點, 不過 hagar兄的方法是可以解決9成以上的目標, 但要撰寫的位置太多, 例如 如果我有十組edit都要處理的話, 那就不得了, 同時如pedro兄所說的 backspace無法解決, 而pedro兄所提出的做法基本上可行, 不過有一個狀況 就是雖然可以不令 A1 的字串被 backspace除掉, 可是在執行本鍵時在 edit 的欄位被按下backspace, 畫面上仍會顯示是除掉文字的, 等到keypress被引 發時才會還原(放在keydown, keyup也一樣), 我想達到的目標是連cursor根本 就無法可以到達A1這兩個字元, 不知還有沒有更快的方式可以達成?
hagar
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-15 23:19:04 IP:202.39.xxx.xxx 未訂閱
小弟改成如下(不過不知道還有沒有在其它地方可以攔截 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-09-19 11:20:24 IP:61.71.xxx.xxx 未訂閱
引言: 小弟改成如下(不過不知道還有沒有在其它地方可以攔截 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;
感謝hagar兄熱心的協助, 上述理論上應可行, 稍早我稍微以上述程式測了一 下, 但程式一進入就出現嚴重的錯誤 (Access ...), 不過最近案子急交案, 暫時無法顧慮到這段, 容後再報告, 謝謝!
系統時間:2024-06-02 17:31:23
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!