Entwickler-Ecke

Multimedia / Grafik - 4 Bilder nacheinander anzeigen


vogael - Di 13.09.05 23:56
Titel: 4 Bilder nacheinander anzeigen
Guten Tag,

ich bräuchte mal einen Tipp, wie man das hinkriegt, dass 4 Bilder an einer Stelle nacheinander angezeigt werden. Also mit einem timer.

Also, wenn der Timer aktiviert ist, soll in dem angegeben Intervall immer das Bild gewechselt werden, wenn alle 4 durch sind soll's wieder von vorne anfangen.... und ich hab kein Plan wie das geht, bin absolut neu in Delphi.....

Ich sag dann schonmal danke


Heiko - Mi 14.09.05 06:32

Dafür nimmst du eine globale Variable, die sich einspeichert welches Bild gerade dran ist. Wenn der Timmer dann wieder "zuschlägt" erhöhst du die Variable wieder auf die nächste Bildnummer und zeigst dann das zu der Nummer gehörigem Bild an.

PS: Ob der kleine Hinweis dir etwas bringt weiß ich nicht, denn du hast nicht gesagt woran du scheiterst (also bitte präziser beschreiben ;) ), denn es kann ja sein, das du schon am Anzeigen des Bildes scheiterst.


vogael - Mi 14.09.05 06:41

moin,
also ich krieg's zwar hin, ein Bild anzuzeigen, aber dass dieses sich ändert nicht.

So, das mit ner globalen Variable hört sich doch gut an , denn sowas mit hochzählen hab ich schonmal gemacht, nur eben mit zahlen.
Und wie mach ich das dann?
Muss dann eine Variable als "global" deklariert werden?
Sollen die Bilder dann in eine ImageList oder macht man das anders? Wenn ja, dann wie sag ich dem, dass er Bild 0, 1 usw... oder so aus der Imagelist nehmen soll?


Heiko - Mi 14.09.05 07:11

user profile iconvogael hat folgendes geschrieben:
moin,
also ich krieg's zwar hin, ein Bild anzuzeigen, aber dass dieses sich ändert nicht.

Wie es sich anhört hast du bestimmt die Komponente TImage genutzt, oder?

user profile iconvogael hat folgendes geschrieben:
So, das mit ner globalen Variable hört sich doch gut an , denn sowas mit hochzählen hab ich schonmal gemacht, nur eben mit zahlen.

Sollst du hier ja auch machen ;)

user profile iconvogael hat folgendes geschrieben:
Und wie mach ich das dann?


Delphi-Quelltext
1:
2:
BildZaehleer:=BildZaehleer+1//kürzer und schneller: inc(BildZaehleer);
 if BildZaehleer=5 then BildZaehleer:=0;



user profile iconvogael hat folgendes geschrieben:
Muss dann eine Variable als "global" deklariert werden?

Bei dem Programm ja, denn wenn du diese lokal definieren würdest, würde das Programm nach dem Ende der Prozedur, wo die deklariert ist, den Inhalt "vergessen". Wenn sie dagegen global ist, speichert sich das Programm diese, bis das Programm beendet wird.

user profile iconvogael hat folgendes geschrieben:
Sollen die Bilder dann in eine ImageList oder macht man das anders? Wenn ja, dann wie sag ich dem, dass er Bild 0, 1 usw... oder so aus der Imagelist nehmen soll?

Das bleibt dir überlassen. Die ImageList bietet Performancevorteile und so. Vor allem werden die Bilder mit in die Exe compiliert. Man kann aber auch das Bild aus einem Ordner jedesmal laden, wodurch dein Programm variabel wird ;).
@Bild aus ImgaeList:
ImageList1.GetBitmap(BildZaehleer, Image1.Picture.Bitmap); Das steht aber auch in der Delphi-Hilfe ;).


Lossy eX - Mi 14.09.05 08:55

Eine andere Art eine Variable zu definieren wäre sie als Member des Fenster zu deklarieren. Stichwort Objektorientiert! Ist alle mal besser als Global.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  TForm1 = class(TForm)
  private
    fImageIndex: Integer;
  public
    { Public-Deklarationen }
  end;

Dann kann man ganz normal darauf zugreifen. Und falls man noch eine Instanze des Forms anlegen möchte, kommen sich die Variablen nicht in den Weg, da jedes Form seine eigenen Variablen besitzt. Wenn sie von einem anderen Form änderbar sein müssen, dann müsstest du die Variablen im Public teil ansiedeln.

Für den Fall, dass du die Bilder zur Laufzeit laden möchtest, dann würde sich ein Array anbieten. In das könntest du deine Bilder packen und sie bei Bedarf herrausholen.


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:
procedure TForm1.FormCreate(Sender: TObject);
begin
  // Bilder erstellen und Laden
  fAnimation[0] := TPicture.Create;
  fAnimation[0].LoadFromFile('Image1.bmp');

  fAnimation[1] := TPicture.Create;
  fAnimation[1].LoadFromFile('Image2.bmp');

  fAnimation[2] := TPicture.Create;
  fAnimation[2].LoadFromFile('Image3.bmp');

  fAnimation[3] := TPicture.Create;
  fAnimation[3].LoadFromFile('Image4.bmp');
end;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  // Wieder freigeben
  FreeAndNil(fAnimation[0]);
  FreeAndNil(fAnimation[1]);
  FreeAndNil(fAnimation[2]);
  FreeAndNil(fAnimation[3]);

  // Alternativ ginge auch
  // fAnimation[0].Free;
  // da dann aber dennoch die Adresse der ehemaligen Bilder im Array gespeichert wären,
  // könnte dies zu Problemen führen falls man dann darauf zugreifen möchte
end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Inc(fImageIndex);
  if fImageIndex = 4
    then fImageIndex := 0;

  Image1.Picture.Assign(fAnimation[fImageIndex]);
end;

Und so könntest du dann die Bilder in deinem Image darstellen. Die Bilder wären aber bei dieser Methode nicht in der Exe gespeichert. Was aber mitunter auch gewünscht sein kann.


vogael - Mi 14.09.05 14:35

so, danke erstmal ;)

die Methode mit der Imagelist ist die die ich suche. Ich hab das nun wie folgt gemacht, jedoch bleibt da immer das gleiche Bild, in der imagelist sind 3. und die variable wird auch hochgezählt, also müsste das doch eigentlich gehen.... wo ist nur der Fehler??


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:
var
  Form1: TForm1;
  Bild: integer;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
     timer1.enabled:=true
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
bild:=0
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
     inc(Bild);
     imagelist1.getbitmap(Bild, image1.picture.Bitmap);
     if Bild=3 then Bild:=0         ;
     panel1.caption:=inttostr(bild); //nur zum testen ob die variable auch hochgezählt wird...

end;


Heiko - Mi 14.09.05 15:14

Ich sehe jetzt auf Anhieb kein Fehler. Am besten Stelle dien Programm, inklusive der Bilder, als Anhang hoch. Vlt. liegt ja der Fehler woanders ;).


Lannes - Mi 14.09.05 15:34

Hallo,

setz in die Timer-Procedur am Ende Image1.Refresh; ein.


F34r0fTh3D4rk - Mi 14.09.05 15:40

user profile iconvogael hat folgendes geschrieben:
so, danke erstmal ;)

die Methode mit der Imagelist ist die die ich suche. Ich hab das nun wie folgt gemacht, jedoch bleibt da immer das gleiche Bild, in der imagelist sind 3. und die variable wird auch hochgezählt, also müsste das doch eigentlich gehen.... wo ist nur der Fehler??


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:
var
  Form1: TForm1;
  Bild: integer;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
     timer1.enabled:=true
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
bild:=0
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
     inc(Bild);
     imagelist1.getbitmap(Bild, image1.picture.Bitmap);
     if Bild=4 then Bild:=0         ;     panel1.caption:=inttostr(bild); //nur zum testen ob die variable auch hochgezählt wird...
  image1.refresh;
end;


sollte so gehen ;)


Heiko - Mi 14.09.05 15:40

user profile iconLannes hat folgendes geschrieben:
Hallo,

setz in die Timer-Procedur am Ende Image1.Refresh; ein.


Macht er es nicht eigentlich automatisch? :gruebel: (Ich nehme die Komponente nie, da ich direkt auf das Formular zeichne ;) )


F34r0fTh3D4rk - Mi 14.09.05 15:45

user profile iconHeiko hat folgendes geschrieben:
user profile iconLannes hat folgendes geschrieben:
Hallo,

setz in die Timer-Procedur am Ende Image1.Refresh; ein.


Macht er es nicht eigentlich automatisch? :gruebel: (Ich nehme die Komponente nie, da ich direkt auf das Formular zeichne ;) )

bei getbitmap glaube ich net


vogael - Mi 14.09.05 16:10

geilo, es geht, ihr habt mir echt geholfen, danke!!!!!


Jonas1405 - Mi 14.09.05 16:12
Titel: Re: 4 Bilder nacheinander anzeigen
user profile iconvogael hat folgendes geschrieben:
Guten Tag,

ich bräuchte mal einen Tipp, wie man das hinkriegt, dass 4 Bilder an einer Stelle nacheinander angezeigt werden. Also mit einem timer.

Also, wenn der Timer aktiviert ist, soll in dem angegeben Intervall immer das Bild gewechselt werden, wenn alle 4 durch sind soll's wieder von vorne anfangen.... und ich hab kein Plan wie das geht, bin absolut neu in Delphi.....

Ich sag dann schonmal danke


Hey ho!!
Also wenn du neu bist- hier ist eine suupereinfache Sache: Du nimmst dir eine Image Komponente (Symbol ist so ein Bild) die nimmst du 4 Mal machst sie alle gleich groß und schiebst sie übereinander. In jedes lädst du eines der 4 Bilder (im Objektinspektor gibt es unter Eigenschaften den Punkt Picture oder so- da kannst du in einem Extrafenster ein Bild auswählen, das angezeigt werden soll (ich weiß halt nicht wie "neu" du bei Delphi bist- desshalb schreibe ich das so sicher wie möglich :D :D :D )). Dann guckst du im Objektinspector ncohmal unter EIgenschaften auf einen Punkt, der heißt visible. Der gibt an ob bei laufen des Programmes ide Komponente zu sehen ist oder nicht. Dann stellst du einfach alle Komponenten bei visible auf false (Bis auf die Komponente, in der dein Startbild angezeigt wird), sodass du nachher bei Sart nur dein erstes Bild siehst. Dann programmierst du den Timer so, dass das zweite Bild (die zweite Image Komponenten) bei Visible auf true gestellt wird und die erste "ausgeschaltet" wird, indem du da die Visible Eigenschaft auf fals stellst und immer so weiter bis es wieder von vorne anfängt.

Das ist eine einfach aber nicht so elegante Lösung- die aber funktionieren sollte =) wenn ich nochmal den Quelltext aufschreiben soll sag mal Bescheid (ich weiß halt wie gesagt nicht wie neu du unter Delphi bist!!)

Gruß Jonas


F34r0fTh3D4rk - Mi 14.09.05 16:16
Titel: Re: 4 Bilder nacheinander anzeigen
user profile iconJonas1405 hat folgendes geschrieben:
user profile iconvogael hat folgendes geschrieben:
Guten Tag,

ich bräuchte mal einen Tipp, wie man das hinkriegt, dass 4 Bilder an einer Stelle nacheinander angezeigt werden. Also mit einem timer.

Also, wenn der Timer aktiviert ist, soll in dem angegeben Intervall immer das Bild gewechselt werden, wenn alle 4 durch sind soll's wieder von vorne anfangen.... und ich hab kein Plan wie das geht, bin absolut neu in Delphi.....

Ich sag dann schonmal danke


Hey ho!!
Also wenn du neu bist- hier ist eine suupereinfache Sache: Du nimmst dir eine Image Komponente (Symbol ist so ein Bild) die nimmst du 4 Mal machst sie alle gleich groß und schiebst sie übereinander. In jedes lädst du eines der 4 Bilder (im Objektinspektor gibt es unter Eigenschaften den Punkt Picture oder so- da kannst du in einem Extrafenster ein Bild auswählen, das angezeigt werden soll (ich weiß halt nicht wie "neu" du bei Delphi bist- desshalb schreibe ich das so sicher wie möglich :D :D :D )). Dann guckst du im Objektinspector ncohmal unter EIgenschaften auf einen Punkt, der heißt visible. Der gibt an ob bei laufen des Programmes ide Komponente zu sehen ist oder nicht. Dann stellst du einfach alle Komponenten bei visible auf false (Bis auf die Komponente, in der dein Startbild angezeigt wird), sodass du nachher bei Sart nur dein erstes Bild siehst. Dann programmierst du den Timer so, dass das zweite Bild (die zweite Image Komponenten) bei Visible auf true gestellt wird und die erste "ausgeschaltet" wird, indem du da die Visible Eigenschaft auf fals stellst und immer so weiter bis es wieder von vorne anfängt.

Das ist eine einfach aber nicht so elegante Lösung- die aber funktionieren sollte =) wenn ich nochmal den Quelltext aufschreiben soll sag mal Bescheid (ich weiß halt wie gesagt nicht wie neu du unter Delphi bist!!)

Gruß Jonas

man kann auch einfach bringtofront nehmen, aber er hats ja schon