2016-11-23 43 views
3

我希望有一個TEdit,它可以對點擊做出反應,就像Chrome和Firefox中的Url欄一樣。首先點擊他們選擇的所有文字和下面點擊刪除選擇如下所示:TEdit選擇文本點擊就像Chrome和Firefox中的URL欄一樣

enter image description here

我的方法:

// This method is bound to the OnClick event 
procedure TForm.edt_SearchClick(Sender: TObject); 
begin 
    if edt_Search.SelLength > 0 then 
    edt_Search.SelLength := 0 
    else 
    edt_Search.SelectAll; 
end; 

像預期的那樣edt_Search.SelLength此代碼不能正常工作始終0.在OnClick事件即將被觸發之前,選擇將始終被清除。我已經嘗試將此代碼放入OnMouseUpOnMouseDown事件中,但問題保持不變。

我該如何解決?有沒有辦法做到這一點,而不需要添加額外的boolean變量來保存當前狀態?

+0

AutoSelect:= False? –

+0

@SertacAkyuz這不起作用 – Wosi

回答

4

要選擇一個TEdit控制的所有文字,當控件獲得焦點只是處理OnEnter事件:

procedure TForm1.Edit1Enter(Sender: TObject); 
begin 
    PostMessage(Edit1.Handle, EM_SETSEL, 0, -1); 
end; 

不能使用Edit1.SelectAll因爲默認的行爲(其中OnEnter後發生)在編輯清除所有選擇控制。發佈消息可確保在剩餘的默認行爲完成後處理該消息。

procedure TForm.Edit1Exit(Sender: TObject); 
begin 
    PostMessage(Edit1.Handle, EM_SETSEL, 0, 0); 
end; 

瀏覽器領域,您還可以先當進入選擇文本,所以在此:

要完全模擬這些瀏覽器的地址欄,本場退出時的控制,所以在OnExit也將取消你需要更謹慎些。作爲一個黑客,你可以用一箇中介做,但最好你會成爲一個自定義的控制:

type 
    TEdit = class(Vcl.StdCtrls.TEdit) 
    private 
     FDoEnterSelect : boolean; 
    end; 

然後

procedure TForm1.Edit1Enter(Sender: TObject); 
begin 
    Edit1.FDoEnterSelect := true; 
end; 

procedure TForm1.Edit1Exit(Sender: TObject); 
begin 
    PostMessage(Edit1.Handle, EM_SETSEL, 0, 0); 
end; 

procedure TForm1.Edit1MouseUp(Sender: TObject; Button: TMouseButton; 
           Shift: TShiftState; X, Y: Integer); 
begin 
    if Edit1.FDoEnterSelect and 
    (Edit1.SelLength = 0) then 
     PostMessage(Edit1.Handle, EM_SETSEL, 0, -1); 
    Edit1.FDoEnterSelect := false; 
end; 

procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); 
begin 
    Edit1.FDoEnterSelect := false; 
end; 

用tab鍵控制的情況下,KeyUp處理交易。唯一剩下的奇怪情況是,如果編輯控件的TabOrder爲零,並且因此在創建表單(因此被選中)時關注它。這會影響第一次點擊進入控件。

相關問題