2016-11-23 4 views
3

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が常にあるように、このコードは動作しません最初に、彼らはここに示すように、すべてのテキストと、次のクリックが選択を削除]を選択しクリックしてくださいOnClickイベントがトリガされる前に、選択は常にクリアされます。私は既にこのコードをOnMouseUpOnMouseDownイベントに入れようとしましたが、問題は同じままです。

どうすれば解決できますか?現在の状態を保存する変数booleanを追加せずにこれを行う方法はありますか?

+0

AutoSelect:= False? –

+0

@SertacAkyuzそれは動作しません – Wosi

答えて

4

制御ゲインは、単にOnEnterイベントを処理し、焦点を合わせたときにTEditコントロール内のすべてのテキストを選択するには:

OnEnter後に発生する)デフォルトの動作は、編集のいずれかの選択をクリアしますので、あなたが Edit1.SelectAllを使用することはできません
procedure TForm1.Edit1Enter(Sender: TObject); 
begin 
    PostMessage(Edit1.Handle, EM_SETSEL, 0, -1); 
end; 

コントロール。メッセージを送信すると、残りのデフォルト動作が完了した後にメッセージが確実に処理されます。この中のSOブラウザフィールドはまた、第1のテキスト入力を選択することができます

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; 

コントロールにタブ移動の場合とKeyUpハンドラを扱っています。残っている奇妙なケースは、編集コントロールのTabOrderが0であるため、フォームが作成されたときにフォーカスが当てられているためです。これはコントロールへの最初のクリックにのみ影響します。

関連する問題