![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TEdit и AutoSelect [D5, WinXP]
TechnoDreamer © (2005-06-29 03:13:00)Такая проблема, на эдите стоит Autoselect, но работает он только если табом переключятся, а если кликом мыки то не пашет. Не знаю должен ли вообще.
Попробовал сделать на OnEnter следующее:
Edit1.SelectAll;
не работает всё равно, поставил после это ShowMessage, видно что срабатывает, текст выделяет, но сразу пропадает (когда я ОК нажимаю). Других событий на эдите нет.
При чем на он клик это работает, только мне нужно что бы оно срабатывало, только один раз после получения фокуса.
В чем прикол не пойму, это глюк,или я что то провтыкал?
Игорь Шевченко (2005-06-29 18:25:00) [1]Собстна, еще решение:
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. Спасибо Ученику за предложенный способ замены поведения стандартных классов.
Плохиш (2005-06-29 15:13:00) [2]
> Хотя это не правильно на мой взгляд. Сразу ведь происходит
> клик, а потом как следствие приебретиние фокуса, а не наоборот.
Все сообщения посылаются активному компоненту, поэтому сначала надо передать ему фокус, а уж потом посылать сообщения.
TechnoDreamer (2005-06-29 15:06:00) [3]>После OnEnter, происходят события обработки нажатия кнопки мыши и >работает алгоритм, описанный в [1].
Хм, вполне возможно. Хотя это не правильно на мой взгляд. Сразу ведь происходит клик, а потом как следствие приебретиние фокуса, а не наоборот.
>PS. Ненавижу программы, в которых надо минимум 2 раза кликать на >каком-нибуть поле редактированния, только потому, что их всякие >TechnoDreamer-ы писали, да и не задерживаются они обычно на долго.
Вот любят тут переходить на личности.
1. Во первых вы не знаете о чем пишете. Я уже писал выше, что обычно в этом поле вводят, новые данные, хотя изредка бывает потребность просто изменить уже введенные (достаточно редко, может 95 из 100, хотя точную статистику никто конечно не считал). Так что в большинстве случаев нужен именно один клик, а ваш стандартный вариант потребует либо двойной клик (что вообще не интуитивно понятно), либо вообще удаление символов с клавиатуры (поверте, мои офисные работники в основном тыкают Backspace n-ое количество раз) что еще дольше.
2. Во вторых, не переживайте, мою программу вы никогда не увидите, потому, что уж очень она специализирована.
3. Ну и в третих, программа пишется под заказ, и на эту деталь, мне указал именно заказчик, я посмотрел, действительно так намного удобнее.
(Между прочим, в том же Ворде когда вызываешь окно поиска текста, предидущий текст выделен, и это удобно. Но мой эдит расположен в на основной форме, а не в отдельном окне, поэтому выделение нужно на фокус, а не показ формы).
P.S. И советую быть повежливее, а то странно что ВСЯКИЕ плохиши под сороковник еще вежливо говорить не научились.
Плохиш (2005-06-29 12:22:00) [4]
> TechnoDreamer © (29.06.05 12:08) [7]
После OnEnter, происходят события обработки нажатия кнопки мыши и работает алгоритм, описанный в [1].
PS. Ненавижу программы, в которых надо минимум 2 раза кликать на каком-нибуть поле редактированния, только потому, что их всякие TechnoDreamer-ы писали, да и не задерживаются они обычно на долго.
TechnoDreamer (2005-06-29 12:08:00) [5]2 Alexander Panov
Спасибо, просто и красиво. Иногда упрешся во что, то и не видешь простых решений. Хотя всё таки интересно, почему на OnEnter не работает.
Alexander Panov (2005-06-29 11:56:00) [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 11:34:00) [7]>Будьте добры, приведите ссылку на описание стандарта. Или, хотя >бы, его (стандарта) наименование. ;)
Ну вот, начинаются совершенно бесмысленные споры, совершенно не касающиеся вопроса.
>>но по завершении его оно пропадает
>Я подозреваю, это делает Ваша программа.
Пример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;
В первом варианте выделяет, во втором нет. В обоих вариантах на первом клике события вызываются. По чему не выделяет во втором, вот в чем вопрос.
Кстати, обратите внимание как ведет себя комбобокс, просто бросьте на форму два компонента, комбобокс и едит, и попереключайтесь между ними. Мне надо чтобы вело себя так как в комбобоксе, ответы, типа где написано что так должно работать, не принимаются, есть элементарные принципы юзабилити, а такой вариант считается намного удобнее (что бесспорно) когда чаще приходится заменять текст, а не редактировать (мой случай).
-=XP=- (2005-06-29 10:46:00) [8]Стандартно интерфейс должен работать так
Будьте добры, приведите ссылку на описание стандарта. Или, хотя бы, его (стандарта) наименование. ;)
но по завершении его оно пропадает
Я подозреваю, это делает Ваша программа.
TechnoDreamer (2005-06-29 10:40:00) [9]gydvin, ставить на маусап тут тоже самое что и в онклик в данном случае.
VMcL, так не задумано. Стандартно интерфейс должен работать так, юзер туда кликает, выделяется весь текст, и он может его заменить, если он хочет поместить внутрь курсор, то он кликает второй раз, выделение пропадает и курсор становится в место клика. Для этого и есть свойство AutoSelect, и это у меня прекрасно работает в ComboBox, а тут нет. Да и вопрос был в другом. Выделение происходит, в событии OnEnter, но по завершении его оно пропадает. Почему не пойму. Мне нужно чтобы выделяло весь текст при получении TEdit фокуса, а не на каждое нажатие мышки.
gydvin (2005-06-29 09:11:00) [10]
procedure TForm1.Edit1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
edit1.SelectAll;
end;
VMcL (2005-06-29 08:26:00) [11]>> TechnoDreamer © (29.06.05 03:13)
AFAIK, это не глюк, так задумано. Если юзер кликает мышкой в Edit'е, то вполне вероятно, он хочет установить курсор сразу в определённое место.