TImageList während laufzeit verändern und neu zeichnen
-
huhu,
die TImageList und ich werden wohl in diesem Leben keine Freunde mehr
Inzwischen wird sie wunderschön gezeichnet wie ich sie gerne hätte. jedoch hab ich noch mehr damit vor und nun sträubt es sich wieder.
ich möchte jetzt während der laufzeit grafiken aus der liste löschen und neue dazufügen. hierzu ein paar fragen/probleme.
1. http://www.functionx.com/cppbuilder/controls/imagelist.htm << hier steht das ich aus einer ImageList ganz einfach über ImageList->Delete(index); löschen kann. ich bekomme jedoch immer eine Fehlermeldung wenn ich diesen befehl z.b. ImagelIst->Delete(1) aufrufe. "Invalid ImageList Index" ich bin mir jedoch sicher das ich mindestens 5 Grafiken in der Liste habe (ich seh sie doch XD). Die Funkion in der das Löschen stattfindet wird von einer anderen Funktion aufgerufen.
2. eine neue grafik anfügen ist ja kein thema, aber gezeichnet wird sie ja erst wenn der OnPaint Event kommt, kann ich den irgendwie selbst antriggern? (also OnClick löst OnPaint aus?)
lg leli
-
ok, bin schon weiter gekommen.
das anfügen und zeichnen klappt sogar spontan richtig. aber das löschen der gesamten liste, das nichts mehr angezeigt bekomme noch nicht wirklich. ich erhalte weiterhin die fehlermeldung mit dem invaliden index, dann löscht er eine der grafiken, aber nicht alle. also das ist alles etwas weird, als ob es eben die liste zerbröselt?lg leli
-
Hallo
Du wendest die Methoden falsch an, aber die genaue Ursache ist aus deiner Beschreibung bisher nicht ersichtlich. Benutze den Debugger um den Programmablauf und die Variablen zu verfolgen.
bis bald
akari
-
hm ihc denke ich hab da einen gesamten logik/denkfehler drin. ich versuche die liste zu verändern obwohl ich eigentlich nur die anzeige los haben möchte.
lg leli
-
Moin,
wie wäre es mit
ImageList->Clear()
um die gesamt ImageList zu löschen...
By the way: Was hast Du denn mit der ImageList genau vor? Erzähl mal...
VG Pixfreak
-
huhu,
also ImageList->Clear(); habe ich als aller erstes versucht, da tut sich gar nichts. Bei Delete bekomme ich zwar eine fehlermeldung, aber es wird immerhin was weggelöscht.
also ich belade die image liste aus einem xml. nun möchte ich aber nur noch ein ganz bestimmtes image aus der liste haben.
dafür wollte ich die liste löschen und nur noch mit dem einer bestimmten grafik befüllen.
um mal das ganze vodoo zu verdeutlichen:
ImageList->Delete(1);
angenommen ich rufe diesen befehl, mit hardcodetem index (0 -anz) auf, wird es ohne komplikationen gelöscht.
int i =0; for (i; i <=4; i++) { ImageList->Delete(i); }
rufe ich den spaß jedoch in einer schleife auf, mit denselben werten wie vorher einzeln, bekomme ich sofort diesen Index Fehler.
rückt er die grafiken in der liste nach oben? macht er das random? hab verschiedene varianten versucht und bin zu keinem eindeutigen ergebnis gekommen.
-
Hallo
Dann überleg doch mal, wie sich die Einträge in der ImageList anordnen...
Ausgang : Die Liste enthält Bilder mit Indexen 0,1,2,3,4. Du läßt deine Schleife von 0 bis 4 laufen.
1. Schritt : Eintrag mit Index 0 löschen. Liste : 0,1,2,3
2. Schritt : Eintrag mit Index 1 löschen. Liste : 0,1,2
3. Schritt : Eintrag mit Index 2 löschen. Liste : 0,1
4. Schritt : Eintrag mit Index 3 löschen. Fehler!
Du hast nicht bedacht, das mit dem Löschen von Einträgen die nachfolgenden Einträge nach vorne rutschen...Eine Änderung der Schleife ist nötig :
while (ImageList->Count > 0) ImageList->Delete(0);
Und ich bin mir sicher, das die Methode Clear auch nicht viel anderes macht.
bis bald
akari
-
ich bin so ein depp...
clear funktioniert einwandfrei, ich idiot hab nur vergessen auch den vektor zu löschen in dem ich die images zum zeichnen verwalte ^^
tut mir leid für den ganzen terz *g*
und wegen delete, ich dachte wirklich das die einträge so wären wir bei einem array, also nicht "herumrutschen" in dem sinne. auf jeden fall funktioniert es jetzt. danke für eure mühe, kuchen für alle ^^
lg leli
-
sorry, ich schon wieder ^^
die image liste ist jetzt leer, genauso der vektor mit dem ich die images in eine scrollbox gezeichnet habe. und hier ist auch schon mein problem ^^ die grafiken sind immernoch in der scrollbox. wie lösche ich die? ich möchte ungern die ganze scroll box löschen und jedesmal neu anlegen müssen.
gibt es sowas wie ScrollBox.Contents[]?
(ich verspreche euch übrigens hiermit feierlich niemals beruflich mit c++ zu arbeiten XD ich bleibe bei der webentwicklung ...)
-
Hallo
Mit der Methode TScrollBox::DestroyComponents kannst du alle Komponenten in der ScrollBox löschen lassen. Wenn du nur einen Teil löschen willst, must manuell die zu löschenden Subkomponenten identifizieren und mit delete löschen.
bis bald
akari
-
danke, aber das war wohl immer noch nicht das ende vom lied, sie sind immer noch da.
langsam weiss ich nicht wo er die noch hernimmt *sniff*Also hier ist der Teil der OnPaint Funktion die mir die Grafiken in ScrollBox1 reinzeichnet.
if(ImageList->Count >0) { for(int i = 0; i<ImageList->Count; i++) { maskenGalerie.push_back(new TImage(Owner)); ImageList->GetBitmap(i, Bmp); maskenGalerie[i]->Picture->Bitmap = Bmp; maskenGalerie[i]->Parent = ScrollBox1; maskenGalerie[i]->Top = height; maskenGalerie[i]->Left = 30; maskenGalerie[i]->Height = 150; maskenGalerie[i]->Tag = i; maskenGalerie[i]->OnClick = onClickMask; //Callback Funktion height = height + 160; Application->ProcessMessages(); } }
Auf einen Buttondurck wird jetzt folgendes ausgeführt
ImageList->Clear(); mainView->ScrollBox1->DestroyComponents(); maskenGalerie.clear(); Refresh();
Jedoch halten sich die Grafiken hartnäckig. ImageListe und maskenGalerie habe ich überprüft, sie sind danach wirklich leer. das Refresh ruft die onPaint funktion wirklich nochmal auf (auch überprüft). Woher holt sich die GUI jetzt noch die Grafiken?
lg leli
HEUREKA!!!!
ich musste, bevor ich den Vektor lösche, den Bildern noch Null zuweisen:
for (int i =0; i < ImageList->Count; i++) { maskenGalerie[i]->Picture->Assign(NULL); } maskenGalerie.clear(); ImageList->Clear(); ScrollBox1->DestroyComponents(); Refresh();