|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Управление объектом массива
И опять здравствуйте. Переехал тут на 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
|
||||
|
||||
Да собсно можно так же, как и при создании, в цикле
Код:
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
|
|||
|
|||
Да я было тоже так сделал, но дело в том, что при генерации изображения, оно должно двигаться до конца формы, если вешать на таймер, то либо вешать весь массив (что таки нежелательно, что-ж с ним будет тогда), либо как-то отдельно вешать именно эти события... но как??
А нет, все, теперь нормально! Просто у меня написано было - 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. Вообще БСОД какойто?! В Delphi XE3 все работает, в Лазарусе нет... всегда он мне не нравился... Последний раз редактировалось M.A.D.M.A.N., 25.10.2013 в 21:23. |