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

Вниз

Как обрабатывать щелчки по неактивным контролам?   Найти похожие ветки 

 
Morpheus   (2008-10-28 18:45) [0]

Некий стандартный компонент VCL, свойство Enabled = False. Как обработать по нему щелчок?


 
Anatoly Podgoretsky ©   (2008-10-28 19:00) [1]

Никак - он Disabled


 
Morpheus   (2008-10-28 19:08) [2]

Anatoly Podgoretsky, я тоже надеюсь, что в форуме "Для начинающих" мне подробно объяснят, как переписать свойство компонента, чтобы компонент оставался недоступным для фокуса и редактирования, но можно было обрабатывать щелчк и драгндроп.


 
Anatoly Podgoretsky ©   (2008-10-28 19:12) [3]

Ты никак не можешь обрабатывать щелчок внутри компонента, поскольку он запрещен, видимо тобой.
Или обрабатывай все нажания мышки на форме или разреши компонент, а то дурдом получается, одновременно и запрещен и нет.
Ты грибами то поделись, нехорошо одному кайф ловить.


 
clickmaker ©   (2008-10-28 19:15) [4]

> оставался недоступным для фокуса и редактирования

ReadOnly = true
TabStop = false


 
Юрий Зотов ©   (2008-10-28 19:18) [5]

> Morpheus   (28.10.08 18:45)  

Задизабленный контрол не получает сообщений мыши и клавиатуры и поэтому не генерит соответствующих событий. Соответственно, нельзя обработать события, которых нет.

Если нужно обработать мышь, то дизаблить сам контрол нельзя, а надо запретить обработку клавиатуры. Как это сделать - написано в справке по методам OnKeyDown и OnKeyPress (обнулить Key надо). Также может пригодиться свойство формы KeyPreview - тоже см. в справке.


 
Morpheus   (2008-10-28 19:24) [6]

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


 
SergeyIT ©   (2008-10-28 19:31) [7]


>  идея проста.

Это нестандартное поведение. Пользователь может и запутаться.


 
clickmaker ©   (2008-10-28 19:33) [8]

> [6] Morpheus   (28.10.08 19:24)

а как юзер, видя задизейбленный эдит, догадается, что по нему можно-таки щелкнуть?


 
b z   (2008-10-28 19:33) [9]

Как вариант: кинуть на панель, и обрабатывать клик панели (при Enabled = False).


 
Morpheus   (2008-10-28 19:36) [10]

Юрий Зотов, то есть переделать это свойство нельзя? Понятно, спасибо.
Вообщем, будем считать, что визуально проблема решена.

Значит если галочка не стоит, то мне при попытки редактировании поля сразу заменять код клавиши на 0. Для красоты убирать мигающий курсор и менять цвет на серый. Лучше конечно было бы вообще не разрешать фокус на поле.

Я вот подумал еще, может быть при недоступности самого компонента можно как-то обрабатывать в событиях родителей или нет? Если координаты курсора в области недоступного компонента, то родительское событие можно как-нибудь заставить сработать?


 
Morpheus   (2008-10-28 19:39) [11]

Вреда это не доставит по крайней мере, полешки широкие, а квадратики маленькие в уголочке, тем более при инициализации формы и отключении флажки поле затемняется и в нем появляется надпись: "щелкните для добавления" =)


 
{RASkov} ©   (2008-10-28 19:45) [12]

> Morpheus

Может не нужно ничего дисаблить а как вариант сделать нечто так:
procedure TForm.EditOnChange();
begin
 CheckBox.Checked:=Edit.Text<>"";
end;


 
Morpheus   (2008-10-28 19:59) [13]

Я короче сам уже придумал решение, но что-то оно меня смущает, вот смотрите:

procedure DisClick(Sender, Target: TObject);
var
 X,Y: Word;
 dx, dy: byte;
begin
 X:= Mouse.CursorPos.X + (Sender as TForm).Left + (Target as TEdit).Left;
 Y:= Mouse.CursorPos.Y + (Sender as TForm).Top + (Target as TEdit).Top;
 dx:= (Target as TEdit).Left + (Target as TEdit).Width;
 dy:= (Target as TEdit).Top + (Target as TEdit).Height;
 if (X in [(Target as TEdit).Left..dx]) and
   (Y in [(Target as TEdit).Top..dy]) then
     (Target as TEdit).OnClick(nil);
end;


 
Morpheus   (2008-10-28 20:11) [14]

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

procedure TGSForm.FormClick(Sender: TObject);
var i: word;
begin
 for i:= 0 to GSForm.ControlCount - 1 do
   if GSForm.Controls[i] is TEdit then
     DisClick(Sender, (GSForm.Controls[i]));
end;

Примение может быть более широким.
Да, я уж совсем забыл что при неактивности компонента по-умолчанию, срабатывают именно родительские события ;-)


 
Anatoly Podgoretsky ©   (2008-10-28 20:15) [15]

> Morpheus  (28.10.2008 19:39:11)  [11]

Ну какой же он запрещеный, это же финтифлюшка, колокольчик.


 
{RASkov} ©   (2008-10-28 20:22) [16]

> [14] Morpheus   (28.10.08 20:11)

procedure TForm.<Parent>MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 CheckBox.Checked:=<Parent>.ControlAtPos(Point(X, Y), True, True) = Edit;
 if CheckBox.Checked then Edit.SetFocus; //Не обязательно...
end;

Т.е. задизабленый контрл сообщение шлет далее родителю... В принципе почти тоже самое что и у тебя :)



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

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

Наверх




Память: 0.5 MB
Время: 0.014 c
15-1222928133
РВА
2008-10-02 10:15
2008.12.07
Интернет для дома


2-1225174004
worldmen
2008-10-28 09:06
2008.12.07
Программно нажать комбинацию клавиш


2-1224695992
Сергей Кокоулин
2008-10-22 21:19
2008.12.07
Определение доступных COM портов?


2-1224955331
Саня
2008-10-25 21:22
2008.12.07
Обработка гиперссылок в TWebbrowser


15-1223355983
igorm
2008-10-07 09:06
2008.12.07
ошибка чтения из файла