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 okWenns 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 WEBFRITZIIm 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