Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.04.09;
Скачать: [xml.tar.bz2];

Вниз

Программное перемещение курсора мыши по ячейкам StringGrid   Найти похожие ветки 

 
Игорь Степанов   (2006-03-02 19:16) [0]

Уважаемые мастера,

Подскажите, пожалуйста, как программно перемещать курсор мыши от ячейки к ячейки в компоненте StringGrid?

С уважением,

Игорь Степанов


 
Virgo_Style ©   (2006-03-02 19:24) [1]

.Row
.Col


 
Игорь Степанов   (2006-03-02 20:45) [2]

Извините,

нельзя ли написать по-подробнее.

Заранее благодарю.

Игорь Степанов


 
begin...end ©   (2006-03-02 21:47) [3]

with StringGrid do
 Mouse.CursorPos := ClientToScreen(CellRect(столбец, ряд).BottomRight)


 
Virgo_Style ©   (2006-03-02 22:04) [4]


> курсор мыши


Прошу прощения. Невнимательно прочитал вопрос...


 
Игорь Степанов   (2006-03-03 18:05) [5]

Большое спасибо.

Я использовал этот код для принудительного помещения курсора в центр верхней левой ячейки сетки.
var
  R:TRect; GridCrd:TPoint; ScrdCell0:TPoint;
Begin
   R:=StringGrid1.CellRect(0,0);
   GridCrd.X:=R.Right DIV 2; GridCrd.Y:=R.Bottom DIV 2;
   ScrdCell0:=StringGrid1.ClientToScreen(GridCrd);
   SetCursorPos(ScrdCell0.X, ScrdCell0.Y);
   Selzerocell;

Курсор перекрасно переводится. Но теперь возникла следующая проблема.
Далее я ожидаю, когда пользователь начнёт двигать мышь.

 beginmmove:=False; // движение мыши
begincurmove:=False; //движение курсорными клавишами
   repeat
   Application.ProcessMessages;
   until (beginmmove OR begincurmove);

Однако, оказалось, что процедура SetCursorPos(ScrdCell0.X, ScrdCell0.Y); сама по себе вызывает появление сообщения о передвижении курсора мыши, так что даже если пользователь ещё не тронул мышь, сообщение уже появилось и переменная beginmmove (указывающая на перемещение мыши) уже установлена в True. Можно ли предотвратить передачу этого сообщения или очистить буфер, куда это сообщение поступает, непосредственно перед циклом
repeat
Application.ProcessMessages; ?

Заранее благодарю.

Игорь Степанов


 
Virgo_Style ©   (2006-03-04 08:30) [6]

А можно озвучить задачу целиком? Цикл с Application.ProcessMessages мне кажется не очень удачным решением чего бы то ни было.

Если все же будет использоваться ProcessMessages, то отвечу на еще не заданный вопрос %-) : чтобы не загружать процессор, добавь в цикл Sleep с небольшим числом.


 
Игорь Степанов   (2006-03-04 14:16) [7]

Я сейчас занимаюсь психофизиологическим тестом на внимание, в котором используется таблица 7 х 7 клеток с числами.  Для унификации теста я решил перед началом каждого этапа тестирования помещать курсор мыши в верхнюю левую клетку. Кроме того, я обеспечил возможность использования либо курсорных клавиш либо мыши для перемещения по таблице. Для автоматического определения, с помощью чего пользователь будет передвигаться по табице, я решил использовать две булевы
переменные. В частности, для фиксации момента начала перемещения по таблице с помощью мыши я решил использовать обработчик события
OnMouseMove, в котором устанавливается при начале перемещения булева
переменная: If (NOT beginmmove) then beginmmove:=True;  

В процедуре Timer1Timer помощью процедуры SetCursorPos(ScrdCell0.X, ScrdCell0.Y); курсор помещается в середину нулевой клетки. Далее программа ожидает начало перемещения пользователем мыши в цикле

repeat    
Application.ProcessMessages;    
until (beginmmove OR  begincurmove);

Однако оказалось, что после выполнения процедуры
SetCursorPos(ScrdCell0.X, ScrdCell0.Y); посылается сообщение о
перемещении курсора и к моменту начала цикла переменная
beginmmove уже выставлена в True, то есть обработано событие On MouseMove. Таким образом, вся моя затея с автоматическим определением, с помощью чего будет пользователь  передвигаться по таблице, провалилась. Поэтому у меня вопрос: как можно избавиться от сообщения о
принудительном передвижении курсора мыши перед началом вышеупомянутого цикла?
Может быть для сообщений есть нечто вроде буфера клавиатуры, который
можно очищать? Какую функцию Windows API следует для очистки
использовать?

Заранее благодарю.

Игорь Степанов

procedure Tatn_brt_showF.Timer1Timer(Sender: TObject);
label theend;
var
l:integer; R:TRect; GridCrd:TPoint; ScrdCell0:TPoint;
begin
   Timer1.Enabled:=False;
   R:=StringGrid1.CellRect(0,0);
   GridCrd.X:=R.Right DIV 2; GridCrd.Y:=R.Bottom DIV 2;
   ScrdCell0:=StringGrid1.ClientToScreen(GridCrd);
   SetCursorPos(ScrdCell0.X, ScrdCell0.Y);
   Selzerocell;
   stageone:=False; stagetwo:=False; stagethree:=False;
   stage1:=0; stage2:=0; stage3:=0;
   mess(rs1);
   beginmmove:=False; begincurmove:=False;
   repeat
   Application.ProcessMessages;
   until (beginmmove OR begincurmove);
       If beginmmove then use_mouse;
   If rettomm then goto theend;
   If begincurmove then use_kbd;


 
Virgo_Style ©   (2006-03-04 14:51) [8]

м-да, не понимаю я задачу, однако.

Можно ввести флажок на манер IsMouseMovedByProgram %-), который поднимать перед SetCursorPos, а в OnMouseMove, если он взведен, то сбрасывать его, и ничего больше не делать.

А вообще, imho, изврат какой-то... может, условия теста такие, что он оправдан... Но зачем нужен выбор либо-либо, я не понимаю.


 
GrayFace ©   (2006-03-04 15:41) [9]

Можно просто вызвать ProcessMessages перед beginmmove:=False; begincurmove:=False;. Однако, от использования таймера и цикла лучше отказаться, реагировать на начало дижения непосредственно в OnMouseMove и OnKeyDown и ввести вышеуказанный флажок.


 
Игорь Степанов   (2006-03-05 20:22) [10]

Уважаемые мастера,

Я для определённости положил в качестве события выбора пользователем мыши факт выхода курсора за пределы нулевой клетки. Тогда обработчик перемещения мыши принял  вид:

procedure Tatn_brt_showF.StringGrid1MouseMove(Sender: TObject;
 Shift: TShiftState; X, Y: Integer);
var
   ACol,ARow:Integer;
begin
  If (NOT beginmmove) then begin
  StringGrid1.MouseToCell(X,Y,ACol,ARow);
  If ((ACol>0) OR (ARow>0)) then beginmmove:=True;
  end; {NOT beginmmove }
end;  { StringGrid1MouseMove}

А в блок кода для ожидания реакции пользователя я добавил маленькую задержку, как было предложено:

   repeat
   Application.ProcessMessages;
   sleep(20);
   until (beginmmove OR begincurmove);

Теперь можно слегка двигать мышкой, а это важно, иначе от сотрясения мышь может сработать, и пока курсор не выйдет за пределы нулевой клетки, программа находится в состоянии ожидания.

Большое спасибо за помощь.

С наилучшими пожеланиями и надеждой на дальнейшую помощь,

Игорь Степанов



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2006.04.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.012 c
3-1139599601
Варяг
2006-02-10 22:26
2006.04.09
Проблем подключения VFoxPro через ADO


2-1143388546
tech
2006-03-26 19:55
2006.04.09
Текстовый файл стал бинарным!


15-1142576288
_white_
2006-03-17 09:18
2006.04.09
FIBPlus и FIBPlus


11-1123317561
Serg777
2005-08-06 12:39
2006.04.09
Маска файла *.* и файл без расширения


15-1142268082
ZeFiR
2006-03-13 19:41
2006.04.09
Карта Киева





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский