![]() |
Tpanel+Tspeedbutton+Imagelist zu einer Komponente machen!
Hallo
Ich hab folgendes vor. ICh will Tspeedbuttons auf einem Tpanel haben. Ich will die Groupindex verändern und das Bild des TSpedbutton soll aus einer TImagelist geladen werden. Kann man in DelphiKomponenten Zusammenfassen? Ich hätte am liebsten eine komponente, die ich wie ein panel auf die Form ziehe und dann die speedbuttons erstelle. Diese sollen dann auf der Form verteilbar sein und dann möchte ich den Speedbuttons Bilder aus einer Imagelist zuweisen. Da ich keine Erfahrung mit Komponeneten habe würde ich gern euere Meinung erfragen, Wie viel Aufwand das ist und wie ich anfangen soll? Gruß snow |
Re: Tpanel+Tspeedbutton+Imagelist zu einer Komponente machen
Lesen bilder,
![]() |
Re: Tpanel+Tspeedbutton+Imagelist zu einer Komponente machen
Kenn ich schon!
Hab auch schon das Grundgerüst für einen NeuenSpeedbutton Ich hab ihn vom TSpeedbutton abgeleitet und die Propertys Imageindex : Integer; Images : TImagelist; hinzugefügt. So das klappt, doch wie kann ich jetzt auf eine änderung des ImageIndex reagieren.(Der soll dann in der Imagelist nach schlagen und die Bitmap holen, und sie im Glyph abspeichern. Wie das unter normalen umständen aussieht weis ich. Aber wie kann ich delphi sagen, das es auf änderungen reagieren soll(am liebsten ohne Timer). Gruß snow |
Re: Tpanel+Tspeedbutton+Imagelist zu einer Komponente machen
Delphi-Quellcode:
property + F1
property ImageIndex: Integer read FImageindex write SetImage;
ImageList.GetBitmap + F1 |
Re: Tpanel+Tspeedbutton+Imagelist zu einer Komponente machen
Was ist Setimage?
ne procedure? Gruß snow |
Re: Tpanel+Tspeedbutton+Imagelist zu einer Komponente machen
Zitat:
|
Re: Tpanel+Tspeedbutton+Imagelist zu einer Komponente machen
Das hab ich jetzt hinbekommen. ICh hab jetzt eine procedure die auf das schreiben auf Imageindex reagiert.
Doch wenn ich in der das hier amchen lasse, dann
Delphi-Quellcode:
bekomm ich ne zugriffsverletzung beim lesen von
begin
// Try tmpbmp :=Tbitmap.create; FImages.GetBitmap(1,tmpbmp); tmpbmp.Free; except end; 00000000000C. was nun? In der Imagelist gibt es auch ein image mit dem index von 1. Gruß Snow |
Re: Tpanel+Tspeedbutton+Imagelist zu einer Komponente machen
(a) Ist FImages denn createt?
(b) Es geht auch ohne tmpBmp:
Delphi-Quellcode:
begin
Try FImages.GetBitmap(1,SpeedButton.Glyph); except end; end; |
Re: Tpanel+Tspeedbutton+Imagelist zu einer Komponente machen
FImages ist mit der Property Images verknüpft, welche eine Timagelist enthält.
Diese ist im OI ausgewählt und befindet sich auf der Form. Gruß snow |
Re: Tpanel+Tspeedbutton+Imagelist zu einer Komponente machen
kommt der Fehler auch, wenn Du meine Variante, also direkt über Glyph, auch?
|
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 01:40 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