Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.01.25;
Скачать: CL | DM;

Вниз

Перемещение TImage по форме   Найти похожие ветки 

 
zloi   (2008-12-13 10:45) [0]

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


 
{RASkov} ©   (2008-12-13 14:09) [1]

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

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


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

Предлогаю: пытался создать класс от 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 19:24) [3]

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

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

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

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

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

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


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

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


 
zloi   (2008-12-13 20:20) [5]


> > 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 указываю все равно не помогает


 
Johnmen ©   (2008-12-13 20:29) [6]


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

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


 
zloi   (2008-12-13 22:12) [7]


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

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

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


 
{RASkov} ©   (2008-12-13 22:17) [8]

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

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


 
Anatoly Podgoretsky ©   (2008-12-13 22:37) [9]

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

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


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

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


 
Anatoly Podgoretsky ©   (2008-12-13 22:41) [11]

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

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


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

Ой, на скорую руку накидал.... ошибок мильён.... нет контроля ошибок.... но примерно можно задуматься об алгоритме:
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.

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


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


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

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


 
zloi   (2008-12-13 23:00) [14]

спасибо большое, это все надо обкурить и переварить


 
{RASkov} ©   (2008-12-13 23:03) [15]

> [13] Johnmen ©   (13.12.08 22:59)
> А зачем он здесь?

Чтобы:

> это все надо обкурить и переварить

:) Я же говорил в начале для чего он)


 
Johnmen ©   (2008-12-13 23:26) [16]


> {RASkov} ©   (13.12.08 23:03) [15]
> :) Я же говорил в начале для чего он)

Прошу прощения, не увидел...
Так зачем же?


 
{RASkov} ©   (2008-12-13 23:34) [17]

> [16] Johnmen ©   (13.12.08 23:26)

> но примерно можно задуматься об алгоритме:


А чем вызвано такое внимание и любопытство к моим последним словам в [12]? :)))
Можно копировать, я разрешаю :)
Только я знаю, что более опытный копировать не будет, а для менее опытных я и написал что бы не копировали)
Там может быть не код, а мысль в [12]..... вот что...


 
Johnmen ©   (2008-12-14 00:43) [18]


> более опытный копировать не будет,

>  для менее опытных я и написал что бы не копировали

:) так для более или для менее???


 
{RASkov} ©   (2008-12-14 01:11) [19]

> [18] Johnmen ©   (14.12.08 00:43)
> :) так для более или для менее???

Я же уже разрешил в [17])
Так что и те и другие могут с большим удовольствием скопировать тот код :)

Но будте осторожны, при копировании) могут вылезти погрешности, и у вас этот код будет работать не так как задумывалось :)
Для сокращения ошибок выделять код необходимо в брофзере Опера версии 9.xx обязательно мышкой А4Tech, а вставлять только с клавиатуры любой в принципе модели, но желательно с разъемом PS/2 на USBшных большие утечки кода возникают. Так же вставлять желательно в Ворд и уже им сохранять в текстовый файл, а потом уже в проводнике переименовать расширение в pas.... Желаю удачи! :)


 
Johnmen ©   (2008-12-14 01:31) [20]


> {RASkov} ©   (14.12.08 01:11) [19]

Так для копирования или чтобы задуматься об алгоритме?


 
{RASkov} ©   (2008-12-14 01:37) [21]

> [20] Johnmen ©   (14.12.08 01:31)

Перед копированием нужно не менее недели думать об алгоритме, и только потом можно копировать... если не расхочется)


 
Германн ©   (2008-12-14 01:57) [22]


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

Хм. Учебники не в моде. Примеры в стандартной поставке тоже. Дык на что ты расчитываешь в жизни далее?


 
zloi   (2008-12-14 15:48) [23]


> {RASkov} ©   (13.12.08 22:49) [12]
> Ой, на скорую руку накидал....

тут насколько я понял происходит рисование на канвасе, но как быть с гифками которые мне необходимо двигать? единственное что нашол это RxLib и компонент TRxGIFAnimator, и получается мне надо его двигать и этот метод не подойдет


 
Leonid Troyanovsky ©   (2008-12-14 16:55) [24]


> zloi   (14.12.08 15:48) [23]

> тут насколько я понял происходит рисование на канвасе, но
> как быть с гифками которые мне необходимо двигать?

Сказали ж:

> нужно не менее недели думать об алгоритме, и только потом
> можно копировать...

--
Regards, LVT.


 
{RASkov} ©   (2008-12-14 20:36) [25]

> [23] zloi   (14.12.08 15:48)

А ГИФы должны быть анимированные или статичные картинки?


 
zloi   (2008-12-14 21:09) [26]

анимированные, и даже больше того хочется загружать их из базы но этому я научился


 
{RASkov} ©   (2008-12-14 21:51) [27]

> [26] zloi   (14.12.08 21:09)

Если бы были статичискими, я бы предложил конвертировать их в более родной формат для делфи, например bmp или хотябы jpg.
А для анимированных предлогаю еще раз внимательно взглянуть на код [12] и "немного" его исправить....
Ведь принцип-то остается один и тот же.... сменится только внутренний контейнер хранения графических объектов и немного измениться метод вывода анимации т.е. метод AnimatePics.... т.е. не рисовать с координатами, а использовать вероятно Left и Top ГИФОбъектов из контенера....


 
zloi   (2008-12-15 08:37) [28]


>  сменится только внутренний контейнер хранения графических
> объектов и немного измениться метод вывода анимации т.е.
>  метод AnimatePics.... т.е. не рисовать с координатами,
> а использовать вероятно Left и Top ГИФОбъектов из контенера.
>

Pics[N].Left:=10;
 Pics[N].Height:=Y;
 Y:=Y+Pics[N].Height;

так и пытаюсь делать, вот потерялся в том надо ли мне
while Y<CnvParent.ClipRect.Bottom do begin, и как мне перерисовывать контейнер с моей гифкой.
и вот возникает вопрос зачем нам вот эта функция:
procedure TMyAniPictures.SetParent(const Value: TWinControl);
begin
FParent := Value;
if not Assigned(CnvParent) then CnvParent:=TCanvas.Create;
CnvParent.Handle:=GetDC(Value.Handle);
end;


 
{RASkov} ©   (2008-12-15 11:03) [29]

> Pics[N].Height:=Y;

не height а top

> надо ли мне
> while Y<CnvParent.ClipRect.Bottom do begin,

я думаю, что нужно. Чтобы не выводить "лишние" картинки или наоборот повторять их до самого низа, если их мало(не хватает всех на всю высоту родителя)

> и как мне перерисовывать контейнер с моей гифкой.

Контейнером я выше назвал динамический массив с TGraphics.... Тут у тебя будет динмассив с TRxGifAnimator или чем-то кто понимает анимированный гиф.... Ничего перерисовывать не нужно, тебе достаточно манипулировать с left, top, ну и Visible еще возможно нужно.... вместо visible можно сбрасывать у невидимых и назначать видимым (Pics[N].Parent:=nil и Pics[N].Parent:={F}Parent) где Pics: array of TGifAnimator;

> и вот возникает вопрос зачем нам вот эта функция:
> procedure TMyAniPictures.SetParent(const Value: TWinControl);

А как же, нужна для указания родителя для Элементов контейнера(т.е. самим TRxGifAnimator или иже с ним)
Создание Канвы конечно-же не нужно, но сам сеттер я думаю необходим, там можно проконтролировать при необходимости родителя....
Все, я тебе и так много уже понаписал, теперь твоя очередь, напиши свой новый класс и похвались его работой :)


 
{RASkov} ©   (2008-12-15 11:27) [30]

У меня есть вариант в голове: не перемещать TRxGifAnimator"ы, а менять ихи данные, где содержется анимация...
Помоему у TRxGifAnimator"е это TGifImage от TGraphics.... Сами элементы(TGifImage) хранить так же в дин массиве... сейчас нет Rx под руками что бы посмотреть, проверить....
Т.е. при смене размера вывести необходимое кол-во TRxGifAnimator"ов, а потом менять им этот самый ГифИмаге из массива по принцыпу выше...
Но.... но тут я не уверен сохранится ли анимация(т.е. № кадра при смене TGifImage) и возможно ли вообще так с ГифАниматором.... Вообщем пробуй...


 
{RASkov} ©   (2008-12-15 11:45) [31]

> Т.е. при смене размера

при смене размера родителя, тот который FParent....


 
zloi   (2008-12-15 12:23) [32]


> У меня есть вариант в голове: не перемещать TRxGifAnimator"ы,
>  а менять ихи данные, где содержется анимация...

а нельзя ли как-нибудь сделать чтобы у меня был один TRxGifAnimator а его TGIFImage я бы сделал из всех моих гифок но только один длиннючий и просто его уже перемещать внутри гифаниматора.


 
{RASkov} ©   (2008-12-15 12:31) [33]

> [32] zloi   (15.12.08 12:23)

Так будет гораздо сложнее.... имхо.
Тебе же картинку нужно "завернуть" в кольцо? Т.е. после последнего кадра идет первый, второй и т.д....
Может быть в твоем случае действительно проще сделать саму анимацию требуемую вида, а затем ее всего лишь поместить в ГифАниматор и всё.
Но тут тоже есть свои минусы.... так что...



Страницы: 1 вся ветка

Текущий архив: 2009.01.25;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.017 c
2-1229321648
SUN
2008-12-15 09:14
2009.01.25
Действия с датами


15-1228287788
@!!ex
2008-12-03 10:03
2009.01.25
Подскажите книгу по программированию в Mac OS X


15-1228374115
начинающий
2008-12-04 10:01
2009.01.25
USB на ТВ. Есть такое?


2-1228816761
Nameziz
2008-12-09 12:59
2009.01.25
Потоки


2-1229289922
smartleds
2008-12-15 00:25
2009.01.25
Подскажите плз как можно сделать область прокрутки TrackBar-oв