AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wie binde ich diesen Code ein? (ColorButton)

Ein Thema von juergen · begonnen am 22. Dez 2005 · letzter Beitrag vom 21. Feb 2008
Antwort Antwort
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.164 Beiträge
 
Delphi 11 Alexandria
 
#1

Wie binde ich diesen Code ein? (ColorButton)

  Alt 22. Dez 2005, 22:19
Hallo zusammen,
ich habe im SwissDelphiCenter nachfolgenden Source gefunden, welchen ich gern austesten würde.
Nur weiß ich nicht wie ich das einbinden muss, damit ich diesen Button entsprechend erzeugen kann.
Ich habe probiert das als neue VCL Komponente zu installieren, aber unter Samples finde ich da nichts neues...

Da ich sowas noch nie gemacht habe, weiß ich nicht wo ich was machen machen muss...
Kann mir hier jemand die grundlegende Vorgehensweise erklären?
Danke schon mal vorab!

Delphi-Quellcode:
unit ColorButton;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, StdCtrls, Buttons, ExtCtrls;

type
  TColorButton = class(TButton)
  private
    FBackBeforeHoverColor: TColor;
  private
    FCanvas: TCanvas;
    IsFocused: Boolean;
    FBackColor: TColor;
    FForeColor: TColor;
    FHoverColor: TColor;
    procedure SetBackColor(const Value: TColor);
    procedure SetForeColor(const Value: TColor);
    procedure SetHoverColor(const Value: TColor);

    property BackBeforeHoverColor: TColor read FBackBeforeHoverColor
      write FBackBeforeHoverColor;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
    procedure WndProc(var Message: TMessage); override;

    procedure SetButtonStyle(Value: Boolean); override;
    procedure DrawButton(Rect: TRect; State: UINT);

    procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
    procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
    procedure CNMeasureItem(var Message: TWMMeasureItem); message CN_MEASUREITEM;
    procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

  published
    property BackColor: TColor read FBackColor write SetBackColor default clBtnFace;
    property ForeColor: TColor read FForeColor write SetForeColor default clBtnText;
    property HoverColor: TColor read FHoverColor write SetHoverColor default clBtnFace;

  end;

procedure Register;

implementation


constructor TColorButton.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FCanvas := TCanvas.Create;
  BackColor := clBtnFace;
  ForeColor := clBtnText;
  HoverColor := clBtnFace;
end; (*Create*)

destructor TColorButton.Destroy;
begin
  FCanvas.Free;
  inherited Destroy;
end; (*Destroy*)

procedure TColorButton.WndProc(var Message: TMessage);
begin
  if (Message.Msg = CM_MOUSELEAVE) then
  begin
    BackColor := BackBeforeHoverColor;
    Invalidate;
  end;
  if (Message.Msg = CM_MOUSEENTER) then
  begin
    BackBeforeHoverColor := BackColor;

    BackColor := HoverColor;
    Invalidate;
  end;

  inherited;
end; (*WndProc*)

procedure TColorButton.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do Style := Style or BS_OWNERDRAW;
end; (*CreateParams*)



procedure TColorButton.SetButtonStyle(Value: Boolean);
begin
  if Value <> IsFocused then
  begin
    IsFocused := Value;
    Invalidate;
  end;
end; (*SetButtonStyle*)

procedure TColorButton.CNMeasureItem(var Message: TWMMeasureItem);
begin
  with Message.MeasureItemStruct^ do
  begin
    itemWidth := Width;
    itemHeight := Height;
  end;
end; (*CNMeasureItem*)

procedure TColorButton.CNDrawItem(var Message: TWMDrawItem);
var
  SaveIndex: Integer;
begin
  with Message.DrawItemStruct^ do
  begin
    SaveIndex := SaveDC(hDC);
    FCanvas.Lock;
    try
      FCanvas.Handle := hDC;
      FCanvas.Font := Font;
      FCanvas.Brush := Brush;
      DrawButton(rcItem, itemState);
    finally
      FCanvas.Handle := 0;
      FCanvas.Unlock;
      RestoreDC(hDC, SaveIndex);
    end;
  end;
  Message.Result := 1;
end; (*CNDrawItem*)

procedure TColorButton.CMEnabledChanged(var Message: TMessage);
begin
  inherited;
  Invalidate;
end; (*CMEnabledChanged*)

procedure TColorButton.CMFontChanged(var Message: TMessage);
begin
  inherited;
  Invalidate;
end; (*CMFontChanged*)


procedure TColorButton.SetBackColor(const Value: TColor);
begin
  if FBackColor <> Value then
  begin
    FBackColor := Value;
    Invalidate;
  end;
end; (*SetButtonColor*)

procedure TColorButton.SetForeColor(const Value: TColor);
begin
  if FForeColor <> Value then
  begin
    FForeColor := Value;
    Invalidate;
  end;
end; (*SetForeColor*)

procedure TColorButton.SetHoverColor(const Value: TColor);
begin
  if FHoverColor <> Value then
  begin
    FHoverColor := Value;
    Invalidate;
  end;
end; (*SetHoverColor*)

procedure TColorButton.DrawButton(Rect: TRect; State: UINT);
var
  Flags, OldMode: Longint;
  IsDown, IsDefault, IsDisabled: Boolean;
  OldColor: TColor;
  OrgRect: TRect;
  rgn: HRGN;
begin
  OrgRect := Rect;
  Flags := DFCS_BUTTONPUSH or DFCS_ADJUSTRECT;
  IsDown := State and ODS_SELECTED <> 0;
  IsDefault := State and ODS_FOCUS <> 0;
  IsDisabled := State and ODS_DISABLED <> 0;
  if IsDown then Flags := Flags or DFCS_PUSHED;
  if IsDisabled then Flags := Flags or DFCS_INACTIVE;

  if IsFocused or IsDefault then
  begin
    FCanvas.Pen.Color := clWindowFrame;
    FCanvas.Pen.Width := 1;
    FCanvas.Brush.Style := bsClear;

    FCanvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
    InflateRect(Rect, - 1, - 1);
  end;

  if IsDown then
  begin
    FCanvas.Pen.Color := clBtnShadow;
    FCanvas.Pen.Width := 1;
    FCanvas.Brush.Color := clBtnFace;
    FCanvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
    InflateRect(Rect, - 1, - 1);
  end
  else
  begin
    DrawFrameControl(FCanvas.Handle, Rect, DFC_BUTTON, Flags);
  end;

  if IsDown then OffsetRect(Rect, 1, 1);

  OldColor := FCanvas.Brush.Color;
  FCanvas.Brush.Color := BackColor;
  FCanvas.FillRect(Rect);
  FCanvas.Brush.Color := OldColor;
  OldMode := SetBkMode(FCanvas.Handle, TRANSPARENT);
  FCanvas.Font.Color := ForeColor;
  if IsDisabled then
    DrawState(FCanvas.Handle, FCanvas.Brush.Handle, nil, Integer(Caption), 0,
    ((Rect.Right - Rect.Left) - FCanvas.TextWidth(Caption)) div 2,
    ((Rect.Bottom - Rect.Top) - FCanvas.TextHeight(Caption)) div 2,
      0, 0, DST_TEXT or DSS_DISABLED)
  else
    DrawText(FCanvas.Handle, PChar(Caption), - 1, Rect,
      DT_SINGLELINE or DT_CENTER or DT_VCENTER);

  SetBkMode(FCanvas.Handle, OldMode);

  if IsFocused and IsDefault then
  begin
    Font.Style := Font.Style + [fsBold];
  end
  else
  begin
    Font.Style := Font.Style - [fsBold];
  end;

  rgn := CreateRoundRectRgn(3,3,Width - 2,Height - 2,10,10);
  SetWindowRgn(Handle, rgn, True);
end; (*DrawButton*)

procedure Register;
begin
  RegisterComponents('mhm', [TColorButton]);
end;




end.
//enjoye it
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Scorpion3000

Registriert seit: 18. Apr 2004
47 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Wie binde ich diesen Code ein? (ColorButton)

  Alt 22. Dez 2005, 22:28
Hallo Juergen!

Öffne in Delphi eine neue Unit -> kopierst den Quelltext hinein -> speicherst sie -> gehst dann auf Komponente -> Komponente installieren -> Durchsuchen -> wählst die Unit aus -> Ok

In der Komponenten-Registerkarte "mhm" hast dann die neue Komponente "TColorButton".

Mfg Scorpion3000
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.164 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Wie binde ich diesen Code ein? (ColorButton)

  Alt 22. Dez 2005, 23:27
Hallo Scorpion3000!
ich weiß nicht was ich da falsch mache...
2 Sachen probiere ich:
1.)
Unter D5 versuche ich folgendes:
| Neu -> Unit -> Quelltext reinkopiert und abgespeichert als ColorButton.pas.
Dann unter | Komponente -> Neue Komponente unter Vorfahrtyp "TButton" ausgewählt.
Dann steht Klassennamen "TButton1".
Dann unter "Name der Unit" die zuvor abgespeicherte Unit ausgewählt...

Anschließend öffnet sich der Editor mit der Unit "TButton"....
Der Button ist in der Toolbar nicht zu finden...

2.)
| Komponente -> Komponente installieren.
Unter dem Reiter "Neues Package" wähle ich unter "Name der Unit" wieder meine zuvor abgespeicherte Unit "ColorButton.pas" aus.
Dann schreibe ich einen Namen des neuen Packages (MyColorButton)

Dann öffnet sich wieder die Unit und es kommt ein Fehler:
MayColorButton.bpl konnte nicht erzeugt werden....


Hoffnungsvolle Grüße //Jürgen
Jürgen
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#4

Re: Wie binde ich diesen Code ein? (ColorButton)

  Alt 22. Dez 2005, 23:34
Hi!

Habs grad bei mir mit erfolg gemacht.
Da ganze als Unit gespeichert. Wichtig: mit dem Namen Colorbutton.pas

Dann in Delphi:
Component-->Install Component-->into existing package (am besten dclusr auswählen)-->bei "unit file name" auf browse klicken, die colorbutton.pas laden-->ok klicken --> fertig

ciao Frederic
Frederic Kerber
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.164 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Wie binde ich diesen Code ein? (ColorButton)

  Alt 23. Dez 2005, 19:08
Hallo!
Habe mir mal alles durchgelesen was ich zum Thema Komponenten installieren finden konnte.

Ist doch eigentlich ganz einfach!
Leider macht mir anscheinend mein Delphi da einen Strich durch die Rechnung.

Während des Compilierens erscheint immer ein Fehler: (inhaltlich) ...*.bpl konnte nicht erstellt werden

Da muss ich mal schauen was mit meinem Delphi nicht stimmt.

Allen erholsame und schöne Feiertage!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Benutzerbild von SaFu
SaFu

Registriert seit: 8. Nov 2006
1.360 Beiträge
 
Delphi 10.3 Rio
 
#6

Re: Wie binde ich diesen Code ein? (ColorButton)

  Alt 21. Feb 2008, 14:12
Hi

Habe gerade diesen Button gefunden benutze ihn auch mittlerweile.

Jetzt ist mir aufgefallen das dieser Button garkein Vista style annimmt kennt da jemand eine Komponente die sich wie der Sandard Button verhält, bei dem man aber auch die Farben ändern kann???

Gruss Sascha
"... Wie gesagt, die Nutzer von 10, 12, 14 Zoll Display's werden deine Seite nicht in voller Pracht sehen können, ...

Surft Ihr mit dem Taschenrechner?"
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:06 Uhr.
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