Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.043 c
15-1199936235
Slider007
2008-01-10 06:37
2008.02.10
С днем рождения ! 10 января 2008 четверг


2-1200657601
_Shuler_
2008-01-18 15:00
2008.02.10
theme


2-1200803639
_Shuler_
2008-01-20 07:33
2008.02.10
новая строка


15-1199250677
Dmitry S
2008-01-02 08:11
2008.02.10
Не грузится Windows.


15-1199874496
daniil_s
2008-01-09 13:28
2008.02.10
Справка wiki





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский