Текущий архив: 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