![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перемещение TImage по форме [D7, D2005, XP]
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)
> Вот у меня возникает вопрос как это лучше реализовать.
Предлогай варианты, выберем лучший.
А чтобы я прдложил вариант - мало инфы.... сорри...