Thema: Delphi Eigene Button Komponente

Einzelnen Beitrag anzeigen

Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#36

Re: Eigene Button Komponente

  Alt 5. Mai 2007, 02:42
1) Leite am besten von TButtonControl oder TWinControl ab. Direkt von TButton abzuleiten ist eher weniger elegant, zumindest aber ist die VCL so konstruiert, dass es zu den meisten Standard-Controls eine "Custom"-Variante gibt, die direkter Vorfahr der bekannten Komponenten ist. An manchen Stellen in der OH wird empfohlen, von diesen statt der eigentlichen Klassen abzuleiten.
Man hat durch das Design bedingt dann auch noch die Möglichkeit, einzelne Properties nicht zu publishen, wenn sie nicht benötigt werden.

2) Du bekommst deine AV beim laden eines Bitmaps sehr wahrscheinlich, weil du das Bitmap nicht erzeugt hast. Jeder nicht-elementare Datentyp (von Records und Arrays mal abgesehen) muss erzeugt werden, sonst gibts auffe Rübe
Delphi-Quellcode:
type
  TMyButton = class(TWinControl)
  private
    FBitmap: TBitmap;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

implementation

constructor TMyButton.Create(AOwner: TComponent);
begin
  inherited;
  FBitmap := TBitmap.Create;
end;

destructor TMyButton.Destroy;
begin
  FBitmap.Free;
  inherited;
end;
Damit wird dein Bitmap mit Erstellung deines Buttons erzeugt, und beim Entfernen mit entfernt. Grundsätzlich gilt: Was man im Konstruktor erzeugt, muss im Destruktor auch wieder freigegeben werden. (Es gibt einige wenige Ausnahmen, aber das ist idR sehr speziell und erstmal völlig unwichtig hier.)

3) Lass dich von Hansas Erbsenzählerei nicht verunsichern

4) Wenn du, wie vorgeschlagen, von TWinControl ableitest, brauchst du dir um OwnerDraw keine Gedanken zu machen. Einfach die Methode "Paint" überschreiben, und in dieser tun, was du willst. Zum Beispiel ein Bitmap auf den Canvas zeichnen!
Ähnlich kannst du mit den Click-Handlern verfahren, wobei du dort zwei Möglichkeiten hast, ein anderes Bild zu malen. Entweder du zeichnest direkt im Handler, oder du setzt eine Statusvariable, und löst einen Repaint aus. In der Paint-Methode müsstest du dann diese Variable auswerten, und je nach Status das jeweilige Bitmap zeichnen. (Bei der ersten Variante bin ich nicht sicher, ob dir von sonstwo ausgelöste Repaints das zweite Bitmap gleich wieder mit dem im Paint gezeichneten übernageln.)
Hier würde es übrigends eher Sinn machen, MouseDown/Up zu verwenden, und nicht Click. Ein Click ist immer die Kombination aus Down und Up, nicht nur einfach Down.

5) Für eine eigene Button-Komponente von TButton ableiten macht wenig Sinn, we du die Grafik komplett selber übernimmst, und keine spezifischen Eigenschaften von Windows-Buttons brauchst (ModalResult z.B.). TGraphicControl als Vorfahr hingegen halte ich für nicht ausreichend, mit Blick auf spätere Verwendung und Erweiterung. Ein GraphicControl hat kein Windows-Handle, womit einem bereits die Möglichkeit genommen wäre in einer späteres Ausbaustufe u.U. mit Regions zu arbeiten um nicht-rechteckige Controls zu erstellen. So nett die Idee aber jetzt auch klingt: Kümmer dich frühstens um sowas, wenn du das minimale Gerüst fertig hast. Das ist zwei Schritte in die Zukunft gedacht.

6) Fröhlich Wochenend
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat