Kleines Kreischen malen



  • this->Canvas->Pen->Color = clWhite;
           this->Canvas->Rectangle(0,0, 10,10);
           this->Canvas->Refresh();
    

    Müsste so nicht ein kleines weißes Rechteck auf dem Label entstehen?
    Tut es nicht. Es passiert gar nichts



  • Für Flächen nimm Brush statt Pen.
    Und this sollte auch wirklich auf das Label zeigen.
    Und dann kommte es auch noch darauf an, an welcher Stelle du das Ganze aufrufst.



  • Ich rufe das im Konstruktor einer von TLabel abgeleiteten Klasse auf.
    Brush macht keinen Unterschied, also denke ich, dass ich was anderes falsch mache

    class Feld : public TLabel
    {
    
       public:
         __fastcall Feld(AnsiString name,       //Name des Felds
              TComponent* Owner,                //Objektbesitzer
              TWinControl* parent,              //Elternelement
              unsigned int width,               //Breite
              unsigned int height,              //Höhe
              unsigned int top,                 //y-Koordinate
              unsigned int left)
         : TLabel(Owner)                        //Konstrukturaufruf von TLabel
         {
           this->Color = cl;
           this->AutoSize = false;              //Das Feld soll sich nicht dem Inhalt anpassen
           this->Font->Color = clWhite;
           this->Parent = parent;
           this->Caption = " ";                 //Auf dem Feld soll nichts stehen
           this->ShowHint = true;               //Hinweis beim Überfahren mit der Maus: ja
           this->Hint = "Leeres Feld";          //Standarttext des Hinweises
           this->Top = top;
           this->Left = left;
           this->Width = width;
           this->Height = height;       
           this->Canvas->Pen->Color = clBlack;
           this->Canvas->Brush->Color = clBlack;
           this->Canvas->Rectangle(5,5, 10,10);
           this->Canvas->Refresh();
           this->Repaint();
           this->Refresh();
         }
    };
    


  • Hallo,

    wie erzeugst du das Feld?

    Beispiel:

    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
        feld = new Feld(
                "feld1",        // AnsiString name,       //Name des Felds
                this,           // TComponent* Owner,     //Objektbesitzer
                Form1,          // TWinControl* parent,   //Elternelement
                40,             // unsigned int width,    //Breite
                40,             // unsigned int height,   //Höhe
                20,             // unsigned int top,      //y-Koordinate
                20);            // unsigned int left;
    }
    //---------------------------------------------------------------------------
    
    __fastcall TForm1::~TForm1(void)
    {
        delete feld;
    }
    


  • So wie du:

    this->array[x][y] = new Feld("x" + IntToStr(x) + "_y" + IntToStr(y), //Feldname
                                         Owner, parent,        //Besitzer und Vater
                                         width, height,        //Maße des Felds
                                         y*top, x*left        //Koordinaten des Felds
                                         );
    

    Ist das falsch so?



  • Owner, parent sind bei dir (für uns nicht ersichtlich) nicht belegt.

    Um herauszubekommen, obs überhaupt erzeugt wird, setze einfach was in die Caption.



  • Ja, das wird erzeugt.
    Die Labels sind da und werden angezeigt.

    Owner ist bei mir TForm1 und parent ist ein Panel auf TForm1



  • Dann sollte es gehen.

    was ist this->Color = cl ( wie ist die Farbe definiert, ist da ein Fehler?)...



  • wenn du das im Konstruktor aufrufst, bringt dir das aber nichts, da dort das gezeichnete vergessen wird. Normalerweise ruft man sowas im OnPaint Event auf (wenn das Objekt sowas bietet)

    greetz KN4CK3R



  • Hi,

    This->Color passt. da ist nur beim kopieren hier rein was schief gelaufen.

    Und onPaint bietet TLabel leider nicht 😞

    Hmm, eines habe ich vergessen zu erwähnen. Wenn ich mit Canvas zeichne, dann "klappt" das Label zusammen. Also es hat dann keine Ausmaße mehr.
    Wenn ich dann das Fenster resize, dann sind sie wieder da.



  • Autosize = false!!
    ed
    Nee, hast du ja ...



  • Auch mit true ändert sich nix 😞

    Ist vieleicht TLabel einfach nur ungeeignet? Was empfiehlt sich da?



  • Hab dein Beispiel nachgebaut, also hier läufts ( ohne dein Array).

    Ändert sich width/height?

    TPaintBox ginge auch.



  • Kannst du mal deinen Code zeigen?

    Width/Height setze ich eigentlich nur direkt im Konstruktor. Von daher verstehe ich nciht, warum das "zusammenklappt"



  • Die Klasse ist so übernommen wie bei deinem Posting.

    im Header des Forms steht lediglich noch

    private:
        Feld* feld;
    public:		
        __fastcall TForm1(TComponent* Owner);
        __fastcall ~TForm1(void);
    

    Naja, Zeiger und Destruktor. 😉 Restlicher Code s. oben

    Bei Programmstart ist ein rotes Quadrat gezeichnet.



  • Sehr seltsam

    An was könnte das denn noch liegen?

    Selbst wenn ich das Objekt von außerhalb "bezeichne", als nach dem Konstruktor, ist es plötzlich auf 0x0px geklappt. Und wenn ich das Fenster groß ziehe, ist trotzdem nix drauf gezeichnet



  • Überprüfe einfach mal mit dem Debugger die Werte Width und Height.



  • Passt alles...

    Also ich bin ratlos



  • Eventuell solltest du nun doch etwas mehr posten, vllt. kommen wir der Sache auf die Spur.

    mfg
    kpeter



  • Ja also ich habe jetzt noch ein bisschen herumprobiert.

    Habe ein Label erstellt und das versucht:

    this->lb->Canvas->Pen->Color = clBlack;
      this->lb->Canvas->Brush->Color = clBlack;
      this->lb->Canvas->Rectangle(5,5, 10,10);
      this->lb->Canvas->Refresh();
      this->lb->Repaint();
      this->lb->Refresh();
    

    Es passiert: NICHTS

    Ist mein ganzes Projekt kaputt oder wie? find ich sehr sehr komisch...

    Was mich auch gewunder hat, ist, dass der Borland Builder das neue Label nicht autmoatisch in die Klassendefinition eingefügt hat:

    TLabel *lb;
    

    musste ich selbst in TForm1 einfügen.

    Also sieht es so aus, als sei mein Compiler irgendwie kaputt?


Anmelden zum Antworten