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