2016-11-23 10 views
3

Я хочу иметь TEdit, который реагирует на клик, подобный барам Url в Chrome и Firefox. На первом щелчке они подбирают все текстовые и после щелчки снять выделение, как показано здесь:TEdit выберите текст на клике, как в столбцах URL-адресов в браузере Chrome и Firefox

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 будет запущено. Я уже пытался поставить этот код в события OnMouseUp и OnMouseDown, но проблема остается прежней.

Как его решить? Есть ли способ сделать это без добавления дополнительной переменной 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) удаляет все выбранные в Edit контроль. Проводка сообщения гарантирует, что он будет обработан после завершения оставшегося по умолчанию поведения по умолчанию.

Чтобы полностью эмулировать адресную строку в этих браузерах, поле также отменяет при выходе из управления, так и в OnExit:

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

поле Браузер также позволяет выбрать текст, когда первый ввод, так что в этом Если вам нужно быть немного осторожнее. Как взломать вы можете сделать это с вставкой, но в идеале вы бы сделать пользовательский элемент управления:

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, равное нулю, и поэтому сфокусируется, когда форма создана (и поэтому выбрана). Это повлияет только на первый щелчок в элементе управления.