Autor Beitrag
oneP
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71

Win XP Professional
Turbo Delphi 2006
BeitragVerfasst: 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? :D
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 16

Win XP Home, Win XP Prof., Win Vista
Delphi 2009 Arch.
BeitragVerfasst: Mo 01.06.09 03:53 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71

Win XP Professional
Turbo Delphi 2006
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 71
Erhaltene Danke: 4

Vista, Win XP, Win 89
Turbo Delphi Ex.
BeitragVerfasst: 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 :roll: 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.

ausblenden volle Höhe Delphi-Quelltext
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); 


      // Angaben die nicht gemacht werden müssen:
      // CallbackID = ID die der Callbackfunktion übergeben wird um in einer Funktionen mehrere TAniBMP zusammen zufügen.
      // Interval   = Aktualisierungsinterval des Bilder in Millisekunden 
      // StartFrame = Erstes Bild der Animation um später zu starten
      // EndFrame   = Letztes Bild der Animation um früher aufzuhören

      // Standardwerte:
      // CallbackID = 0
      // Interval   = Angegebener Wert in der Datei sonst Error
      // StartFrame = 0
      // EndFrame   = Letztes Bild
      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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71

Win XP Professional
Turbo Delphi 2006
BeitragVerfasst: 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! :D
Tropby
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 71
Erhaltene Danke: 4

Vista, Win XP, Win 89
Turbo Delphi Ex.
BeitragVerfasst: 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.

ausblenden Delphi-Quelltext
1:
uses Windows, Messages, SysUtils, Variants, Classes, {...}, UnitAniBMP;					



Als nächstes musst du dir eine Variable anlegen vom Typ TAniBMP

ausblenden Delphi-Quelltext
1:
var Variable : TAniBMP;					



Und als letzten schritt:
ausblenden Delphi-Quelltext
1:
Variable := TAniBMP.Create();					


Nun kannst du die Funktionen nutzen:
ausblenden volle Höhe Delphi-Quelltext
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:
// Eine Datei als Animation laden:
procedure LoadFromFile(const Filename : String);

// Einen Stream als Animation laden:
procedure LoadFromStream(const Stream : TStream);


//################################################################//
//# Einen Frame auslesen:                                        #//
//# Result = 0     =>     bmp ist mit dem Frame gefüllt          #//
//# Result = -1    =>     FrameID zu groß                        #//
//# Result = -2    =>     FrameID kleiner 0                      #//
//################################################################//
function GetFrame(FrameID : Integer;
                  var bmp : TBitmap) : Integer;

//################################################################//
//# Gibt die Anzahl der Frames zurück:                           #//
//################################################################//
function AnzFrames() : Integer;

//################################################################//
//# Gibt die FPS zurück:                                         #//
//################################################################//
function GetFPS() : Integer;

//################################################################//
//# Animiert das Bild:                                           #//
//################################################################//
procedure Start_Animate(Callback : TBitmapCallback;
                                CallbackID : Integer = 0;
                                Intervall : Integer = -1;
                                StartFrame : Integer = 0;
                                EndFrame : Integer = -1);

//################################################################//
//# Beendet die Animation:                                       #//
//################################################################//
procedure Exit_Animate();


Folgener Code Animiert z.B. das File "test.anibmp":
ausblenden 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
  // Das Bild in Image1 wird nun animiert
  Image1.Picture.Bitmap := &P;  
end;
oneP Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71

Win XP Professional
Turbo Delphi 2006
BeitragVerfasst: Di 02.06.09 16:34 
Zitat:
Als erstes natürlich mit in das Projekt einbinden.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 71
Erhaltene Danke: 4

Vista, Win XP, Win 89
Turbo Delphi Ex.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71

Win XP Professional
Turbo Delphi 2006
BeitragVerfasst: Di 02.06.09 17:31 
Jup, danke!

Damit ist mein Problem gelößt! :D