Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перемещение TImage по форме [D7, D2005, XP]


Страницы:   1 2

zloi ©   (2008-12-13 10:45:00) 

Добрый день! Передо мной встала задачи прокручивания gif изображений, например у меня есть 20 gif картинок, и мне нужно чтобы они постоянно перемещались по краю формы, например от верхней границы до нижней покругу , чтобы получилось как галерея. Вот у меня возникает вопрос как это лучше реализовать.


Johnmen   (2008-12-13 22:59:00) [21]


> Не копируйте этот код!)

А зачем он здесь?


{RASkov}   (2008-12-13 22:49:00) [22]

Ой, на скорую руку накидал.... ошибок мильён.... нет контроля ошибок.... но примерно можно задуматься об алгоритме:
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ExtCtrls, StdCtrls, Jpeg;

type
 TPics = array of TGraphic;

 TMyAniPictures = class
 private
   Pics: TPics;
   Tmr: TTimer;
   FParent: TWinControl;
   FFirstPict: Integer;
   CnvParent: TCanvas;
   procedure SetAnimate(const Value: Boolean);
   procedure SetParent(const Value: TWinControl);
   function GetAnimate: Boolean;
   procedure SetInterval(const Value: Integer);
   function GetInterval: Integer;
   procedure SetFirstPict(const Value: Integer);
   function GetCount: Integer;
 protected
   procedure AnimatePics(Sender: TObject);
 public
   constructor Create;
   destructor Destroy; override;
   procedure AddPic(AGr: TGraphic);
   property Animate: Boolean read GetAnimate write SetAnimate;
   property Interval: Integer read GetInterval write SetInterval;
   property Parent: TWinControl read FParent write SetParent;
   property Count: Integer read GetCount;
   property FirstPict: Integer read FFirstPict write SetFirstPict;
 end;

 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var Form1: TForm1;

implementation
{$R *.dfm}
{ TMyAniPictures }
constructor TMyAniPictures.Create;
begin
 Tmr:=TTimer.Create(nil);
 Tmr.Enabled:=False;
 Tmr.OnTimer:=AnimatePics;
 FirstPict:=0;
end;

destructor TMyAniPictures.Destroy;
var N: Integer;
begin
 Tmr.Free;
 for N:= Low(Pics) to High(Pics) do Pics[N].Free;
 Pics:=nil;
 inherited;
end;

function TMyAniPictures.GetCount: Integer;
begin
 Result:=Length(Pics);
end;

procedure TMyAniPictures.AddPic(AGr: TGraphic);
begin
 if AGr <> nil then begin
   SetLength(Pics, Count+1);
   Pics[Count-1]:=TGraphicClass(AGr.ClassType).Create;
   Pics[Count-1].Assign(Agr);
 end;
end;

procedure TMyAniPictures.SetAnimate(const Value: Boolean);
begin
 Tmr.Enabled:=Value and Assigned(Parent) and (Count>0);
end;

function TMyAniPictures.GetAnimate: Boolean;
begin
 Result:=Tmr.Enabled;
end;

procedure TMyAniPictures.SetParent(const Value: TWinControl);
begin
 FParent := Value;
 if not Assigned(CnvParent) then CnvParent:=TCanvas.Create;
 CnvParent.Handle:=GetDC(Value.Handle);
end;

procedure TMyAniPictures.SetInterval(const Value: Integer);
begin
 Tmr.Interval := Value;
end;

function TMyAniPictures.GetInterval: Integer;
begin
 Result:=Tmr.Interval;
end;

procedure TMyAniPictures.SetFirstPict(const Value: Integer);
begin
 FFirstPict := Value;
end;

procedure TMyAniPictures.AnimatePics(Sender: TObject);
var N, Y: Integer;
begin
 Y:=10; N:=FFirstPict;
 while Y<CnvParent.ClipRect.Bottom do begin
  CnvParent.Draw(10, Y, Pics[N]);
  Y:=Y+Pics[N].Height; Inc(N);
  if N>=Count then N:=0;
 end;
 INC(FFirstPict);
 if FFirstPict>=Count then FFirstPict:=0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var B: TBitmap; J: TJpegImage;
begin
 B:=TBitmap.Create;
 J:=TJPEGImage.Create;
 B.LoadFromFile('1.bmp');
 with TMyAniPictures.Create do begin
  AddPic(B);
  B.LoadFromFile('2.bmp');
  AddPic(B);
  B.LoadFromFile('3.bmp');
  AddPic(B);
  J.LoadFromFile('4.jpg');
  AddPic(J);
  Parent:=Self;
  Animate:=True;
  Interval:=200;
 end;
 B.Free;
 J.Free;
end;

end.

Не копируйте этот код!)


Anatoly Podgoretsky   (2008-12-13 22:41:00) [23]

> zloi  (13.12.2008 22:38:10)  [10]

Здесь нет вызова конструктора.


zloi   (2008-12-13 22:38:00) [24]

хм.. а я всю жысть думал что img:TImage;создаю объект а потом img.create(self);инициализирую его родным конструктором


Anatoly Podgoretsky   (2008-12-13 22:37:00) [25]

> zloi  (13.12.2008 22:12:07)  [7]

Нет, ты лишь переинициализировал.


{RASkov}   (2008-12-13 22:17:00) [26]

> [7] zloi   (13.12.08 22:12)
> я разве не создал объекта класса??

Нет, не создал...
Ты первый раз что ли замужем? :)


zloi   (2008-12-13 22:12:00) [27]


> > я пишу img.create(self); это разве не создаю обьякт класса
> TImage ??Типа, я тупой, подскажите основы?

а в чем же я сдесь, простите, не прав?!?
написав
var img:TImage;
img.create(self);

я разве не создал объекта класса??


Johnmen   (2008-12-13 20:29:00) [28]


> я пишу img.create(self); это разве не создаю обьякт класса TImage ??

Типа, я тупой, подскажите основы?


zloi   (2008-12-13 20:20:00) [29]


> > Imgs[i].create(self); // создаю сами картинки ты заблуждаешься.
> ... ничего ты тут не создаешь. Создание это вызов конструктора
> у класса, а не у объекта(не существующего)...

хм.. вот если у меня есть
var img:TImage;
и я пишу img.create(self); это разве не создаю обьякт класса TImage ??
про Low и high спасибо!!
картинки собираюсь двигать вот так в этой наскоряк сделанной флешке
http://dl.getdropbox.com/u/406454/imgs.swf
Imgs[i].Parent:=Self; - когда вот так Parenta указываю все равно не помогает


{RASkov}   (2008-12-13 19:30:00) [30]

На словах напиши что ли что должно получится-то... я что-то никак не соображу как будут двигатся картинки...
А панель - это лишнее. Зачем она вообще? твои картинки будут двигаться по родителю, который и так уже будет ВинКонтрол
Т.е. для твоих картинок, и если уж надумал это классом сделать, достаточно свойство в котором будешь указывать тот контейнер по которому будут бегать картинки....


{RASkov}   (2008-12-13 19:24:00) [31]

> я не знаю как им указать кто у них Parent

Все так же:
Imgs[i].Parent:=Self;
А вот тут:

> Imgs[i].create(self); // создаю сами картинки

ты заблуждаешься.... ничего ты тут не создаешь. Создание это вызов конструктора у класса, а не у объекта(не существующего)...

И границы цикла не верно делаешь....
Для перебора элементов массива лучше пользоваться функциями Low и High....
т.е. for i:=Low(Imgs) to High(Imgs) do...

Пока этот вариант 50/50  - т.е. опять инфы мало что бы сказать верный он или нет.


zloi   (2008-12-13 19:17:00) [32]

Предлогаю: пытался создать класс от TPanel и создать на нем несколько элементиков TImage

.....
TMoveImg = class(TPanel)
Imgs:array of TImage;// создаю массивчик картинок которые буду крутить
.....
.....
constructor TMoveImg.create(AOwner: TComponent);
begin
inherited Create(AOwner);
SetLength(Imgs,count);
for i:=1 to count do
  Imgs[i].create(self); // создаю сами картинки и тут же их буду загружать из файликов
end;

ну и потом планируется функция двиганья картинок этих.
но при таком варианте картинки создаются но на моей панели не отображаются, а все потому что я не знаю как им указать кто у них Parent. сама панелька на форме отображается


{RASkov}   (2008-12-13 14:09:00) [33]

> [0] zloi   (13.12.08 10:45)
> Вот у меня возникает вопрос как это лучше реализовать.

Предлогай варианты, выберем лучший.
А чтобы я прдложил вариант - мало инфы.... сорри...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо