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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.02.2012, 10:52   #1
RomanRens
 
Регистрация: 26.12.2010
Сообщений: 5
Восклицание Движение image по форме!

Как сделать НЕПРЕРЫВНОЕ движение рисунка по форме по горизонтали справа налево, чтобы часть рисунка, которая уже скрыта за правым полем тут же всплывала с левого поля формы и так далее. Это что-то вроде имитации ЭКГ- выбираем один фрагмент и циклично двигаем его по всей форме. Начал было так, но где-то ошибка

Код:
var
  Background, bitmap, Buf : TBitMap;
  BackRct : TRect;
  BufRct: Trect;

  x,y:integer;
  W,H: integer;

procedure TForm1.FormActivate(Sender: TObject);
begin
  form1.DoubleBuffered:=true;
  Background := TBitmap.Create;
  bitmap := TBitmap.Create;
  Buf := TBitmap.Create;
  Background.LoadFromFile('sea.bmp'); //загружаем фон
  Form1.Image1.canvas.Draw(0,0,Background);
  bitmap.LoadFromFile('ship.bmp');      //загружаем рисунок, к.т. движется
  bitmap.Transparent := True;
  bitmap.TransParentColor := bitmap.canvas.pixels[1,1];
  W:= bitmap.Width;
  H:= bitmap.Height;
  Buf.Width:= W;
  Buf.Height:=H;
  Buf.Palette:=Background.Palette;
  Buf.Canvas.CopyMode:=cmSrcCopy;
  BufRct:=Bounds(0,0,W,H);
  x := W+bitmap.Width;
  y := 50;
  BackRct:=Bounds(x,y,W,H);
  Buf.Canvas.CopyRect(BufRct,Background.Canvas,BackRct);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
     {Form1.image1.canvas.Draw(x,y,Buf);}

     Dec(x);
     if x < -bitmap.Width then x := 0;
     {Invalidate;}

     BackRct:=Bounds(x,y,W,H);
     Buf.Canvas.CopyRect(BufRct,Background.Canvas,BackRct);
     Form1.image1.Canvas.Draw(x, y, bitmap);
     Form1.image1.Canvas.Draw(x+bitmap.Width, y, bitmap);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Background.Free;
 bitmap.Free;
 Buf.Free;
end;
From Stilet: Код оформлять нужно по правилам.

Последний раз редактировалось Stilet; 24.02.2012 в 12:10.
RomanRens вне форума Ответить с цитированием
Старый 23.02.2012, 14:01   #2
kangreon
Форумчанин
 
Аватар для kangreon
 
Регистрация: 03.04.2009
Сообщений: 305
По умолчанию

Для оформления кода используйте тег [ code ] (#)

Код:
type
  TForm1 = class(TForm)
    Button1: TButton;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    BitMap: TBitmap;
    x: Integer;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  Open: TOpenDialog;
begin
  Open := TOpenDialog.Create(Self);
  if Open.Execute then
  begin
    BitMap := TBitmap.Create;
    BitMap.LoadFromFile(Open.FileName);
    Timer1.Enabled := True;
    Timer1.Interval := 20;
    x := 0;
  end;
  Open.Free;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  w, l: Integer;
begin
  if x > ClientWidth then
    x := 0;
  if x < 0 then
    x := ClientWidth;

  Canvas.FillRect(ClientRect);
  BitBlt(Canvas.Handle, X, 0, BitMap.Width, BitMap.Height,
      BitMap.Canvas.Handle, 0, 0, SRCCOPY);

  w := x + BitMap.Width;
  if w > ClientWidth then
  begin
    w := w - ClientWidth;
    BitBlt(Canvas.Handle, 0, 0, w, BitMap.Height,
        BitMap.Canvas.Handle, BitMap.Width - w, 0, SRCCOPY);
  end;

  Dec(x, 5);
end;
Напровление и скорость движения картинки зависит от увеличения либо уменьшения переменной x.
Код:
Dec(x, 5);
либо
Код:
Inc(x, 5);
kangreon вне форума Ответить с цитированием
Старый 23.02.2012, 19:29   #3
demigod82
Пользователь
 
Регистрация: 16.01.2012
Сообщений: 35
По умолчанию

Как то у вас всё неграмотно в коде оформлено. Все переменные глобальные. Какие то ненужные операции с координатами.
demigod82 вне форума Ответить с цитированием
Старый 24.02.2012, 10:10   #4
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

1. "Разрезать" компонент Image не почучится, поэтому надо рисовать на канве.
2. Рисуем на Bitmap-е, а потом по четкому алгоритму копируем определенные части в опр. места
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Движение разных Image (не могу продумать реализацию) Silly Student C++ Builder 10 26.10.2011 10:20
движение кнопки по форме Olya1985 Общие вопросы Delphi 10 22.08.2011 14:13
Рисование на форме. Движение точки. JDRaveN Общие вопросы Delphi 9 15.06.2009 18:03
Движение картинки по форме SaiLight Свободное общение 1 04.06.2009 04:28
Движение указателя по форме или Image nevo Компоненты Delphi 5 06.04.2008 21:00