Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.01.25;
Скачать: [xml.tar.bz2];

Вниз

Перемещение 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.011 c
3-1213691445
Ega23
2008-06-17 12:30
2009.01.25
Передача Null через параметры


4-1203283452
Galiaf
2008-02-18 00:24
2009.01.25
Перехват сообщений самодельным окном.


3-1213785828
zorik
2008-06-18 14:43
2009.01.25
Оптимизация запроса


2-1229021735
ivak
2008-12-11 21:55
2009.01.25
Как работать с компонентом на который я нажал


15-1227488263
Kerk
2008-11-24 03:57
2009.01.25
Скрип пластинки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский