Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Eigene Button Komponente (https://www.delphipraxis.net/91147-eigene-button-komponente.html)

Apollonius 4. Mai 2007 22:03

Re: Eigene Button Komponente
 
Dass nur deine eigene Grafik gezeichnet wird? Verstehe ich was falch oder kann/sollte man das mit TImage machen?

.chicken 4. Mai 2007 22:21

Re: Eigene Button Komponente
 
Wieso denn mit TImage? Warum kann ich das nicht einfach mit TBitmap machen? Brauche eigentlich nur Bitmaps!

mkinzler 4. Mai 2007 22:29

Re: Eigene Button Komponente
 
Er meint eine TImage statt TButton

.chicken 4. Mai 2007 22:36

Re: Eigene Button Komponente
 
Hm...das klingt eigentlich logisch... :D
Aber wäre das nicht das gleiche wie mit dem GraphicControl? Da meinte doch auch wer ich sollte das nicht verwenden!

Hansa 5. Mai 2007 00:54

Re: Eigene Button Komponente
 
Zitat:

Zitat von .chicken
Aber wäre das nicht das gleiche wie mit dem GraphicControl? Da meinte doch auch wer ich sollte das nicht verwenden!

Das war ich. :P Aus folgendem Grund : Rad nicht neu erfinden !

dizzy 5. Mai 2007 02:42

Re: Eigene Button Komponente
 
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 :P

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 :spin2:

elundril 5. Mai 2007 07:20

Re: Eigene Button Komponente
 
ähhhm wenn ich da auch was sagen darf: Ich würd nicht Bitmap nehmen sondern TGraphic oder Tpicture weil man dann jedes Bildformat reinladenkann das Delphi kennt. (z.B: Bitmaps, Jepgs, usw.)

korrigiert mich bitte wenn ich falsch liege!

lg el

.chicken 5. Mai 2007 09:50

Re: Eigene Button Komponente
 
Ja, aber ich brauche erstmal nur Bitmap, aber das kann ich ja hinterher noch erweitern! ;-)

Ok danke für eure Hilfe! Dann weiss ich jetzt einigermaßen was ich machen muss allerdings:
Die Bitmaps habe ich schon createt und zwar sowohl die Property als auch das dazugehörige Bild (also Bild und FBild sozusagen).
Die create ich beide im Constructor meines Buttons aber ich versuch nu erstma weiter ;-)

.chicken 7. Mai 2007 22:41

Re: Eigene Button Komponente
 
Sorry, aber brauche hier doch nochmal eure Hilfe!
Also habe folgenden Code:
Delphi-Quellcode:
unit GraphicButton;

interface

uses
  SysUtils, Classes, Controls, Graphics, Types;

type
  TGradientStyle = (gsVertical, gsHorizontal);

  TGraphicButton = class(TCustomControl)
  private
    FBorderSize: Integer;
    FBorderColor,
    FColor: TColor;
    FPicture: TBitmap;
    property Canvas;
    procedure SetPicture(Value: TBitmap);
  protected
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Repaint; override;
  published
    property BorderSize: Integer read FBorderSize write FBorderSize;
    property BorderColor: TColor read FBorderColor write FBorderColor;
    property Color: TColor read FColor write FColor;
    property Picture: TBitmap read FPicture write SetPicture;
  end;

procedure Register;

implementation

constructor TGraphicButton.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  FPicture := TBitmap.Create;
  Picture := TBitmap.Create;
end;

destructor TGraphicButton.Destroy;
begin
  FPicture.Free;
  Picture.Free;
end;

procedure TGraphicButton.Repaint;
begin
  Canvas.Pen.Width := BorderSize;
  Canvas.Pen.Style := psInsideFrame;
  Canvas.Pen.Color := BorderColor;
  Canvas.Brush.Color := Color;
  Canvas.Rectangle(0, 0, Width, Height);
end;

procedure TGraphicButton.SetPicture(Value: TBitmap);
begin
  FPicture.Assign(Value);
  Repaint;
end;


procedure Register;
begin
  RegisterComponents('Eigene', [TGraphicButton]);
end;

end.
Funktioniert aber garnicht! Erstens kann ich immernoch kein Bild laden! Die Prozedur SetPicture wird allerdings aufgerufen, weil danach der Button gemalt wird (mit Farbe). Außerdem wird sonst mein Button nicht gezeichnet, also auch nicht im kompilierten Programm.

Beim Beenden des Programms wird ein Fehler ausgegeben, was, denke ich mal, am Free der Images liegt...

TStringlist 8. Mai 2007 11:38

Re: Eigene Button Komponente
 
Die eigentliche "Picture"-Property hat da im Constructor und Destructor nichts verloren (...weil Properties natürlich als solches nicht createt bzw. gefreet zu werden brauchen). Außerdem fehlt im Destructor noch ein "inherited" als letzte Zeile.

Btw, die <property canvas>-Zeile im Deklarationsteil deiner Componente kannst Du dir sparen. Auf das TCustomControl-Canvas kannst Du auch ohne die einfach so zugreifen.

..und im Übrigen würde ich auch gleich den "PaintHandler" überschreiben, anstatt das Repaint. Imo hast Du nur mit einem überschriebenen "PaintHandler" nachher die volle Kontrolle über das, was dann bei einer jeden ankommenden wm_paint-Message zur Darstellung deines Buttons (und seiner Zustände) so alles zusammengemalt werden muss, als da wäre z.B.: Grundfläche initialisieren, die unterschiedlichen Rahmen (ob gedrückt o. nicht), eine Caption oder (wie bei dir) ein Picture, einen Focusring...


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:14 Uhr.
Seite 4 von 5   « Erste     234 5      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz