![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обработка события: нажатие и удержание клавиши мыши [D5, WinXP]
antonioxxx © (2007-11-01 20:22:00)Здравствуйте, уважаемые профессионалы!
Разрешите обратиться к вам со следующим вопросом. Возникла необходимость создать обработчик события нажатия и удержания нажатой левой клавиши мыши: требуется, чтобы при визуальном перемещении строк в TStringGrid посредством мыши в момент "перетаскивания" свойство Cursor принимало значение crDrag, а после перемещения возвращалось исходное значение crDefault. Изменение этих свойств в событиях для таблицы OnMouseDown/Move/Up решить задачу не позволяет, что в общем-то понятно, ведь события эти возникают уже после "отжатия" нажатой клавиши. Работаю в среде D5.
Буду очень признателен, если подскажете, каким образом это событие можно обработать!
Заранее всем большое спасибо за помощь!
Германн (2007-11-04 01:27:00) [1]
> Leonid Troyanovsky © (04.11.07 00:34) [19]
>
>
А мне сразу напомнило "проблемные дни" из рекламы. Почему и сам не пойму :)
Leonid Troyanovsky (2007-11-04 00:34:00) [2]
> Юрий Зотов © (04.11.07 00:16) [18]
> Бесспорно. А в "педагогических целях" - тем более.
:)
Хорошо заквочено.
Напоминает "гигиенических".
Sorry.
--
Regards, LVT.
Юрий Зотов (2007-11-04 00:16:00) [3]> Leonid Troyanovsky © (03.11.07 23:57) [17]
> Но, во-ще-то, даже в педагогических целях, я бы более рекомендовал
> готовую реализацию D'n'D, где многое уже украдено до нас.
Бесспорно. А в "педагогических целях" - тем более.
Leonid Troyanovsky (2007-11-03 23:57:00) [4]
> Юрий Зотов © (03.11.07 22:55) [14]
> OnMouseDown - выставляем логический флажок.
Флажок, это, конечно, хорошо.
Но, драг-курсор, постоянно вылезающий при кликах по гриду
производет неприятное впечатление.
Предпочтительней, сделать так: удерживает юзер кнопку мыше более чем,
скажем, 200 мс, то начинаем операцию перетаскивания.
Т.е., на сцену выходит еще один участник - таймер, в котором
оный флаг и устанавливается.
Но, во-ще-то, даже в педагогических целях, я бы более рекомендовал
готовую реализацию D'n'D, где многое уже украдено до нас.
Кста, что за действия надо осуществлять в OnMouseMove
мне так и осталось непонятным.
--
Regards, LVT.
Юрий Зотов (2007-11-03 23:15:00) [5]> antonioxxx (03.11.07 23:06) [15]
Вот чего не хотел - так это пристыживать. Чес-слово.
А чего хотел - чтобы человек взглянул на вопрос шире. С точки зрения ПРОГРАММИРОВАНИЯ, а не кодирования.
:о)
antonioxxx (2007-11-03 23:06:00) [6]Юрий Зотов
Да, спасибо еще раз большое!
Пристыженный предпоследним ответом, я все-таки разобрался, уделив этому вопросу чуть больше времени... :)
Еще раз огромное спасибо всем, кто принял участие в обсуждении! Мне действительно во многом помогли ваши советы!
Юрий Зотов (2007-11-03 22:55:00) [7]> Насколько я понимаю, если создается обработчик события перемещения
> мыши, запрограммированные действия производятся в любом
> случае в момент, когда перемещается курсор
И с этим не поспоришь. Но давайте попробуем хотя бы сделать эту цепочку минимальной?
Например, так:
OnMouseDown - выставляем логический флажок.
OnMouseUp - сбрасываем этот флажок
OnMooseMove - если флажок выставлен, то что-то делаем.
Тогда "излишне" выполняемый код сведется к простой проверке:
if флажок then...
Причем это решение тоже не идеальное. Но в данном случае, наверное, подходит.
antonioxxx (2007-11-03 22:50:00) [8]Leonid Troyanovsky
Тематическое высказывание оставлю без комментариев, а вот с
> Мыслительную мышцу надо напрягать ;)
соглашусь. :)
Leonid Troyanovsky (2007-11-03 21:01:00) [9]
> antonioxxx (03.11.07 19:53) [11]
> Ну, коль скоро я задаю вопрос в конференции, делаю я это
> отнюдь не для собственной забавы аля "подискутировать на
> тему...", согласитесь. :)
Целью всякого (разумного) обсуждения должно стать избавление
каждого (вменяемого) участника от собственных заблуждений.
Напомню, что в европейской культуре истина (сама по себе)
имеет самостоятельную ценность.
Предполагается, что человек, задающий вопрос, признает
вышесказанное, т.е., его мотивом является стремление
узнать истину.
> Насколько я понимаю, если создается обработчик события перемещения
> мыши, запрограммированные действия производятся в любом
> случае в момент, когда перемещается курсор. Да, известная,
> мягко говоря, неидеальность в этом конкретном коде есть,
> но я для того и задаю вопрос, в надежде получить подсказку,
> а не указание на собственную несостоятельность.
Сомнение в истинности суждения и есть подсказка, о том,
что следует пройти цепочку выводов сначала.
Мыслительную мышцу надо напрягать ;)
--
Regards, LVT.
antonioxxx (2007-11-03 19:53:00) [10]
> Тогда разрешите один вопрос - сколько раз в секунду выполняется
> Ваш код при движении мыши ?
>
> Нет ли там чего-то неправильного, как Вы считаете?
Ну, коль скоро я задаю вопрос в конференции, делаю я это отнюдь не для собственной забавы аля "подискутировать на тему...", согласитесь. :)
Насколько я понимаю, если создается обработчик события перемещения мыши, запрограммированные действия производятся в любом случае в момент, когда перемещается курсор. Да, известная, мягко говоря, неидеальность в этом конкретном коде есть, но я для того и задаю вопрос, в надежде получить подсказку, а не указание на собственную несостоятельность.
Без обид. :)
Юрий Зотов (2007-11-03 18:11:00) [11]> antonioxxx (03.11.07 09:51) [9]
> Теперь все в полном ажуре!
Вы уверены?
Тогда разрешите один вопрос - сколько раз в секунду выполняется Ваш код при движении мыши ?
Нет ли там чего-то неправильного, как Вы считаете?
antonioxxx (2007-11-03 09:51:00) [12]TStas
Спасибо большое за дополнение, добавил дополнительный код в OnMouseDown:
If ssLeft In Shift Then
Screen.Cursor:=crDrag;
Теперь все в полном ажуре! :-)
TStas (2007-11-02 21:05:00) [13]Но и в этом случает курсор у Вас изменится не сразу, а лишь после перемещения мышки, ведь только тогда произойдет MouseMove
antonioxxx (2007-11-02 13:47:00) [14]ЮЮ
Спасибо огромное, помогло!!
Задачу разрешил следующий код :) :
procedure TForm1.SGMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
If ssLeft In Shift Then
Screen.Cursor:=crDrag
Else
Screen.Cursor:=crDefault;
end;
Еще раз большое спасибо!! :)
Leonid Troyanovsky (2007-11-02 12:26:00) [15]
> antonioxxx (01.11.07 23:13) [3]
> onDrag* пробовал, не работает … Я, правда, не особенно вникал
> в сущность этой группы событий, но насколько понял, они
Все работает, и внутри грида в т.ч.
Вникай.
--
Regards, LVT.
ЮЮ (2007-11-02 03:05:00) [16]Попробуй изменять не SG.Cursor, а Screen.Cursor
antonioxxx (2007-11-01 23:15:00) [17]В код вкралась неточность, неприсутствующая в программном коде проекта, корректный вариант:
procedure TForm1.SGMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
If ssLeft In Shift Then
SG.Cursor:=crDrag;
end;
antonioxxx (2007-11-01 23:13:00) [18]Большое спасибо за ответы!
Leonid Troyanovsky
onDrag* пробовал, не работает … Я, правда, не особенно вникал в сущность этой группы событий, но насколько понял, они возникают, если происходит «непосредственный Drag&Drop», т.е. если предполагается внесение данных в программу извне, а не перемещение полей внутри таблицы.
Юрий Зотов
Попробовал написать такой обработчик для *Move:
procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
If ssLeft In Shift Then
SG.Cursor:=crDrag;
end;
Но реально курсор изменяется только после того, как уже переместил строку и отпустил клавишу мыши ... Может быть подскажешь, если нетрудно, что нужно изменить ... Да, в работе TSTringGrid такая особенность: строки меняются местами, только если нажимаешь на фиксированной ячейке ... убедился по собственному опыту :)
Leonid Troyanovsky (2007-11-01 21:40:00) [19]
> antonioxxx (01.11.07 20:22)
> Изменение этих свойств в событиях для таблицы OnMouseDown/Move/Up
> решить задачу не позволяет,
А что мешает OnDrag*?
--
Regards, LVT.
Юрий Зотов (2007-11-01 21:07:00) [20]OnMouseMove возникает НЕ после отжатия. И там есть Shift.