![]() |
Re: Tpanel+Tspeedbutton+Imagelist zu einer Komponente machen
hab was herausgefunden.
Ich hab derzeit folgenden Code.
Delphi-Quellcode:
uses
SysUtils, Classes, Controls, Buttons, Graphics; type TSpeedButton1 = class(TSpeedButton) private Fimageindex : Integer; tmpbmp : Tbitmap; procedure Setimage(Value: Integer); { Private-Deklarationen } protected { Protected-Deklarationen } public FImages : Timagelist; { Public-Deklarationen } published property Images : Timagelist read FImages write Fimages; property Imageindex : Integer read FImageindex write SetImage; { Published-Deklarationen } end;
Delphi-Quellcode:
procedure Tspeedbutton1.Setimage(Value: Integer);
begin // Fimages:= Timagelist.Create(nil); Fimages.CreateSize(48,48); Fimages.Clear; tmpbmp:=tbitmap.Create; //tmpbmp.LoadFromFile('i:/delphi/Buttons/button_play.bmp'); //Fimages.Add(tmpbmp,tmpbmp); tmpbmp.Free; FImages.GetBitmap(0,Glyph); Fimages.Free; end; wenn ich in die FImages von einer datei lade, dann klappt alles prima. Ich glaube das Fimages nicht richtig mit Images verknüft ist oder dass man das nicht mir Timagelist so machen darf. Anscheinend ist die Fimages lehr. Gruß snow Zitat:
|
Re: Tpanel+Tspeedbutton+Imagelist zu einer Komponente machen
Ein paar Tipps und Hinweise
(a) nenne Die Klasse zBsp: TSpeedButtonEx mit den Zahlen kommst du früher oder später durcheinander (b) verlagere FImages in den private Teil (c) benenne die Setter-proc von SetImage in SetImageIndex um (d) die ImageList musst Du von außen setzen (e)
Delphi-Quellcode:
{EDIT]
procedure TSpeedbutton1.SetImageIndex(Value: Integer);
begin if FImageIndex<>Value then begin FImageIndex := Value; if Assigned(FImages) then FImages.GetBitmap(FImageIndex,Glyph); end; end; (f) muss ja kommen, da FImages=nil ist |
Re: Tpanel+Tspeedbutton+Imagelist zu einer Komponente machen
1. Nicht die Property enthält die Instanz sondern FImages
2. Zeichnet er bevor diese Zuweisung getätigt worden ist? 3. Warum fragst du nur mal zur Sicherheit ab, ob FImages <> nil ist? 4. Denkst du daran die Methode ![]() 5. Wenn du FImages von aussen les- und schreibbar machst, dann kann dir jeder in die Suppe spucken und dir einfach einen nil Zeiger unterschieben. Von daher hast du 2 Möglichkeiten: entweder du hast eine lokale ImageList und kopierst dir bei Zuweisung den Inhalt (schlechte Lösung) oder du hast intern immer nur eine Referenz auf eine ImageList. Dann gilt Punkt 4 und zusätzlich noch Punkt 6! 6. Wenn du dir von aussen eine TImageList zuweisen lässt, dann lege keine TImageList Instanz in deiner Komponente an und gebe sie auch nicht frei! |
Re: Tpanel+Tspeedbutton+Imagelist zu einer Komponente machen
So ein erstes Bild.
Ich kann mit kroko1999's Code ein Bild auf den Button Zeichnen. Ihc hab auf ner form meinen SPeedbutton und einen SpinEdit. auf der ONChange-proc hab ich ein
Delphi-Quellcode:
So zwar zwar Kroko's code die Bmp korrect ein aber...
Speedbutton.ImageIndex:=SpinEdit.value;
Nur ein mal. wenn ich also den spinbutton weiter erhöhe dann tut sich leider nix. Obwohl Value korrekt übergeben wird.(als Caption:=inttostr(value)) klappts. Gruß snow (es ist mir eigendlich egal ob mir jemand in die suppe guggen kann, da der Quellcode sowiso veröffendlicht wird. Edit:// es hat geklappt man darf die Glyph nicht direkt aus der Imagelist laden, sondern muss den weg über eine lokale bmp machen. dann zeigt sich nur ein sehr sehr merkwürdiger effekt. Am anfang des programm sind die Images[0] und [1] übereinander auf dem glyph. sobalt man SpinEdit-changed ist nur noch das richtige da. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz