Autor |
Beitrag |
M.Mü
      
Beiträge: 68
|
Verfasst: Mo 24.04.06 23:02
Hallo,
versuche mich gerade an meiner ersten eigenen Komponente ILSpeedButton: ein SpeedButton, dem man über eine ImageList Bitmaps zuweisen kann. Nur bin ich mir net ganz sicher, ob die Programmierung dessen in Ordnung ist.
Was mir zum Beispiel aufgefallen ist: Immer wenn ich im Objektinspektor die ImageList zuweise, wird dort nicht der Name der ImageList angezeigt, sondern "ILSpeedButton1." also der Name des SpeedButtons mit einem Punkt.
Hier der Quellcode:
Die auskommentierten Zeilen mit "oZ" ist eine Version gewesen, in der ich keinen Zeiger sondern ein Objekt FImageLIst verwendet hatte, allerdings mit dem gleichen Ergebnis.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84:
| unit ILSpeedButton;
interface
uses Windows, Messages, SysUtils, Classes, Controls, Buttons, Dialogs, Graphics;
type TILSpeedButton = class(TSpeedButton) private FImageIndex: Byte; FImageList: ^TImageList; procedure SetImageIndex(ImageIndex: Byte); procedure SetImageList(ImageList: TImageList); function GetImageList: TImageList; protected public constructor Create(AOwner: TComponent);override; destructor Destroy;override;
published property ImageIndex: Byte read FImageIndex write SetImageIndex; property ImageList: TImageList read GetImageList write SetImageList; end;
procedure Register;
implementation
procedure Register; begin RegisterComponents('eigene Komponente', [TILSpeedButton]); end;
constructor TILSpeedButton.Create(AOwner: TComponent); begin inherited; end;
destructor TILSpeedButton.Destroy; begin inherited; end;
procedure TILSpeedButton.SetImageIndex(ImageIndex: Byte); var Bitmap: TBitmap; begin if FImageList <> nil then begin Bitmap := TBitmap.Create; FImageList.GetBitmap(ImageIndex,Bitmap); Glyph.Assign(Bitmap); Bitmap.Free; FImageIndex := ImageIndex; end; end;
function TILSpeedButton.GetImageList: TImageList; begin result := FImageList^; end;
procedure TILSpeedButton.SetImageList(ImageList: TImageList); begin FImageList := @ImageList; SetImageIndex(0); end;
end. |
Worin kann der Fehler liegen?
VG M.Mü
Moderiert von raziel: Code- durch Delphi-Tags ersetzt
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Di 25.04.06 08:16
Hmmm.. eine Variable vom Type TImageList ist bereits ein Zeiger auf ein Objekt. Weiterhin kopierst du die ImageList in der Set-Methode, das muss eigentlich auch nicht sein. Du willst doch schließlich, das sich alle Änderungen der ImageList sofort auf den Speedbutton auswirken, insofern ist die statische Zuweisung and das Glyph des Speedbuttons auch nicht korrekt.
Ich hab die Sourcen grad nicht parat, aber ich denke, Du müsstest die Paint-methode überschreiben, um statt des Glyph die entsprechende Bitmap aus der Imagelist zu zeichnen.
Ansonsten denkst du imho einen Tick zu kompliziert mit deinen Bemühungen, die Eigenschaften lokal zu kopieren.
_________________ Na denn, dann. Bis dann, denn.
|
|
M.Mü 
      
Beiträge: 68
|
Verfasst: Di 25.04.06 22:21
Ich denke zu kompliziert? oh, jetzt bricht gerade ne Welt zusammen.  Nein, im ernst: Sieht so aus, als hätt ich etwas mehr Nachholbedarf als gedacht.
Die Set-Methode ist doch aber nötig, um das erste Bild zu setzen. Andernfalls müsst ich doch erst den Index beschreiben, um überhaupt ein Bild auf dem Button erscheinen zu lassen.
Wie kann ich die Zuweisung an das Glyph machen, wenn nicht so (also statisch).
Kannst Du mir es bitte erklären oder zumindest einen nützlichen Link geben.
Mein Quellcode schaut jetzt so aus:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72:
| unit ILSpeedButton;
interface
uses Windows, Messages, SysUtils, Classes, Controls, Buttons, Dialogs, Graphics;
type TILSpeedButton = class(TSpeedButton) private FImageIndex: Byte; FImageList: TImageList; procedure SetImageIndex(ImageIndex: Byte); procedure SetImageList(ImageList: TImageList); function GetImageList: TImageList; protected public constructor Create(AOwner: TComponent);override; destructor Destroy;override; published property ImageIndex: Byte read FImageIndex write SetImageIndex; property ImageList: TImageList read FImageList write SetImageList; end;
procedure Register;
implementation
procedure Register; begin RegisterComponents('M.Mue', [TILSpeedButton]); end;
constructor TILSpeedButton.Create(AOwner: TComponent); begin inherited; end;
destructor TILSpeedButton.Destroy; begin inherited; end;
procedure TILSpeedButton.SetImageIndex(ImageIndex: Byte); var Bitmap: TBitmap; begin if FImageList <> nil then begin Bitmap := TBitmap.Create; FImageList.GetBitmap(ImageIndex,Bitmap); Glyph.Assign(Bitmap); Bitmap.Free; FImageIndex := ImageIndex; end; end;
function TILSpeedButton.GetImageList: TImageList; begin result := FImageList; end;
procedure TILSpeedButton.SetImageList(ImageList: TImageList); begin FImageList := ImageList; SetImageIndex(0); end;
end. |
Hab Dank.
VG M.Mü
Moderiert von AXMD: Code- durch Delphi-Tags ersetzt
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Di 25.04.06 22:41
Merk dir doch einfach den ImageIndex und die ImageList. Ich hab mir den Quellcode eines TSpeedbutton nicht angeschaut, aber prinzipiell solltest du eben auf die Glyph-Eigenschaft verzichten und entweder die Get-Methode des Glyphs überschreiben, sodaß beim Get immer das bild aus der ImageList genommen wird. Wenn das nicht geht, musst Du die Paint-Methode eben überschreiben und dann nicht das Glyph auf den Button pinseln, sondern das Bild aus der Imagelist.
_________________ Na denn, dann. Bis dann, denn.
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Fr 16.06.06 14:50
warum eigentlich eine eigene Komponente? Wie wärs so:
ImgList.GetBitmap(0,Form1.SpeedButton1.Glyph);
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
|