Форум: "Основная";
Текущий архив: 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.018 c