Graphics::TBitmap in eigener Komponente?



  • Hallo ihr.
    Wie bindet man ein Bitmap RICHTIG in eine eigene Komponente (also als
    Eigenschaft) ein? Also ich habe jetzt das Problem, dass wenn ich im Objekt-
    inspektor ein Bitmap auswähle, ich immer folgende Fehlermeldung erhalte:
    "Leinwand/Bild erlaubt kein Zeichen"
    Und ich denke mal, dass ich da irgendwas falsch gemacht habe oder?

    Ich habe die Eigenschaft folgermaßen deklariert:

    private:
        Graphics::TBitmap *FBitmap;
        void __fastcall SetBitmap(Graphics::TBitmap *);
    __published:
        __property Graphics::TBitmap *Bitmap = {read = FBitmap, write = SetBitmap};
    

    und in der Methode SetBitmap steht:

    void __fastcall TMultiButton::SetBitmap(Graphics::TBitmap *Bitmap)
    {
      FBitmap = Bitmap;
      Paint();
    }
    

    In der Paint-Methode steht auch bloß

    Canvas->Draw(Left - FDistance - FBitmap->Width, BitmapTop, FBitmap);
    

    Noch als Info: Auf dem Button steht dann auch noch die Caption!
    Die hab ich so deklariert:

    private:
            AnsiString FCaption;
            void __fastcall SetCaption(AnsiString);
    __published:
            __property AnsiString Caption  =
              {read = FCaption, write = SetCaption, nodefault};
    

    ...
    entdeckt hier jemand einen Fehler? Habe ich was vergessen oder irgendwas
    anderes?
    Ich danke euch schonmal für eure Mühen und Tipps, etc...

    MFG Aoeke



  • Die Methode SetBitmap() wird natürlich auch zur Entwurfszeit ausgeführt. Umgehen kannst du dies so:

    void __fastcall TMultiButton::SetBitmap(Graphics::TBitmap *Bitmap)
    {
       FBitmap = Bitmap;
       if( !ComponentState.Contains(csDesigning) )
          Paint();
    }
    


  • Danke erstmal,
    aber die Fehlermeldung taucht immer noch auf.
    Hast du oder jemand anderes noch eine andere Idee?
    Ach und nochwas: Wenn ich im Quelltext irgendein Bild lade, also wenn das
    Programm läuft, taucht keine Fehlermeldung auf, und sonst macht der auch
    alles richtig.
    Danke.

    MFG Aoeke



  • Hm... dann schreib mal ganz an den Anfang deiner Paint()-Methode:

    if( ComponentState.Contains(csDesigning) )
       return;
    

    und sag bescheid, ob's geklappt hat. Dann sind wir schonmal einen Schritt weiter.



  • Nee klappt auch nicht.
    Jetzt zeichnet der so ziemlich gar nichts mehr und die Fehlermeldung taucht
    auch noch auf. Ist das alles kompliziert. 😞

    MFG Aoeke



  • 😕 Und wenn du das Paint() im SetBitmap() weglässt?...



  • Naja, dass gute ist jetzt, dass das Bitmap tatsächlich schon angezeigt wird,
    wenn ich eins im Objektinspektor auswähle, das schlechte, dass die Fehler-
    meldungen dann gar nicht mehr aufhören und ich gerade von der RESET-Taste auf
    meinem Computer gebrauch machen musste... 😞
    Ich versuche das jetzt mal, indem ich die Befehle, mit denen ich das Bitmap
    zeichne, gleich in SetBitmap() schreibe. Mal sehen vielleicht funktionierts
    ja... 😕

    MFG Aoeke



  • Ganz bestimmt nicht. Wenn der Code nicht allzulang ist, dann poste ihn doch hier mal.



  • Der ist aber lang.
    Mit Header-Datei so ca. 500 Zeilen...
    Aber ich probier jetzt mal noch was anderes. Wenns funktioniert schreib ichs hier rein, wenn nicht lass ichs sein.

    MFG Aoeke



  • Also die Meldung "Leinwand/Bild erlaubt kein Zeichen" kam wirklich nur, wenn du das Bitmap im Objektinspektor neu gesetzt hast, ja?



  • jup.



  • Ok hat nicht funktioniert... Schade.
    Naja ich habe das jetzt einfach aus dem Objektinspektor rausgenommen. Wenn
    das Programm läuft, kann man ja immer noch ein Bild auswählen.
    Danke für deine Hilfe @ WebFritzi!

    MFG Aoeke



  • Ich glaub' es liegt daran:

    Du weist dem FBitmap ein Bild zu und hast noch kein Objekt!!! :o
    Du mußt in Constructor des Objektes ein TBitmap mit new erzeugen, natürlich auch deleten im Destructor!
    Der Tip von WEBFRITZI mit csDesigning ist auch ok

    Wenns klappt, weiss keiner warum?



  • Natürlich. Das isses. Erst im Konstruktor FBitmap auf NULL setzen und dann

    void __fastcall TMultiButton::SetBitmap(Graphics::TBitmap *Bitmap)
    {
       if(!FBitmap)
          FBitmap = new Graphics::TBitmap;
       FBitmap->Assign(Bitmap);
       Paint();
    }
    


  • Hallo WEBFRITZI

    Im SetBitmap würd' ich das nich tun!!! 😡 😡 😡

    (bei jedem neuen Bild wird neues Objekt erzeugt! (Wer soll die am Ende freigeben?)

    new nur im Constructor der Kompo! 😃

    In SetBitmap nur Assign

    [ Dieser Beitrag wurde am 22.02.2003 um 22:03 Uhr von DerAltenburger editiert. ]



  • Original erstellt von DerAltenburger:
    **Hallo WEBFRITZI

    Im SetBitmap würd' ich das nich tun!!! 😡 😡 😡

    (bei jedem neuen Bild wird neues Objekt erzeugt! (Wer soll die am Ende freigeben?)

    new nur im Constructor der Kompo! 😃

    In SetBitmap nur Assign
    **

    NEIN! Schau mal das kleine if in meinem Code an wie es dich anlächelt. 😉



  • Ok, bin halt kurzsichtig!!! 🕶

    Haste wieder Recht,
    Asche auf's Haupt! 🙄



  • Original erstellt von DerAltenburger:
    Ok, bin halt kurzsichtig!!! 🕶

    Biste echt? 😃



  • Hallo.
    Großes Dankeschön euch beiden. 😃
    Ich hatte vergessen zu sagen, das ich das Bitmap schon mit new im Constructor
    erstellt habe, aber womit der wahrscheinlich seine Probleme hatte war dies:

    FBitmap = Bitmap;
    

    Das habe ich jetzt mal durch

    FBitmap->Assign(Bitmap)
    

    ersetzt und es funktioniert!
    Also danke ihr beiden. 😃 😃

    MFG Aoeke


Anmelden zum Antworten