Форум: "Начинающим";
Текущий архив: 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.007 c