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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перемещение формы с определенным шагом 
:(
    Опции темы
Elfebet
Дата 19.12.2006, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

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



вот как я делаю
Код

const Step:Integer=30;
var
  Form1: TForm1;
  sMove:Boolean;
  OldX, OldY, OldTop, OldLeft : Integer;

implementation
{$R *.dfm}

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  OldX := X;
  OldY := Y;
  OldTop:=Top;
  OldLeft:=Left;
  sMove := True;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  sMove:=False;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 sMove:=False;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
 if sMove then begin
   OldTop:=OldTop + Y - OldY;
   OldLeft:=OldLeft + X - OldX;
   if (Abs(OldLeft - Left)>Step) or (Abs(OldTop - Top)>Step) then begin
     Top:=OldTop;
     Left:=OldLeft;
   end;
 end;
end;

но при перемещении формы он начинает сильно блымать (типа сразу перемещается туда и сюда), как мне сделать чтоб оно перемещалось нормально с определенным шагом?


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
dimazu
Дата 19.12.2006, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: 4
Всего: 5



"Блымает"  smile , по-моему, из-за вот этого:
Код

 if (Abs(OldLeft - Left)>Step) or (Abs(OldTop - Top)>Step) then begin

Закомменть эту строку и проверь.

PM MAIL   Вверх
Elfebet
Дата 19.12.2006, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

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



Цитата

"Блымает"   , по-моему, из-за вот этого:
 if (Abs(OldLeft - Left)>Step) or (Abs(OldTop - Top)>Step) then begin
Закомменть эту строку и проверь.

так это строка специально сдесь стоит, суть в том чтобы форму перемещать с определенным шагом.


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
Sunvas
Дата 19.12.2006, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

Репутация: 28
Всего: 89



Все исправил. Все работает:
Код

const Step:Integer=30;
var    
  Form1: TForm1;
  sMove:Boolean=false;
  OldX, OldY, OldTop, OldLeft : integer;

implementation

{$R *.dfm}

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
  var p:tpoint;
begin
getcursorpos(p);
  OldX := p.X;
  OldY := p.Y;
  OldTop:=Top;
  OldLeft:=Left;
  sMove := True;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var p:tpoint;
begin
 if sMove then
 begin
  getcursorpos(p);
  if abs(p.x-oldx)>step then begin left:=oldleft+(p.x-oldx); oldleft:=left; oldx:=p.X end;
  if abs(p.Y-oldy)>step then begin top:=oldtop+(p.Y-oldy); oldtop:=top; oldy:=p.Y;  end;
 end;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
sMove:=False;
end;

Если хочешь знать в чем была твоя ошибка - стучи в асю.

Это сообщение отредактировал(а) Sunvas - 19.12.2006, 19:19


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
dimazu
Дата 19.12.2006, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: 4
Всего: 5



Я не проверял, но по логике тебе надо сравнивать
х и у, а не топ/боттом, типа вот так:
Код

 if sMove then
  begin
   OldTop:=OldTop + Y - OldY;
   OldLeft:=OldLeft + X - OldX;
   if (Abs(OldX - X)>Step) or (Abs(OldY - Y)>Step) then
   begin
     Top:=OldTop;
     Left:=OldLeft;
     Self.SetBounds (Self.Left, Self.Top , Self.Width,  Self.Height);
   end;
  end;

Но дрыгаться все равно будет, правда "блымать" перестанет.  smile 

ЗЫ.Пока писал, уже ответили  smile 

Это сообщение отредактировал(а) dimazu - 19.12.2006, 19:31
PM MAIL   Вверх
Sunvas
Дата 19.12.2006, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

Репутация: 28
Всего: 89



Цитата(dimazu @  19.12.2006,  19:29 Найти цитируемый пост)
Self.SetBounds (Self.Left, Self.Top , Self.Width,  Self.Height);

Смысл ставить эту функцию, после того, как мы присвоили left и top?
Из Делфи:
Код

procedure TControl.SetLeft(Value: Integer);
begin
  SetBounds(Value, FTop, FWidth, FHeight);
  Include(FScalingFlags, sfLeft);
end;



--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
dimazu
Дата 19.12.2006, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: 4
Всего: 5



Да, автоматом всегда ее пишу, я только на строку с ифом смотрел...
Надо бы вот так, но описка вышла  smile 

Код

if (Abs(OldX - X)>Step) or (Abs(OldY - Y)>Step) then
//   begin
//     Top:=OldTop;
 //    Left:=OldLeft;
     Self.SetBounds (OldLeft, OldTop , Self.Width,  Self.Height);
 //  end;


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.0491 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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