ImageList, nicht alle geladenen Bitmaps werden ausgeben?
-
Hallo,
versuche gerade erfolglos die Bitmaps einer Imagelist der Reihe nach auf der Form auszugeben.
Auf der Form habe ich ein TImage angelegt.
Er wird immer nur das 1. Bitmap der Liste angezeigt.Kann jemand den entscheidenden Tipp geben, damit auch das 2. Bitmap zum Vorschein kommt?

void __fastcall TForm1::Button1Click(TObject *Sender){ Graphics::TBitmap* Bild = new Graphics::TBitmap(); Bild->LoadFromFile("D:\\...\\Bild01.bmp"); ImageList1->Add(Bild,NULL); Bild->LoadFromFile("D:\\...\\Bild02.bmp"); ImageList1->Add(Bild,NULL); for (int i=0; i<ImageList1->Count; i++) { //Count ist 2, das ist korrekt ImageList1->GetBitmap(i,Image1->Picture->Bitmap); Sleep(1000); } delete Bild; }
-
Hallo
schau dir dochmal an was du da eigentlich machst
ImageList1->GetBitmap(i,Image1->Picture->Bitmap); Sleep(1000);Wann zeigst du Bilder an ?
Mfg
Klaus
-
Hallo @KlausB, danke schon 'mal für Deinen Hinweis
so klappt das:for (int i=0; i<ImageList1->Count; i++) { //Count ist 2, das ist korrekt ImageList1->Draw(Canvas, 10, 10, i, true); //zeichnet auf Form1 Sleep(1000); }Das folgende leuchtet mir aber trotzdem noch nicht ganz ein:
Die Funktion GetBitmap lädt das i-te Bitmap der Imageliste in die Variable Image1->Picture->BitmapImageList1->GetBitmap(i,Image1->Picture->Bitmap);Beim 1. Durchlauf der Schleife wird das Bitmap1 von Image1 angezeigt. Warum also nicht auch Bitmap2 der Liste beim 2. Schleifendurchgang? Gibt's dafür keine Erklärung?
-
Ich denke eher, dein 2. Bild wird angezeigt, aber nicht das erste.
Ruf mal Application->ProcessMessages() vor Sleep() auf.
(Bei einem TImage würde ich persönlich auch GetBitmap (statt Draw) vorziehen.)P.S. Du solltest deine Bilder nicht mit absoluten Pfaden ("D:\...") laden.
-
Hallo @Th: Danke für Deine Antwort,
wie Du richtig angenommen hast, zeigt er immer das letzte und nicht das erste Bitmap der Liste an.
Dann habe ich, wie vorgeschlagen "Application->ProcessMessages()" angewandt.
Ergebnis: Er zeigt dann immer nur das erste Bild an.Ich habe daraufhin ->GetBitmap(i, Image2->Picture->Bitmap) umgestrickt mit ->Assign()
Es heißt jetzt:for (int i=0; i<ImageList1->Count; i++) { //Count ist 2, das ist korrekt ImageList1->GetBitmap(i,Bild); //Bild ist TBitmap Image1->Picture->Assign(Bild); Application->ProcessMessages(); Sleep(1000); }Damit funktioniert es jetzt, wie ursprünglich vorgesehen.
Alle Bilder der Liste werden nacheinander in das Image1 kopiert und angezeigt.Zu Application->ProcessMessages() sagt die C++ - Hilfe:
"..ermöglichen Sie der Anwendung, die Botschaften in der Warteschlange abzuarbeiten.."
Davon bin ich eigentlich immer ausgegangen, dass das Programm jede Befehlszeile selbstständig abarbeitet.
Falls nicht, wie hier, müßte ich in einem realen Programm, Schleife für Schleife einzeln prüfen, ob das Programm auch das macht, was man vorgesehen hat oder sich sonstwohin in den Urlaub verabschiedet.
Wenn das der Fall ist, ist das BCB-Programm ein ganz schöner Mist!!
-
Die ganze Windows-Programmierung basiert auf Botschaften (Messages).
Durch einen Aufruf von z.B. Draw() wird noch nicht das Bild direkt angezeigt, sondern erst wenn die Windows-Botschaft WM_PAINT abgearbeitet wird, d.h. solange du eine Schleife in deinem Programm hast, mußt du z.B. mittels "Application->ProcessMessages()" selber dafür sorgen.Sobald aber eine Ereignis-Routine ganz abgearbeitet ist, werden intern wieder die Windows-Botschaften abgearbeitet (z.B. Zeichnen, Mausbewegungen, Tastatur etc.).
Mittels Sleep() legst du aber den gesamten Prozess schlafen, d.h. jedliche Windows-Botschaften für diesen Prozess werden nicht mehr abgearbeitet (daher kannst du dann z.B. noch nicht mal das Hauptfenster verschieben etc.).Also ist nicht der BCB Schuld, sondern Windows

P.S. Wenn du einfach nur die Bilder nacheinander anzeigen willst, dann solltest du dafür die Komponente TTimer verwenden (damit verhinderst du auch das Anhalten deines Prozesses).
-
thunderbol4 schrieb:
Wenn das der Fall ist, ist das BCB-Programm ein ganz schöner Mist!!

Hoppla, da ist aber jemand schnell mit dem Urteil bei der Hand

-
Okay, ich nehm' das mit dem M*** ein Stückchen weit zurück =>Windows ist schuld (mit der Aussage liegt man eigentlich immer richtig!
).Die Erklärung von @Th bringt zum Glück etwas Licht ins Dunkel. Daran werde ich bei unerklärlichem Programmverhalten auch in Zukunft denken.
Gut, dass man sowas hier nachfragen kann!
Vielen Dank nochmal.