TImage mit Variable



  • Hi, bin jetzt schon etwas länger am suchen und finde einfach keine Lösung..
    Meine Frage ist:
    Wie kann ich ein Image mit einer Variable ansprechen?

    Habe z.B. diese Zeilen in meinem Quellcode:

    int i = 1;
    imgX->Visible=false;
    

    Statt imgX soll halt img1 dort stehen mit der Variable i. Ich weiß einfach nicht wie ich das verknüpfen soll.

    Hoffe auf Hilfe! Danke & Gruß
    ilu



  • Hallo

    Siehe FAQ hier im BCB-Forum, Abschnitt Komponenten benutzen, Thread Dynamische Arrays von Komponenten.

    bis bald
    akari



  • Hi! Danke für deine Hilfe!
    Das hat mir schonmal ein bisschen weitergeholfen, bekomme aber jetzt ne Fehlermeldung 😞

    http://www.abload.de/img/untitledtavi.png

    Hier der Code dazu:

    DynamicArray<TImage*>imgArray;
    int imgNum = 9;
    __fastcall TfrmMain::TfrmMain(TComponent* Owner)
    	: TForm(Owner)
    {
    
       imgArray.Length = imgNum;
    
       for (int i=1; i<imgArray.Length; i++)
      {
    	imgArray[i]->Visible=false;
      }
    
    }
    

    Warum geht das nicht?? 😞
    Gruß ilu



  • Hallo

    Vermutlich hast du in das Array noch keine Speicheradressen von gültigen TImage-Instanzen kopiert. Es reicht nicht, nur die GTröße des Arrays festzulegen.
    Du hast also zwei Möglichkeiten :
    Du weist die gültigen, mit dem OI zur Entwurfszeit erstellten TImage-Instanzen zu, bevor du das Arrays benutzt

    imgArray.Length = imgNum;
    imgArray[0] = Image1; // Der feste name der ersten Image-Komponente
    imgArray[1] = Image2; 
    ...
    imgArray[x] = ImageX; 
    for (int i=1; i<imgArray.Length; i++)
    ...
    

    Das ist natürlich nur eine Notlösung.

    Besser ist es die TImage-Komponenten zur Laufzeit gleich ganz dynamisch zu erstellen. Wie das geht wird im den genannten FAQ-Eintrag beschrieben. Der erste Schritt ist natürlich, die zur Entwurfszeit schon angelegten TImage-Komponenten zu löschen.

    bis bald
    akari



  • Hi again!

    Danke für deine erneute Hilfe 🙂 Bin leider nochn Anfänger, habe C++ seit nem halben Jahr in der Berufsschule, deswegen kann ich mit deinen Aussagen nicht so viel anfangen..

    for(int i=1; i < frmMain->ComponentCount; i++)
    	{
    		// Alle Labels verändern
    		if (frmMain->Components[i]->ClassNameIs("TImage"))
    		{
    			dynamic_cast<TImage*>(frmMain->Components[i])->Visible=false;
    		}
    	}
    

    Konnte es jetzt damit lösen! Tolles Forum, der FAQ ist nun in Bookmarks 🙂

    Schönen Abend & Gruß
    ilu



  • ilu schrieb:

    dynamic_cast<TImage*>(frmMain->Components[i])->Visible=false;
    

    Das macht man nicht. dynamic_cast<> kann 0 zurückgeben, wenn die Umwandlung nicht möglich ist - dann verursacht dein Code eine Zugriffsverletzung. Du solltest das Ergebnis überprüfen.

    Wenn du eigentlich sicher bist, daß der Cast erfolgreich sein muß, dann verwende die Referenz-Variante:

    dynamic_cast<TImage&> (*frmMain->Components[i]).Visible = false;
    

    In diesem Fall wird, sofern die Umwandlung scheitert, eine Exception geworfen, mithin der Programmfluß kontrolliert unterbrochen.


Log in to reply