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

Вниз

Обработка события: нажатие и удержание клавиши мыши   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.015 c
2-1200661708
Alex_C
2008-01-18 16:08
2008.02.10
TColorDialog - убрать лишние цвета


15-1199697142
Виктор007
2008-01-07 12:12
2008.02.10
Компиляция из коммандной строки


15-1200053321
Darvin
2008-01-11 15:08
2008.02.10
Долгая инсталляция в висте с включенным UAC


2-1200253396
AntonUSAnoV
2008-01-13 22:43
2008.02.10
по поводу findwindow


2-1200288161
АндрейК
2008-01-14 08:22
2008.02.10
номер строки в DBGrid