Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.10.2013, 23:22
Andrey_Ryzhov Andrey_Ryzhov вне форума
Прохожий
 
Регистрация: 02.09.2013
Адрес: Новгородская обл. пгт Пролетарий
Сообщения: 10
Версия Delphi: Lazarus, ECDXE3
Репутация: 10
Печаль Управление объектом массива

И опять здравствуйте. Переехал тут на Lazarus, решил ощутить все прелести FreePascal. Есть проблема. Моя задача, создать n-ое количество компонентов TImage, и сделать так, что-бы они двигались после создания. Решил забацать массив, массив-то работает (пока создает только 1 TImage (ну это так пока и задумывается)), но как сделать так, что-бы созданный имейдж начал сдвигаться? Я знаю, как это сделать со статическим Image на форме, но не понимаю, как передать ему свойство left, когда он динамический. Определенно, думаю, без таймера никуда... но ... не получается...
На просторах паутины нашел множество примеров, пробовал, пробовал... - вспотел. Хотелось бы услышать мудрый совет.... Спасибо.
И, да... ещё.. есть 2 пустых таймера, один из них, наверно и должен двигать имейджи, а второй - зарезервирован на потом.

Собственно - кодец:

Код:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    Timer1: TTimer;
    Timer2: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

 const N= 1;
var
  Form1: TForm1;
  Img: array[1..N,1..N] of TImage;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
  var i,j: Integer;
    C: Integer;
begin
  for i := 1 to 1 do
    begin
      for j := 1 to 1 do
        begin
          Img[i,j] := TImage.Create(Self);
          Img[i,j].Parent := Self;
          Img[i,j].Left := i*100;
          Img[i,j].Top := j*80;
          Img[i,j].Width := 30;
          Img[i,j].Height := 30;
          Img[i,j].Picture.LoadFromFile(IntToStr(i)+'.bmp');
          Timer2.Enabled:= true;
      end;
        end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
end;

end.

Последний раз редактировалось Andrey_Ryzhov, 23.10.2013 в 23:24.
Ответить с цитированием
  #2  
Старый 24.10.2013, 02:36
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Да собсно можно так же, как и при создании, в цикле
Код:
  for i := 1 to 1 do
   for j := 1 to 1 do
        begin
          Img[i,j].Left := Img[i,j].Left +(-) 1;
          Img[i,j].Top := Img[i,j].Top -(+) 1;
        end;
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Andrey_Ryzhov (24.10.2013)
  #3  
Старый 24.10.2013, 20:41
Andrey_Ryzhov Andrey_Ryzhov вне форума
Прохожий
 
Регистрация: 02.09.2013
Адрес: Новгородская обл. пгт Пролетарий
Сообщения: 10
Версия Delphi: Lazarus, ECDXE3
Репутация: 10
По умолчанию

Да я было тоже так сделал, но дело в том, что при генерации изображения, оно должно двигаться до конца формы, если вешать на таймер, то либо вешать весь массив (что таки нежелательно, что-ж с ним будет тогда), либо как-то отдельно вешать именно эти события... но как??

А нет, все, теперь нормально! Просто у меня написано было - Img[i,j].Left:= LEFT+1; Забыл после присвоения Img массив объявить... просто первый раз с массивами объектов работаю... Что-то тупанул немного... На таймер применил внесенные изменения... Спасибо за ответ!

Возник ещё вопрос в догонку... Как привязать обработчик события Click? Вот движется этот Имейдж и если кликнуть на него, допустим появляется MessageDlg к примеру? Слышал что-то про свойство Tag, я как-то его использовал, но опять же со статическими элементами.

Нарыл в сети примеры и написал вот так:
Код:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Timer2: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure OnMyClick(Sender: TObject);
    //procedure Timer2Timer(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

const N= 1;
var
  Form1: TForm1;
  Img: array[1..N] of TImage;


implementation

{$R *.lfm}

{ TForm1 }


procedure TForm1.OnMyClick(Sender: TObject);
var k: Integer;
begin
  k := (Sender as TImage).Tag;
  case k of
    0..5: Close;
    6..9: ShowMessage('Тэг кэлемента: '+IntToStr(k));
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
  begin
    for i := 1 to 1 do
          begin
            Img[i] := TImage.Create(Self);
            Img[i].Parent := Self;
            Img[i].Tag := i;
            Img[i].Left := i*778;
            Img[i].Top := 80;
            Img[i].Width := 60;
            Img[i].Height := 60;
            Img[i].Left := Img[i].Left - 1;
            Img[i].Top := Img[i].Top - 1;
            Img[i].Picture.LoadFromFile(IntToStr(i)+'.bmp');
            Img[i].OnClick := OnMyClick;
            Timer2.Enabled:= true;
        end;
  end;

{procedure TForm1.Timer2Timer(Sender: TObject);
var i,j: Integer;
 begin
    for i := 1 to 1 do
      begin
        for j := 1 to 1 do
          begin
            Img[i,j].OnClick := ButtonClick;
          end;
  end;
 end;}
end.
                                               
Таймер 2 пока приглушил, соответственно циклов движения имейджей там нет (и в таймере код не тот) но сейчас не про это. Компилятор орет типо - unit1.pas(66,40) Error: Wrong number of parameters specified for call to "OnMyClick" на строку Img[i].OnClick := OnMyClick; , что не так, понять не могу??

Вообще БСОД какойто?! В Delphi XE3 все работает, в Лазарусе нет... всегда он мне не нравился...

Последний раз редактировалось M.A.D.M.A.N., 25.10.2013 в 21:23.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:51.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter