Главная страница
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.012 c
2-1225115068
Mozgan
2008-10-27 16:44
2008.12.07
Преобразование типа таблицы Ttable в строку


15-1222800406
axis_of_evil
2008-09-30 22:46
2008.12.07
как получить список процессов ..


15-1222915880
Slider007
2008-10-02 06:51
2008.12.07
С днем рождения ! 2 октября 2008 четверг


2-1225259163
Вовка
2008-10-29 08:46
2008.12.07
Вопрос по ChackListBox


15-1222946859
Поросенок Винни-Пух
2008-10-02 15:27
2008.12.07
недвижимость в мичигане за пару баксов