Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.18;
Скачать: CL | DM;

Вниз

TEdit и AutoSelect   Найти похожие ветки 

 
TechnoDreamer ©   (2005-06-29 03:13) [0]

Такая проблема, на эдите стоит Autoselect, но работает он только если табом переключятся, а если кликом мыки то не пашет. Не знаю должен ли вообще.
Попробовал сделать на OnEnter следующее:
Edit1.SelectAll;
не работает всё равно, поставил после это ShowMessage, видно что срабатывает, текст выделяет, но сразу пропадает (когда я ОК нажимаю). Других событий на эдите нет.
При чем на он клик это работает, только мне нужно что бы оно срабатывало, только один раз после получения фокуса.
В чем прикол не пойму, это глюк,или я что то провтыкал?


 
VMcL ©   (2005-06-29 08:26) [1]

>>TechnoDreamer ©   (29.06.05 03:13)

AFAIK, это не глюк, так задумано. Если юзер кликает мышкой в Edit"е, то вполне вероятно, он хочет установить курсор сразу в определённое место.


 
gydvin   (2005-06-29 09:11) [2]

procedure TForm1.Edit1MouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
edit1.SelectAll;
end;


 
TechnoDreamer ©   (2005-06-29 10:40) [3]

gydvin, ставить на маусап тут тоже самое что и в онклик в данном случае.

VMcL, так не задумано. Стандартно интерфейс должен работать так, юзер туда кликает, выделяется весь текст, и он может его заменить, если он хочет поместить внутрь курсор, то он кликает второй раз, выделение пропадает и курсор становится в место клика. Для этого и есть свойство AutoSelect, и это у меня прекрасно работает в ComboBox, а тут нет. Да и вопрос был в другом. Выделение происходит, в событии OnEnter, но по завершении его оно пропадает. Почему не пойму. Мне нужно чтобы выделяло весь текст при получении TEdit фокуса, а не на каждое нажатие мышки.


 
-=XP=- ©   (2005-06-29 10:46) [4]

Стандартно интерфейс должен работать так

Будьте добры, приведите ссылку на описание стандарта. Или, хотя бы, его (стандарта) наименование. ;)

но по завершении его оно пропадает

Я подозреваю, это делает Ваша программа.


 
TechnoDreamer ©   (2005-06-29 11:34) [5]

>Будьте добры, приведите ссылку на описание стандарта. Или, хотя >бы, его (стандарта) наименование. ;)
Ну вот, начинаются совершенно бесмысленные споры, совершенно не касающиеся вопроса.

>>но по завершении его оно пропадает
>Я подозреваю, это делает Ваша программа.
Пример1.

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;

type
 TForm1 = class(TForm)
   ComboBox1: TComboBox;
   Edit1: TEdit;
   procedure Edit1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Edit1Click(Sender: TObject);
begin
Edit1.SelectAll;
end;

end.

Пример2

//Всё то же, вместо OnClick -> OnEnter
procedure TForm1.Edit1Enter(Sender: TObject);
begin
Edit1.SelectAll;
end;


В первом варианте выделяет, во втором нет. В обоих вариантах на первом клике события вызываются. По чему не выделяет во втором, вот в чем вопрос.
Кстати, обратите внимание как ведет себя комбобокс, просто бросьте на форму два компонента, комбобокс и едит, и попереключайтесь между ними. Мне надо чтобы вело себя так как в комбобоксе, ответы, типа где написано что так должно работать, не принимаются, есть элементарные принципы юзабилити, а такой вариант считается намного удобнее (что бесспорно) когда чаще приходится заменять текст, а не редактировать (мой случай).


 
Alexander Panov ©   (2005-06-29 11:56) [6]

procedure TForm1.Edit1Click(Sender: TObject);
begin
 if TEdit(Sender).Tag=0 then
 begin
   TEdit(Sender).Tag := 1;
   TEdit(Sender).SelectAll;
 end;
end;

procedure TForm1.Edit1Exit(Sender: TObject);
begin
 TEdit(Sender).Tag := 0;
end;


 
TechnoDreamer ©   (2005-06-29 12:08) [7]

2 Alexander Panov
Спасибо, просто и красиво. Иногда упрешся во что, то и не видешь простых решений. Хотя всё таки интересно, почему на OnEnter не работает.


 
Плохиш ©   (2005-06-29 12:22) [8]


> TechnoDreamer ©   (29.06.05 12:08) [7]

После OnEnter, происходят события обработки нажатия кнопки мыши и работает алгоритм, описанный в [1].

PS. Ненавижу программы, в которых надо минимум 2 раза кликать на каком-нибуть поле редактированния, только потому, что их всякие TechnoDreamer-ы писали, да и не задерживаются они обычно на долго.


 
TechnoDreamer ©   (2005-06-29 15:06) [9]

>После OnEnter, происходят события обработки нажатия кнопки мыши и >работает алгоритм, описанный в [1].
Хм, вполне возможно. Хотя это не правильно на мой взгляд. Сразу ведь происходит клик, а потом как следствие приебретиние фокуса, а не наоборот.

>PS. Ненавижу программы, в которых надо минимум 2 раза кликать на >каком-нибуть поле редактированния, только потому, что их всякие >TechnoDreamer-ы писали, да и не задерживаются они обычно на долго.
Вот любят тут переходить на личности.
1. Во первых вы не знаете о чем пишете. Я уже писал выше, что обычно в этом поле вводят, новые данные, хотя изредка бывает потребность просто изменить уже введенные (достаточно редко, может 95 из 100, хотя точную статистику никто конечно не считал). Так что в большинстве случаев нужен именно один клик, а ваш стандартный вариант потребует либо двойной клик (что вообще не интуитивно понятно), либо вообще удаление символов с клавиатуры (поверте, мои офисные работники в основном тыкают Backspace n-ое количество раз) что еще дольше.
2. Во вторых, не переживайте, мою программу вы никогда не увидите, потому, что уж очень она специализирована.
3. Ну и в третих, программа пишется под заказ, и на эту деталь, мне указал именно заказчик, я посмотрел, действительно так намного удобнее.

(Между прочим, в том же Ворде когда вызываешь окно поиска текста, предидущий текст выделен, и это удобно. Но мой эдит расположен в на основной форме, а не в отдельном окне, поэтому выделение нужно на фокус, а не показ формы).

P.S. И советую быть повежливее, а то странно что ВСЯКИЕ плохиши под сороковник еще вежливо говорить не научились.


 
Плохиш ©   (2005-06-29 15:13) [10]


> Хотя это не правильно на мой взгляд. Сразу ведь происходит
> клик, а потом как следствие приебретиние фокуса, а не наоборот.

Все сообщения посылаются активному компоненту, поэтому сначала надо передать ему фокус, а уж потом посылать сообщения.


 
Игорь Шевченко ©   (2005-06-29 18:25) [11]

Собстна, еще решение:

unit main;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;

type
 TMyEdit = class(TEdit)
   procedure Click; override;
 end;

 TEdit = class(TMyEdit);

 TfMain = class(TForm)
   Edit1: TEdit;
   Edit2: TEdit;
   Button1: TButton;
 end;

var
 fMain: TfMain;

implementation

{$R *.DFM}

{ TMyEdit }

procedure TMyEdit.Click;
begin
 inherited;
 SelectAll;
end;

end.


P.S. Спасибо Ученику за предложенный способ замены поведения стандартных классов.



Страницы: 1 вся ветка

Текущий архив: 2005.07.18;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.027 c
1-1119878055
Begin
2005-06-27 17:14
2005.07.18
Список полей класса. Можно как то получить в runtime?


1-1120051972
Tirex
2005-06-29 17:32
2005.07.18
отсутствие Toolbar в Tntcontrols


14-1119355093
Cerberus
2005-06-21 15:58
2005.07.18
Критерии оценки.


1-1119954359
salexn
2005-06-28 14:25
2005.07.18
Перенос данных из одной ветки реестра в другую.


3-1118132041
Тучудище
2005-06-07 12:14
2005.07.18
Обновление lookup кэша при автоматическом обновлении НД