Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Мышка 
:(
    Опции темы
Kirgston
Дата 30.10.2008, 10:29 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: нет
Всего: 2



Уффффф извините пожалуйста наверно вас всех задолбал вопросами smile
Смотрите. Вот я хочу сделать мини программу которая бы переводила курсор по экрану. Пользователь задает начальные координаты и конечные. А программа уже сама крутит курсор. Вот сидел на досуге писал... ну не понимаю где я не так зделал ? о.О


Код


unit Unit8;

interface

uses
  Classes,sysutils,windows,forms,controls;

type
  Line = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
    function Line:integer;
    function x:integer;
    function y:integer;
  end;
var ymin,ymax,xmin,xmax,step,Line_y,line_x:integer;
implementation

uses Unit1;

{ Line }

procedure Line.Execute;
begin
Line_y:=strtoint(Form1.Ymin.Text);
Line_x:=strtoint(Form1.Xmin.Text);
ymax:=strtoint(Form1.ymax.Text);
repeat
repeat
for xmin:=strtoint(Form1.Xmin.Text) to ymax do
Line;
until (mouse.CursorPos.X=strtoint(Form1.xmax.Text)) and (mouse.CursorPos.Y=strtoint(Form1.ymax.Text));
SetCursorPos(strtoint(Form1.Xmin.Text),strtoint(Form1.Ymin.Text));
until Terminated;
end;

function Line.Line: integer;
begin
x;
y;
end;


function Line.x: integer;
begin
SetCursorPos(strtoint(Form1.Xmin.Text),strtoint(Form1.Ymin.Text));
//for xmin:=strtoint(Form1.Xmin.Text) to mouse.CursorPos.X=xmax do
repeat
SetCursorPos(Line_x,strtoint(Form1.Ymin.Text));
Line_X:=Line_x+1*step;
until Mouse.CursorPos.X=xmax;
end;

function Line.y: integer;
begin
Line_y:=Line_y+1*step;
SetCursorPos(strtoint(Form1.Xmin.Text),Line_y);
end;

end.



Я уже  smile  от этого всего... Вроде правильно а оно не хочет ...
PM MAIL   Вверх
Alix
Дата 30.10.2008, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 8
Всего: 23



Я от этого кода тоже ща кукукнусь  smile 
1. переменные не принадлежат классу потока, а зачем то сделаны глобальными
2. доступ к полям формы и глобальным объектам (Mouse) без синхронизации
3. циклы без Sleep или еще какой-нибудь задержки, пролетают мгновенно
4. курсор перемещается сначала по x, потом по y. Может так и было задумано, но человечнее как-то сразу по обоим координатам
5. в методе Y вообще нет цикла
6. ААА!! Я сразу не углядел, там в Line.Execute вообще ппц (пардон) какой то.


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
Kirgston
Дата 31.10.2008, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: нет
Всего: 2



1. Ну можно и в приват засунуть ;)
2. Опс а как это делается?  smile 
3. Угу поставимс ;)т.к. этот цикл грузит мой процессор на 50% 
4. Нет нет. Именно надо чтоб по Х прошло линию затем опустилось в низ и ещё раз прошло линию по Х smile
5. Он там не нужен ;) там просто надо переместить курсор на начальную координату Х, и здвинуть У на 10 или n единиц. 
6. Угу smile Сначала оно зацикливает вызов функции х & у. Потом зацикливает это все до того пока координата мышки не станет = той координате которую вписал пользователь. А потом перемещает всё обратно на начальные координаты и как сказать "наша песня хороша - начинай сначала" smile

Пожалуйста помогите сделать этот код просто работоспособным  smile а то я парюсь парюсь... а он не работает О_о хотя вроде я его нормально написал... :Р
PM MAIL   Вверх
Kirgston
Дата 31.10.2008, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: нет
Всего: 2



Только что зделал трассировку. В результате... у меня такое впечетление что 
Код

Line_X:=Line_x+1*step;

не работает. Почему так?  smile 
PM MAIL   Вверх
THandle
Дата 31.10.2008, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 50
Всего: 372



Kirgston, а ты не парься. А просто возьми и прочитай статью: http://forum.vingrad.ru/forum/topic-60076.html
Про синхронизацию особенно. Где к чему можно обращаться.

А так у тебя в Execute действительно 
Цитата(Alix @  30.10.2008,  13:56 Найти цитируемый пост)
ппц (пардон) какой то


PM   Вверх
Kirgston
Дата 31.10.2008, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: нет
Всего: 2



Оки ;) щас прочту. Правда её размеры меня несколько отпугивают  smile  но как говорят "без труда не выловишь и рыбку из пруда"
PM MAIL   Вверх
Kirgston
Дата 1.11.2008, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: нет
Всего: 2



Ребята. Ну вот я читаю статью... только тут синхронизации не надо... оно просто считывает данные из главной формы. Также если запущен один поток то все остальные либо считывают другие данные, либо вобще выключены. Ребята. Никто не поможет запустить данный поток? smile Вроде тут всё правильно 
Код


interface
uses
  Classes,sysutils,windows,forms,controls;
type
  Line = class(TThread)
  private

  protected
    procedure Execute; override;
    function Line:integer;
    function x:integer;
    function y:integer;
  end;

  var ymin,ymax,xmax,xmin,step,Line_y,line_x:integer;
implementation

uses Unit1;

{ Line }

procedure Line.Execute;
begin
Line_y:=strtoint(Form1.Ymin.Text);
Line_x:=strtoint(Form1.Xmin.Text);
ymax:=strtoint(Form1.ymax.Text);
Line_X:=strtoint(Form1.Xmin.Text);
repeat
repeat
for xmin:=strtoint(Form1.Xmin.Text) to ymax do
Line;
until (mouse.CursorPos.X=strtoint(Form1.xmax.Text)) and (mouse.CursorPos.Y=strtoint(Form1.ymax.Text));
SetCursorPos(strtoint(Form1.Xmin.Text),strtoint(Form1.Ymin.Text));
until Terminated;
end;
function Line.Line: integer;
begin
x;
Sleep(10);
y;
Sleep(10);
end;

function Line.x: integer;
begin
SetCursorPos(strtoint(Form1.Xmin.Text),strtoint(Form1.Ymin.Text));
//for xmin:=strtoint(Form1.Xmin.Text) to mouse.CursorPos.X=xmax do
repeat
Line_X:=Line_x+1*step;
SetCursorPos(Line_x,strtoint(Form1.Ymin.Text));
Sleep(10);
until Mouse.CursorPos.X=xmax;
end;

function Line.y: integer;
begin
Line_y:=Line_y+1*step;
SetCursorPos(strtoint(Form1.Xmin.Text),Line_y);
Sleep(10);
end;
end.

Но мышка устанавливается в начальные координаты и не движется никуда... :(  smile 
PM MAIL   Вверх
Alix
Дата 1.11.2008, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 8
Всего: 23



Читай статью еще раз. Ты так и не вычитал там, что форма работает в главном потоке, а доступ к данным других потоков должен всегда осуществляться через синхронизацию. Переменные надо сделать приватными, а их инициализацию делать в конструкторе потока, который тебе надо написать.


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
Kirgston
Дата 1.11.2008, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: нет
Всего: 2



Нет я читал про это ;) просто смотрите. Синхронизация нужна для того когда главная форма работает с файлом\данными и т.д. а поток тоже пытается работать с тем же что и главная форма. Но зачем делать лишнюю работу по синхронизации когда она не нужна? Ведь в чем суть то. Только 1 поток может работать в данный момент (заложено в главной форме). Главная форма больше как напоминает просто...ээээ... ну... просто как бы интерфейс. Она ничего не делает. Только в тот или инной момент завершает один поток и грузит другой. Просто у меня такое впечетление что оно не может в потоке выполнить
Код

 Line_y:=Line_y+1*step;

Сменная обявлена внутри потока
PM MAIL   Вверх
THandle
Дата 1.11.2008, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 50
Всего: 372



Kirgston, и ты считаешь что вот так можно обращаться к форме из потока?
Код


procedure Line.Execute;
begin
Line_y:=strtoint(Form1.Ymin.Text);
Line_x:=strtoint(Form1.Xmin.Text);
ymax:=strtoint(Form1.ymax.Text);
Line_X:=strtoint(Form1.Xmin.Text);
repeat


Внимательно читай статью.
PM   Вверх
Kirgston
Дата 1.11.2008, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: нет
Всего: 2



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

Код

interface
uses
  Classes,sysutils,windows,forms,controls;
type
  Line = class(TThread)
  private

  protected
    procedure Execute; override;
    function Line:integer;
    function x:integer;
    function y:integer;
    procedure get;
  end;

  var oxmin,oymin,ymin,ymax,xmax,xmin,step,Line_y,line_x:integer;
implementation

uses Unit1;

{ Line }

procedure Line.Execute;
begin
Synchronize(get);

repeat
repeat
//for xmin:=strtoint(Form1.Xmin.Text) to ymax do
Line;
until (mouse.CursorPos.X=xmax) and (mouse.CursorPos.Y=ymax);
SetCursorPos(oxmin,oymin);
Line_x:=oxmin;
Line_y:=oymin;
until Terminated;
end;

procedure Line.get;
begin
oxmin:=strtoint(Form1.Xmin.Text);
oymin:=strtoint(Form1.Ymin.Text);
xmin:=strtoint(Form1.Xmin.Text);
ymin:=strtoint(Form1.Ymin.Text);
Line_y:=strtoint(Form1.Ymin.Text);
Line_x:=strtoint(Form1.Xmin.Text);
Line_x:=oxmin;
ymax:=strtoint(Form1.ymax.Text);
Line_X:=strtoint(Form1.Xmin.Text);
xmax:=strtoint(Form1.Xmax.Text);
end;

function Line.Line: integer;
begin
x;
Sleep(10);
y;
Sleep(10);
end;

function Line.x: integer;
begin
SetCursorPos(oxmin,oymin);
//for xmin:=strtoint(Form1.Xmin.Text) to mouse.CursorPos.X=xmax do
repeat
Line_X:=Line_x+1*step;
SetCursorPos(Line_x,ymin);
Sleep(10);
until Mouse.CursorPos.X=xmax;
Line_X:=oxmin;
end;

function Line.y: integer;
begin
Line_y:=Line_y+1*step;
SetCursorPos(oxmin,Line_y);
Sleep(10);
end;
end.

PM MAIL   Вверх
Alix
Дата 1.11.2008, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 8
Всего: 23



Так, давайте четко и ясно, что должен делать поток. Передвинуть курсор из одной точки в другую - это ясно. Как перемещать будем? То что не по диагонали это уже понятно.


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
Kirgston
Дата 1.11.2008, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: нет
Всего: 2



PM MAIL   Вверх
Alix
Дата 1.11.2008, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 8
Всего: 23



Хреновенькое качество, но по нему понял, что надо было сделать вот такое:
Код
unit MouseMover;

interface

uses
  Classes, Types {TPoint}, Windows, Math {Sign};

type
  TMouseMover = class(TThread)
  private
    FStartPoint : TPoint;
    FEndPoint   : TPoint;
    FStepX,
    FStepY      : integer;
    procedure SetStepY(const Value: integer);
    procedure SetStepX(const Value: integer);
  protected
    procedure Execute; override;
  public
    constructor Create(startPoint, endPoint : TPoint);
    property stepX : integer read FStepX write SetStepX;
    property stepY : integer read FStepY write SetStepY;
  end;

implementation

{ TMouseMover }

constructor TMouseMover.Create(startPoint, endPoint: TPoint);
begin
  inherited Create(true);
  FStartPoint := startPoint;
  FEndPoint   := endPoint;

  FStepX := 10;
  FStepY := 10;
end;

procedure TMouseMover.Execute;
var
  x,
  y : integer;

begin
  while not Terminated do
  begin
    y := FStartPoint.Y;

    while (Abs(FEndPoint.Y - y) > stepY) and (not Terminated) do
    begin
      x := FStartPoint.X;

      while (Abs(FEndPoint.X - x) > stepX) and (not Terminated) do
      begin
        SetCursorPos(x, y);
        inc(x, stepX * Sign(FEndPoint.X - FStartPoint.X));
        Sleep(100);  // тоже можно сделать параметром. а можно и не делать )
      end;

      SetCursorPos(x, y);
      inc(Y, FStepY * sign(FEndPoint.Y - FStartPoint.Y));
    end;
  end;
end;

procedure TMouseMover.SetStepX(const Value: integer);
begin
  if value <= 0 then exit;
  FStepX := Value;
end;

procedure TMouseMover.SetStepY(const Value: integer);
begin
  if value <= 0 then exit;
  FStepY := Value;
end;

end.
Реализация могла бы быть и несколько иной, я захотел так. Вот пример работы из модуля с формой:
Код
var
  thread : TMouseMover;
...

procedure TForm1.FormCreate(Sender: TObject);
begin
  thread := TMouseMover.Create(Point(100, 100), Point(600, 400));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  thread.Terminate;
  thread.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  thread.stepX := 40;
  thread.stepY := 60;
  thread.Resume;
end;
Написанные в коде stepX и stepY походу больше всего подходят к тому, что я видел на видео.


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
Kirgston
Дата 1.11.2008, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: нет
Всего: 2



Хм... оно подчёркивает СтипХ и У и орёт что оно не понимает что это.

Вот щас доработал чуток свой код. Вроде работает  smile 

Код

unit Unit8;
interface
uses
  Classes,sysutils,windows,forms,controls;
type
  Line = class(TThread)
  private

  protected
    procedure Execute; override;
    function Line:integer;
    function x:integer;
    function y:integer;
    procedure get;
  end;

  var oxmin,oymin,ymin,ymax,xmax,xmin,step,Line_y,line_x:integer;
implementation

uses Unit1;

{ Line }

procedure Line.Execute;
begin
Synchronize(get); //считываем данные

repeat
repeat
//for xmin:=strtoint(Form1.Xmin.Text) to ymax do
Line;//повторяем функцию линии до тех пор пока координаты курсора не будут = максимальным координатам которые ввел пользователь
until (mouse.CursorPos.X=xmax) and (mouse.CursorPos.Y=ymax);
SetCursorPos(oxmin,oymin);//после этого мы возвращаем координаты на начальное местоположение
Line_x:=oxmin;//и какбы делаем всё с начала... пока пользователь не подаст сигнал что надо остановится
Line_y:=oymin;
until Terminated;
end;

procedure Line.get;
begin
oxmin:=strtoint(Form1.Xmin.Text);//считываем данные. Они у нас будут какбы константой Х и У
oymin:=strtoint(Form1.Ymin.Text);
//xmin:=strtoint(Form1.Xmin.Text);
//ymin:=strtoint(Form1.Ymin.Text);
Line_y:=strtoint(Form1.Ymin.Text);//Тут данные которые будут изменятся. И по каким будет передвигатся мышка
Line_x:=strtoint(Form1.Xmin.Text);//аналогично
ymax:=strtoint(Form1.ymax.Text);//тут какбы данные константы. Тоисть максимальное число к которому доходит Х и У
xmax:=strtoint(Form1.Xmax.Text);
step:=strtoint(Form1.Step.Text);//Шаг
end;

function Line.Line: integer;//тут просто я соеденил 2 функции
begin
x;
Sleep(10);
y;
Sleep(10);
end;

function Line.x: integer;
begin
SetCursorPos(oxmin,oymin);//ставим курсор в место начальное место. Тоисть по начальным координатам
//for xmin:=strtoint(Form1.Xmin.Text) to mouse.CursorPos.X=xmax do
repeat
Line_X:=Line_x+1*step;//устанавливаем новую позицию курсора по Х
SetCursorPos(Line_x,Line_y);//собственно тут и ставим :)
Sleep(10);
until Mouse.CursorPos.X=xmax;//делаем до того времени пока позиция курсора на экране не будет = максимальной позиции Х
Line_X:=oxmin;//ставим Х опять на начальные координаты
end;

function Line.y: integer;
begin
Line_y:=Line_y+1*step;// тут всё так-же
SetCursorPos(oxmin,Line_y);//только тут мы ставим координаты курсора как изначально то что ввел пользователь по Х, и У мы уже сами высчитываем
Sleep(10);
end;
end.


Но я не понимаю почему оно грузит процессор на 50%? О.о ведь я поставил задержку приличную - 100 мс. А оно как с 10мс так и со 100 мс - 50%... Да и тут только не работает каретка перевода. Тоисть по достижению максимальных координат оно вместо того чтоб всё начать с начала оно дальше идёт  smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0631 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.