Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2007, 12:24   #1
Юра.
Новичок
Джуниор
 
Регистрация: 30.07.2007
Сообщений: 2
По умолчанию Проблема с рисованием прямоугольника

Задача: Создать движение прямоугольника.
Что сделал: Реализовал движение очень просто: стирание и рисование в новых координатах, однако при таком способе рисования происходит моргание изображения.
Вопрос: Как от него избавиться?
Юра. вне форума Ответить с цитированием
Старый 30.07.2007, 12:33   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Задача: Создать движение прямоугольника.
Пробуй так:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
procedure FormPaint(Sender: TObject);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;

var ax,ay:integer;
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.Rectangle(ax-50,ay-50,ax+50,ay+50);
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
ax:=x;ay:=y;Repaint;
end;

end.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.07.2007, 13:17   #3
Юра.
Новичок
Джуниор
 
Регистрация: 30.07.2007
Сообщений: 2
По умолчанию

Все равно тоже самое.
Юра. вне форума Ответить с цитированием
Старый 30.07.2007, 14:10   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну не знаю. У меня работает без мерцаний. Ну попробуй что-ли возьми кинь на форму Shape, выставленную в rectangle и меняй его Top и Left...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.07.2007, 17:02   #5
mrandrey
Форумчанин
 
Регистрация: 30.03.2007
Сообщений: 124
По умолчанию

procedure TForm1.FormPaint(Sender: TObject);
var p:tpaintstructure;
begin
beginpaint(p);
Canvas.Rectangle(ax-50,ay-50,ax+50,ay+50);
endpaint(p);
end;

Может помочь, если нет создай битмап, и рисуй в нем, а затем выводи его на канву
Тут без 100г не розберешся.....
Спасибо не нужно, а на весы слева кликнуть не помешает!!!
mrandrey вне форума Ответить с цитированием
Старый 30.07.2007, 17:20   #6
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

На чём рисуется, чем рисуется, по таймеру/нет, как стирается? Код в студию!
пыщь
JTG вне форума Ответить с цитированием
Старый 31.07.2007, 00:11   #7
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Проще всего DoubleBuffered:=true того на чем рисуешь. Не поможет рисуй в буфере а потом только на экран. Не написал ничего, на чем, как? Мы что догадываться должны?
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 31.07.2007, 09:28   #8
Aleksandr
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 511
По умолчанию

Посмотри вот этот код
Код:
var
  Form1: TForm1;
  x,y: integer; // координаты прямоугольника
implementation
{$R *.DFM}
procedure kub(x,y: integer;color: TColor);
const
  dx = 5;
  dy = 5;
var
  buf: TColor;
begin
  with form1.canvas do
  begin
    buf:=pen.Color;   // сохраним текущий цвет
    pen.Color:=color; // установим нужный цвет
    // рисуем ...
    MoveTo(x,y);
    LineTo(x,y-10*dy);
    LineTo(x+20*dx,y-10*dy);
    LineTo(x+20*dx,y-10*dy);
    LineTo(x+20*dx,y-10*dy);
    LineTo(x+20*dx,y);
    LineTo(x,y);
    pen.Color:=buf; // восстановим старый цвет карандаша
  end;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
   kub(x,y,form1.color); // стереть рисунок
   if x < Form1.ClientWidth
      then x := x+5
      else begin
        x := 0;
        y := Random(50) + 100;
      end;
  kub(x,y,clWhite);     // нарисовать в новой точке
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
     x:=0;
     y:=100;
     Timer1.Interval := 50;
end;
Aleksandr вне форума Ответить с цитированием
Старый 31.07.2007, 17:48   #9
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Вообще то это не мерцание а ступенчатость передвижения. С мерцанием ты столкнешься позже когда изображения будешь перемещать.

if x < Form1.ClientWidth
then x := x+2

Timer1.Interval:=20;

Так лучше?

P.S. Строка
LineTo(x+20*dx,y-10*dy); повторяется 3 раза, это так надо ?
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 31.07.2007 в 17:51.
mutabor вне форума Ответить с цитированием
Старый 31.07.2007, 18:33   #10
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Хе, спрашивал Юра. а код выложил Aleksandr С кубом там и правда косяк
пыщь
JTG вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с dll( DM_bite Помощь студентам 10 31.07.2008 16:05
проблема с *.chm FAiver Свободное общение 5 28.09.2007 21:01
Помогите с рисованием на Delphi, компонент paintbox Jose Общие вопросы Delphi 10 01.02.2007 14:18