| Autor |
Beitrag |
oneP
      
Beiträge: 71
Win XP Professional
Turbo Delphi 2006
|
Verfasst: So 31.05.09 22:21
Hallo,
ich bins mal wieder...
uns war habe ich eine ganz simple Frage: ich habe in einem TImageList 4 Bilder und will sie alle paar millisekunden in einem Image aufrufen. Wie mach ich das? 
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mo 01.06.09 00:07
Wozu?
Bist du sicher, dass dies der richtige Weg ist? Was wir denn das?
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Raid
      
Beiträge: 16
Win XP Home, Win XP Prof., Win Vista
Delphi 2009 Arch.
|
Verfasst: Mo 01.06.09 03:53
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| var CurrentIndex: Integer = 0;
procedure TForm1.FormCreate(Sender: TObject); begin Image1.Picture.Bitmap := NIL; ImageList1.GetBitmap(0, Image1.Picture.Bitmap); Inc(CurrentIndex); end;
procedure TForm1.Timer1Timer(Sender: TObject); begin Image1.Picture.Bitmap := NIL; ImageList1.GetBitmap(CurrentIndex, Image1.Picture.Bitmap); Inc(CurrentIndex);
if CurrentIndex = 4 then CurrentIndex := 0; end; | So ungefähr?
|
|
ffgorcky
      
Beiträge: 573
WIN XP/2000 & 7Prof (Familie:Win95,Win98)
|
Verfasst: Mo 01.06.09 07:59
Wobei ich den CurrentIndex, solange er nur zum Befüllen benutzt wird, eher durch
ImageList1.Items.Count-1 (zur Ansprache des letzten), bzw. zu einer direkten Befüllung eines neuen dann ohne die '-1', also: ImageList1.Items.Count ersetzen würde.
Ich weiß nur leider nicht, was schneller ist - aber dadurch könntest Du die Variable CurrentIndex ja auch für was anderes nutzen, zum Beispiel eben nur für Deine Timer-Schaltung.
Und genauso könntest Du dann natürlich auch immer noch wieder ein paar mehr Items anhängen.
|
|
oneP 
      
Beiträge: 71
Win XP Professional
Turbo Delphi 2006
|
Verfasst: Mo 01.06.09 11:04
Danke Raid, es funktioniert.
Aber ich muss jetzt für mein Image 2 Timer benutzen. Eins, damit sich das Image über das Formular bewegt, und der Zweite, damit sich das Bild selbst bewegt (also die Bilder wechselt). Geht das nicht irgendwie anders? Eine Gif animation ist sehr aufwändig und funktioniert bei mir auch nicht und was ist mit einer bmp Animation? Kennt da jemand tools, wie man die herstellen kann?
|
|
Tropby
      
Beiträge: 71
Erhaltene Danke: 4
Vista, Win XP, Win 89
Turbo Delphi Ex.
|
Verfasst: Di 02.06.09 15:43
Hi,
ich hatte vor ein paar Tagen das gleiche Problem und wollte Bilder in eine Animation bringen.
Da ich selber jedoch nirgends fündig geworden bin wie ich das am besten machen kann und ich eigendlich auch keine lust hatte zu suchen  habe ich mir ein eigenes kleines Tool programmiert welches aus Bitmaps einen File erstellt in dem alle Bitmaps liegen.
Durch eine kleine Unit kann ich diese nun ohne großen rechenaufwand auf der Form animiert darstellen.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56:
| unit Unit1;
interface
uses , UnitAniBMP;
type TForm1 = class(TForm) Button1: TButton; OD: TOpenDialog; Image1: TImage; procedure Button1Click(Sender: TObject); private public procedure MyCallback(ID : Integer; P : Pointer); end;
var AniBMP1 : TAniBMP;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin if OD.Execute then begin AniBMP1 := TAniBMP.Create(); AniBMP1.Exit_Animate(); AniBMP1.LoadFromFile(OD.FileName);
AniBMP1.Start_Animate(MyCallback, CallbackID, Interval, Startframe, EndFrame); end; end;
procedure TForm1.MyCallback(ID : Integer; P : Pointer); var bmp : TBitmap; begin bmp := &P; BitBlt(Image1.Canvas.Handle, 0, 0, bmp.width, bmp.Height, bmp.Canvas.Handle, 0, 0, SRCCOPY); Image1.Repaint; end; end. |
Im Anhang ist das komplette Project zu finden mit 2 kleinen Testanimationen.
EDIT :
Anhang wurde entfernt. Die Unit ist nun hier zu finden : BMP (Bitmap) Animator
Zuletzt bearbeitet von Tropby am Di 02.06.09 22:55, insgesamt 2-mal bearbeitet
|
|
oneP 
      
Beiträge: 71
Win XP Professional
Turbo Delphi 2006
|
Verfasst: Di 02.06.09 16:07
Hallo,
Danke, das ist genau das wonach ich gesucht hab.
Könntest du mir nur noch genauer erklären wie ich die Unit einbaue und dieses .amibmp lade?
Dieses Programm musst du unbedingt in die Rubrik "Freeware" reinstellen!
Ich bin bestimmt nicht der einzige der sowas sucht! 
|
|
Tropby
      
Beiträge: 71
Erhaltene Danke: 4
Vista, Win XP, Win 89
Turbo Delphi Ex.
|
Verfasst: Di 02.06.09 16:25
Wenn du mit meinem Programm das *.anibmp erstellt hast kannst du das so bei dir nutzen:
Als erstes natürlich mit in das Projekt einbinden.
Delphi-Quelltext 1:
| uses Windows, Messages, SysUtils, Variants, Classes, , UnitAniBMP; |
Als nächstes musst du dir eine Variable anlegen vom Typ TAniBMP
Delphi-Quelltext 1:
| var Variable : TAniBMP; |
Und als letzten schritt:
Delphi-Quelltext 1:
| Variable := TAniBMP.Create(); |
Nun kannst du die Funktionen nutzen:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| procedure LoadFromFile(const Filename : String);
procedure LoadFromStream(const Stream : TStream);
function GetFrame(FrameID : Integer; var bmp : TBitmap) : Integer;
function AnzFrames() : Integer;
function GetFPS() : Integer;
procedure Start_Animate(Callback : TBitmapCallback; CallbackID : Integer = 0; Intervall : Integer = -1; StartFrame : Integer = 0; EndFrame : Integer = -1);
procedure Exit_Animate(); |
Folgener Code Animiert z.B. das File "test.anibmp":
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| uses UnitAniBMP;
var AniBMP : TAniBMP;
procedure TForm1.Button1Click(Sender : TObject); begin AniBMP := TAniBMP.Create(); AniBMP.LoadFromFile('test.anibmp'); AniBMP.Start_Animate(MyCallback); end;
procedure TForm1.MyCallback(ID : Integer; P : Pointer); begin Image1.Picture.Bitmap := &P; end; |
|
|
oneP 
      
Beiträge: 71
Win XP Professional
Turbo Delphi 2006
|
Verfasst: Di 02.06.09 16:34
| Zitat: | Als erstes natürlich mit in das Projekt einbinden.
Delphi-Quelltext 1:
| uses Windows, Messages, SysUtils, Variants, Classes, , UnitAniBMP; |
|
Wie man das einbindet kapier ich nicht. Man muss doch die UnitAniBMP datei erst irgendwo einfügen - oder?
|
|
Tropby
      
Beiträge: 71
Erhaltene Danke: 4
Vista, Win XP, Win 89
Turbo Delphi Ex.
|
Verfasst: Di 02.06.09 16:40
Ja,
oben gibt es so einen Ordner mit einem blauen plus drin damit kannst du die Unit deinem Projekt hinzufügen. (Rechts neben dem Speicherbutton)
und dann funktioniert auch das "uses UnitAniBMP;"
|
|
oneP 
      
Beiträge: 71
Win XP Professional
Turbo Delphi 2006
|
Verfasst: Di 02.06.09 17:31
Jup, danke!
Damit ist mein Problem gelößt! 
|
|