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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.005 c
1-65171
mifi
2002-06-08 00:16
2002.06.20
MyImage :Array


3-64953
Satrap
2002-05-27 18:05
2002.06.20
ликбез по ADO


6-65199
dymon
2002-04-11 10:28
2002.06.20
Как определить имя пользователя


1-65026
Igit
2002-06-07 20:29
2002.06.20
Почему не сохроняются в файл ничего после openpicturedialog


14-65252
Феликс
2002-05-16 00:37
2002.06.20
Бойцовский клуб. Still pumped from the using mouse...





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