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

Вниз

Сохранять данные о позициях курсора в файл   Найти похожие ветки 

 
Big Daddy ©   (2002-06-07 10:09) [0]

Как сохранить данные о всех движениях курсора в file.txt
Т.е. все координаты при передвижении курсора типа так:

130,480
131,480
и т.д.


 
Kaban   (2002-06-07 10:12) [1]

а в чем проблема?


 
Kaban   (2002-06-07 10:17) [2]

если упор сделан на слове "все" то сделать это IMHO не получится
обрабатывайте сообщение WM_MOUSEMOVE и пишите в файл. более подробно не получиться.


 
Big Daddy ©   (2002-06-07 10:19) [3]

Надо, при передвижении курсора по форме, сохранять его координаты в файл. Каждую пройденную точку. Я то знаю, что надо использовать функцию типа GetCursorPos, но надо каждую точку. т.е. постоянно.


 
Kaban   (2002-06-07 10:21) [4]

Попробуйте обработать OnMouseMove формы
пишите в файл координаты x и y, может вас это устроит


 
Miwa ©   (2002-06-07 11:06) [5]

Неа, слишком медленно все это, поверьте. На асме, наверное, писать надо.
Во всяком случае, вот что я написал:

var
Form1: TForm1;
f:TextFile;
implementation
{$R *.dfm}

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
writeln(f,inttostr(x),", ",inttostr(y));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
assignfile(f,"c:\test.txt");
rewrite(f);
end;

И вот что вышло в результ-файле:

3, 40
19, 44
21, 45
22, 47
32, 51
46, 61
58, 65
72, 69
88, 72
102, 74
...

Вот так вот....


 
Игорь Шевченко ©   (2002-06-07 11:09) [6]

Используйте двойную буферизацию - быстрее будет. Никакого асма не надо :-)
WM_MOUSEMOVE посылается на каждое перемещение мыши над окном


 
Kaban   (2002-06-07 11:15) [7]

Обработка WM_MOUSEMOVE даст более хороший результат, но гладкой линии IMHO добиться все равно не удасться


 
Miron ©   (2002-06-07 11:24) [8]

А может проще будет фиксировать некоторые из положений курсова (через некоторое время) и такие дейсвия как клик


 
Kaban   (2002-06-07 11:27) [9]

Да, честно говоря, вообще непонятно зачем нужны все координаты


 
Miwa ©   (2002-06-07 11:39) [10]

Конечно, на каждое. Правда, я не уверен, считает ли система сдвиг в 1 пиксел перемещением. Во всяком случае, нижеприведенный фрагмент не дает сплошную линию

push 0ffffffh ;белый цвет
push nm_YCur ;координата
push nm_XCur ;кордната
push DrawHNDL ;указатель на рабочую область
call SetPixe ;вызов функции


 
Miwa ©   (2002-06-07 11:42) [11]

Да кстати, а фрагмент то описан в функции обработки сообщений окна.


 
Big Daddy ©   (2002-06-07 13:11) [12]

Не, через время фиксировать координаты не надо. Надо всё плавно. Т.е. чтобы была возможность воспроизвести. Ну что-то типа рекордера. Записал координаты в файл, а потом воспроизвёл. Вот такой код не можете написать? (сохранил, воспроизвёл)
Очень надо.


 
Kaban   (2002-06-07 13:19) [13]

Ну допустим сдвинулся ты из (x,y) в (x",y") по какой-то кривой
в файл записались только значения (x,y) и (x",y"). При воспроизведении передвигай курсор не сразу из (x,y) в (x",y").
А постепенно по прямой. Разница между настоящим передвижением и воспроизведением не должна быть слишком велика.


 
Big Daddy ©   (2002-06-07 13:23) [14]

Я не очень понимаю. Можно код?


 
Kaban   (2002-06-07 13:32) [15]

Ну еще и код писать

Давай навскидку
допустим сдвинулся ты из (x,y) в (x",y")
Смещение по оси OX x"-x, по оси OY y"-y
Будем двигаться в три приема сначала в точку
(x + 1/3(x"-x), y + 1/3(y"-y) )
(x + 2/3(x"-x), y + 2/3(y"-y) )
(x + (x"-x), y + (y"-y) ) = (x",y")
Можно не втри приема можно больше, дергаться все равно будет.
Чтобы избежать этого нужно вычислять значение следующей точки с помощью тригонометрических функций. Наверное. Вообщем сам думай.


 
Big Daddy ©   (2002-06-07 13:36) [16]

Я всё равно не понял. У меня с математикой не очень. Если кто-нить даст код, буду благодарен!!


 
AFROLOV ©   (2002-06-07 13:45) [17]

Делать можно так.
1. Пишем координаты курсора в буфер
2. когда буфер заполняется в отдельном потоке записываем его в файл. Пока файл записывается пишем в новый буфер. Новый буфер так же можно делать в отдельном потоке (подготавливать его и т.д.).


 
Big Daddy ©   (2002-06-07 13:47) [18]

Но мне надо сделать рекордер.
Скажите кто-нить код pliz


 
Big Daddy ©   (2002-06-07 13:59) [19]

Ну, если не жалко, дайте код.
Просто надо очень!


 
Kaban   (2002-06-07 14:01) [20]

Да никто просто так не будет писать тебе код. Ты хоть попробуй сделать то, что тебе предложили. Может тебе пока рано за такие задачи браться.


 
Big Daddy ©   (2002-06-07 14:04) [21]

Вот именно что рано. Но брата попросили написать в школу такую прогу. А он тоже ещё зелен в программировании. Поэтому и прошу код. Но видно и вравду просто так никто не даст :-((


 
Kaban   (2002-06-07 14:06) [22]

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


 
Big Daddy ©   (2002-06-07 14:07) [23]

Ну извини тогда, что отнял время зря!


 
JC ©   (2002-06-07 14:18) [24]

Это конечно не в файл но дальше допишешь:

procedure TForm1.Timer1Timer(Sender: TObject);
var
M:TMouse;
TP:TPoint;
X1,Y1:integer;
begin
M:=TMouse.Create();
TP:=M.CursorPos;
Label1.Caption:="X:"+inttostr(Tp.x);
Label2.Caption:="Y:"+inttostr(Tp.y);
end;


и по-моему в начале перед implementation:
function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer; stdcall;
external "KERNEL32.DLL";

ставишь по меньше Timer1.Interval и что-то похожее


 
Big Daddy ©   (2002-06-07 14:25) [25]

Thanks.
А функция RegisterServiceProcess под XP не пашет


 
JC ©   (2002-06-07 14:36) [26]

Честно.. не знаю, может и пашет?


 
Big Daddy ©   (2002-06-07 14:38) [27]

JC, а вот код, что ты дал, он чё делает?


 
Kaban   (2002-06-07 14:42) [28]

Да нафига вам вообще сдалась функция RegisterServiceProcess
Забудьте про нее.
2 Big Daddy
Если ты не понимаешь, что делает представленный код, то тебе действительно рановато заниматься программированием.


 
JC ©   (2002-06-07 14:49) [29]

Узнаёт где находится мышь на экране и записывает результаты в Caption двух Label"ов координату X и Y в Label1.Caption и Label2.Caption соответствено:
получается что-то вида
X: 130
Y: 480
для этого надо накидать на форму Timer1, Label1 и Label2.


 
Big Daddy ©   (2002-06-08 09:32) [30]

А как потом воспроизвести?
Или, если кто-то знает, можно где-то достать исходники рекордера мышки?(запись/воспроизведение)


 
Big Daddy ©   (2002-06-08 12:20) [31]

^^^^^^^??


 
JC ©   (2002-06-08 13:28) [32]

> А как потом воспроизвести?

SetCursorPos(integer, integer);


 
Big Daddy ©   (2002-06-08 15:11) [33]

Ну это я знаю. Я имею в виду из списка file.txt. По порядку.
Чтобы плавно было?


 
MaximatorVeter ©   (2002-06-08 15:31) [34]


> И вот что вышло в результ-файле:
>
> 3, 40
> 19, 44


В данном случае вместо 2-х точек у тебя будет max(19-3,44-40)+1=17 точек. Придумай как их найти (например,методом наименьших квадратов можно получить линейную функцию).


 
Big Daddy ©   (2002-06-08 15:37) [35]

Может приведёте код. А то мне ещё учиться и учиться. Я не хороший знаток программирования. Или, если есть, исходник рекордера мышки


 
MaximatorVeter ©   (2002-06-08 15:58) [36]

Цикл от 1 до max(19-3,44-40)
1. Координата, которая дала больший прирост будет всегда увеличиваться на 1.
2. Другая координата будет увеличиваться только на каждый 4-ый проход цикла ( Round((19-3)/(44-40))=4 ).


 
Big Daddy ©   (2002-06-08 16:00) [37]

Да я в математике и программировании не сильно понимаю. Пожалуйста, если не трудно, дайте код.


 
MaximatorVeter ©   (2002-06-08 16:08) [38]

$10 за интерполяцию.
$30 за всю пограмму.


 
Big Daddy ©   (2002-06-08 16:10) [39]

Извините, но нет денег!
Извините, что отнял время!


 
MaximatorVeter ©   (2002-06-08 16:14) [40]

Да сядь и напиши ты эту программу, главное начать!


 
Big Daddy ©   (2002-06-08 16:20) [41]

Да понимаете, это не мне надо, а брат попросил помочь. Ему нужно написать программу в школу на информатику. А он обратился за помощью ко мне. А я то сам и программировать толком не умею. Вот что теперь делать не знаю. К кому обратиться...


 
Big Daddy ©   (2002-06-08 16:41) [42]

Вот такая вот ситуация. Но всё равно спасибо, что пытались мне объяснить принцип работы!


 
MBo ©   (2002-06-08 17:00) [43]

дел-то на 15 минут


TForm1 = class(TForm)
start: TButton;
replay: TButton;
stop: TButton;
Memo1: TMemo;
view: TButton;
save: TButton;
Button2: TButton;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
list:=tlist.create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
list.free;
end;

procedure TForm1.startClick(Sender: TObject);
begin
list.Clear;
rec:=true;
end;


procedure TForm1.stopClick(Sender: TObject);
begin
rec:=false;
end;

procedure TForm1.viewClick(Sender: TObject);
var i:integer;
begin
memo1.clear;
if not rec then
for i:=0 to list.count-1 do
memo1.lines.add(inttostr(integer(list[i]) and $3FF)+
#9+inttostr( (integer(list[i]) shr 10) and $3FF)+
#9+inttostr(integer(list[i]) shr 16));
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var ct:cardinal;
begin
if rec then begin
if list.count<>0 then
ct:=((gettickcount-t) shr 4 ) shl 20
else ct:=0;
list.add(pointer(x or (y shl 10) or ct ));
t:=gettickcount;
caption:=inttostr(list.count);
end;

end;

procedure TForm1.replayClick(Sender: TObject);
var i,x,y,tt:integer;
p,pp:tpoint;
begin
if not rec then begin
getcursorpos(pp);
for i:=0 to list.count-1 do begin
x:=integer(list[i]) and $3FF;
y:=(integer(list[i]) shr 10) and $3FF;
tt:=integer(list[i]) shr 16;
p:=point(x,y);
p:=clienttoscreen(p);
setcursorpos(p.x,p.y);
sleep(tt);
end;
setcursorpos(pp.x,pp.y);
end;
end;

procedure TForm1.saveClick(Sender: TObject);
var f:file of integer;
i,j:integer;
begin
if (not rec) and (list.count>0) then begin
assignfile(f,"c:\mov.dat");
rewrite(f);
write(f,list.count);
for i:=0 to list.count-1 do begin
j:=integer(list[i]);
write(f,j);
end;
closefile(f);
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var f:file of integer;
i,j,l:integer;
begin
if (not rec) then begin
assignfile(f,"c:\mov.dat");
reset(f);
read(f,l);
list.clear;
list.Capacity:=l;
for i:=0 to l-1 do begin
read(f,j);
list.add(pointer(j));
end;
closefile(f);
end;
end;


 
Big Daddy ©   (2002-06-08 17:04) [44]

MBo, спасибо!
Можно сказать, аттестат брату спас!
Ещё раз спасибо!


 
MBo ©   (2002-06-08 17:08) [45]

update Pack ;)

procedure TForm1.viewClick(Sender: TObject);
var i:integer;
begin
memo1.clear;
if not rec then
for i:=0 to list.count-1 do
memo1.lines.add(inttostr(integer(list[i]) and $3FF)+
#9+inttostr( (integer(list[i]) shr 10) and $3FF)+
#9+inttostr((integer(list[i]) shr 20) shl 4));
end;

procedure TForm1.replayClick(Sender: TObject);
var i,x,y,tt:integer;
p,pp:tpoint;
begin
if not rec then begin
getcursorpos(pp);
for i:=0 to list.count-1 do begin
x:=integer(list[i]) and $3FF;
y:=(integer(list[i]) shr 10) and $3FF;
tt:=(integer(list[i]) shr 20) shl 4;
p:=point(x,y);
p:=clienttoscreen(p);
setcursorpos(p.x,p.y);
sleep(tt);
end;
setcursorpos(pp.x,pp.y);
end;
end;


 
Денис Рачдченко   (2002-06-09 08:33) [46]

GetCursorPos()



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

Текущий архив: 2002.06.20;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.016 c
3-64981
BoBka
2002-05-28 08:30
2002.06.20
DBISAM Database System Utility


14-65248
Aleksey Kononov
2002-05-17 08:58
2002.06.20
Рассылка электронных писем


7-65256
vet
2002-03-21 11:39
2002.06.20
Мастера!!!!!!! Пожалуйста!!!!! (работа с модемом в voice-режиме)


3-64986
Ulugbek
2002-05-29 09:28
2002.06.20
Немогу определить настройки филтера


8-65186
APTEMKA
2002-02-06 16:56
2002.06.20
Помогите пожалуста с DelphiX