TShape einzeln anzeigen



  • Hallo zusammen,

    und schon wieder hab ich ein Problem das ich nicht selber lösen kann!!! 😞

    Ich würde gern meine TShaps einzeln bzw. nacheinander angezeigt bekommen, d.h. momentan ist es so, dass ich den Button betätige und mir gleich alle TShapes (z.B. 20) untereinander angezeigt werden. Ich möchte es allerdings so haben, dass immer wenn ich den Button betätige ein Shape nach dem anderen an der gleichen Stelle angezeigt wird.

    Versteht ihr was ich meine! 😕

    Ich dachte so würde das evtl. funktionieren, aber da hab ich mal wieder getäuscht. Weiss jemand was falsch ist?

    DANKE schon mal!

    TForm1 *Form1;
    
    // Anwenderdeklaration
       int xpos, ypos;
       bool move_shape;
       int zeilen, spalten, zaehler1 = 0;  //Zähler eingebaut
       int** gatter;
    
    //Dynamisches erstellen von Arrays
       DynamicArray<TShape*>LblArray;
       int LblNum = 20;
    
    void __fastcall TForm1::Bspieler1Click(TObject *Sender)
    {
    if(zaehler1 <= LblArray.Length)
    {
       for (int i = 0; i < zaehler1; i++)
       {
          LblArray[i]->Parent = this;
          //Erstellt den Kreis
          LblArray[i]->Shape = stCircle;
          //Erstellt die Grösse des Kreises
          LblArray[i]->Height = 33;
          LblArray[i]->Width = 41;
          //Position des Kreises
          LblArray[i]->Left = 376;
          LblArray[i]->Top = 33 * i;
          //Farbe des Kreises
          LblArray[i]->Brush->Color = clRed;
          LblArray[i]->Show();
       }
    zaehler1 + 1;
    }
    

    Gruß Eleonora



  • Erzeuge alle Shapes am Anfang, Visible=false und Tag=0
    Bei jedem ButtonClick gehst Du das Array durch und setzte das erste Shape mit Tag==0 (und nur dieses) auf Visible=true und das Tag=1 ...



  • Ich schätze mal so hast Du das nicht gemeint!? 😕 Denn so funktioniert es nämlich noch nicht!
    Ausserdem hab ich vorher einen Teil des Codes vergessen. Hier also noch mal der Komplette!!!

    TForm1 *Form1;
    
    // Anwenderdeklaration
       int xpos, ypos;
       bool move_shape;
       int zeilen, spalten, zaehler1 = 0;  //Zähler eingebaut
       int** gatter;
    
    //Dynamisches erstellen von Arrays
       DynamicArray<TShape*>LblArray;
       int LblNum = 20;
    
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    int i, schleife;
    
       xpos = ypos = 0;
       move_shape = false;
    
    //Neues Shape wird angelegt
       LblArray.Length= LblNum;
       for (int i = 0; i < LblArray.Length; i++)
       {
          LblArray[i] = new TShape(this);
          LblArray[i]->Visible == false;
          LblArray[i]->Tag = 0;
       }
    
    void __fastcall TForm1::Bspieler1Click(TObject *Sender)
    {
    if(zaehler1 < LblArray.Length)
    {
       for (int i = 0; i < zaehler1; i++)
       {
          LblArray[i]->Parent = this;
          //Erstellt den Kreis
          LblArray[i]->Shape = stCircle;
          //Erstellt die Grösse des Kreises
          LblArray[i]->Height = 33;
          LblArray[i]->Width = 41;
          //Position des Kreises
          LblArray[i]->Left = 376;
          LblArray[i]->Top = 33 * i;
          //Farbe des Kreises
          LblArray[i]->Brush->Color = clRed;
          LblArray[i]->Show();
    
          if(LblArray[i]->Tag == 0)
          {
             LblArray[i]->Visible == true;
             LblArray[i]->Tag = 1;
          }
       }
    zaehler1 + 1;
    }
    
    }
    

    Den Zähler brauch ich ja schon noch, oder?

    Gruß und Danke!



  • Also ich habe deinen Code gerade mal getestet und ich denke er macht genau das was du möchtest. Wenn ich Klicke bekomme ich erst eine Shape zu sehen. Klicke ich nochmal, kommt eine hinzu. usw.



  • Bei mir funktioniert der Code so wie er oben steht nicht. Ich bekomme also gar kein Shape mehr angezeigt. Ich haben nun aus dem

    for (int i = 0; i < zaehler1; i++)
    

    ein

    for (int i = 0; i <= zaehler1; i++)
    

    gemacht und nun bekomme ich auch ein Shape zu sehen. Allerdings seh ich nun nicht ob auch weitere Shapes auf dieses Shape gelegt werden, oder ob nur dieses angezeigt wird!

    Wie ist das bei Dir? Zeigt er Dir die Shapes untereinander nacheinander an oder aufeinanader?
    Und warum funktioniert der obere Code bei Dir so wie er oben steht, und bei mir nur mit der einen Änderung? 😕

    Woran kann ich bei mir erkennen ob er mehrere anzeigt oder nur eins. Also ich vermute er zeigt nur das eine an!

    DANKE!



  • [cpp]//Neues Shape wird angelegt
    LblArray.Length= LblNum;
    for (int i = 0; i < LblArray.Length; i++)
    {
    LblArray[i] = new TShape(this);
    LblArray[i]->Visible == false;
    LblArray[i]->Tag = 0;
    } [/cpp]

    Soll wohl heißen ->Visible = false



  • Uups, da hab ich wohl einmal zuviel auf die Taste gedrückt! Hat ich gar nicht bemerkt! 🙄

    Aber deswegen weiss ich trotzdem noch nicht ob er mir nur eins erstellt oder mehrere!



  • Aber deswegen weiss ich trotzdem noch nicht ob er mir nur eins erstellt oder mehrere!

    Setz die Position der Shapes beim Erstellen etwas unterschiedlich ...
    Ausserdem mußt Du die Schleife mit break abbrechen sobald Du ein Visible=true und Tag=1 gesetzt hast.



  • Funktioniert immer noch nicht. Ich glaub ich hab schon so ziemlich alles probiert!

    Nun ist es so, dass er mir beim 1. Button Click den Shape ganz re anzeigt. So wollt ich es auch. Click ich aber noch mal drauf, dann verschwindet dieser Button und ein Shape wird nun ganz li. angeziegt. Es sieht also so aus, als ob das Shape immer hin und her springen würde.

    Bedeutet das nun, dass er mir den 1. wieder ausblendet und einen 2. einblendet, oder ist das der gleiche nur an einer anderen Position?

    Sorry, ich glaub heut ist nicht mein Tag! 😞



  • Machs doch einfach ungefähr so:

    Header Datei

    #define LBLNUM 20
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    	__published:// Von der IDE verwaltete Komponenten
    		TButton *Button1;
    		void __fastcall Button1Click(TObject *Sender);
    	private:	// Anwender-Deklarationen
    		DynamicArray<TShape*>LblArray;
    		void ShapesVisible(void);
    	public:		// Anwender-Deklarationen
    		__fastcall TForm1(TComponent* Owner);
    };
    

    cpp Datei

    __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
    {
    	int xpos, ypos;
    
    	xpos=ypos=10;
    	LblArray.Length=LBLNUM;
    	for (int i=0; i<LblArray.Length; i++)
    	{	LblArray[i]=new TShape(this);
    		LblArray[i]->Parent=this;
    		LblArray[i]->Top=ypos++;
    		LblArray[i]->Left=xpos++;
    		LblArray[i]->Visible=false;
    		LblArray[i]->Tag=0;
    	}
    }
    //---------------------------------------------------------------------------
    void TForm1::ShapesVisible(void)
    {
    	for(int x=0; x<LBLNUM; x++)
    	{	if(LblArray[x]->Tag==0)
    		{	LblArray[x]->Tag=1;
    			LblArray[x]->Visible=true;
    			break;
    		}
    	}
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    	ShapesVisible();
    }
    


  • Hallo, hier bin ich mal wieder!
    Erstmal danke für die vielen Vorschläge, usw.

    @Peter: Ich habe Deinen Code übernommen und angepasst. Allerdings bringt er mir eine Fehlermeldung mit der ich nichts anfangen kann. Ich hab auch schon in der Hilfe nachgeschaut und ein paar Dinge ausprobiert um diese Meldung wieder wegzubekommen, aber egal wie oder was ich mach, es kommt immer die gleiche.

    Fehlermeldung in diesem Abschnitt lautet:
    Bezeichner 'ShapesVisible' darf keinen Typqualifizierer besitzen.

    void TForm1::ShapesVisible(void)
    {
        for(int i = 0; i < LblNum; i++)
        {
           if(LblArray[i]->Tag==0)
           {
              LblArray[i]->Tag = 1;
              LblArray[i]->Visible = true;
              break;
           }
        }
    }
    

    Weiss jemand was ich da ändern muß/sollte!

    Gruß


Anmelden zum Antworten