Delphi-PRAXiS
Seite 1 von 2  1 2      

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 TCategoryPanelGroup modifizieren (https://www.delphipraxis.net/159562-tcategorypanelgroup-modifizieren.html)

Keks 2. Apr 2011 12:53

TCategoryPanelGroup modifizieren
 
Ich würde gerne die in meinem Delphi XE Pro verfügbare Komponente TCategoryPanelGroup verwenden. Diese erfüllt fast alle Anforderungen, die ich benötige.
Allerdings gefallen mir zwei visuelle Aspekte nicht, die ich gerne ändern würde. Zum einen bleibt ein kleiner Abstand, wenn ein Panel zusammengeklappt wurde und zum anderen würde ich gerne die Pfeile anders zeichnen.

Ich dachte, dazu könnte ich die Komponente ableiten und entsprechend anpassen. Allerdings habe ich scheinbar nicht den Sourcecode der Komponente. Laut Delphi befindet sich TCategoryPanelGroup in ExtCtrls, allerdings ist in der entsprechenden .pas keine Spur davon. Vermutlich also nur in der kompilierten .dcu.

Wie komme ich also an den Sourcecode? Oder kann ich das auch ohne bewerkstelligen?

himitsu 2. Apr 2011 12:58

AW: TCategoryPanelGroup modifizieren
 
Also bei mir im 2010 ist der Code vorhanden und ich denke im XE sollte er es auch sein.

Die Unit ist auch richtig, aber vielleicht solltest du dir mal TCustomCategoryPanelGroup genauer ansehen.

Tipp: Die Sache mit der Vererbung ist schon eine interessante Sache.

mkinzler 2. Apr 2011 13:00

AW: TCategoryPanelGroup modifizieren
 
Die Grafiken für die Pfeile kannst du so ändern, ohne eine eigene Komponente abzuleiten.

Keks 2. Apr 2011 13:27

AW: TCategoryPanelGroup modifizieren
 
Zitat:

Zitat von himitsu (Beitrag 1092601)
Also bei mir im 2010 ist der Code vorhanden und ich denke im XE sollte er es auch sein.

Jetzt wo Du es sagst, fällt mir auf, dass ich im Borland Ordner (meiner alten 2006er Installation) geschaut habe...
Im Embarcadero Ordner habe ich den Quelltext jetzt auch. :roll:

Zitat:

Zitat von mkinzler (Beitrag 1092602)
Die Grafiken für die Pfeile kannst du so ändern, ohne eine eigene Komponente abzuleiten.

Ich finde es ein bisschen komfortabler und ressourcenschonender, die simplen Icons direkt zu zeichnen, statt alle Variationen als Grafiken zu erstellen und zu importieren.

Also danke Euch beiden erstmal. Dann schaue ich mal, ob ich mit der Anpassung zurechtkomme. :)

himitsu 2. Apr 2011 14:15

AW: TCategoryPanelGroup modifizieren
 
Zitat:

Zitat von Keks (Beitrag 1092610)
fällt mir auf, dass ...

Strg+Linksklick auf TCategoryPanelGroup innerhalb deines XE und du landest meistens in der richtgen Unit und von dort kann man sich gleich zum TCustomCategoryPanelGroup weiterklicken :mrgreen:

Statt Strg+Linksklick kann man auch über's Kontextmenü "Deklaration suchen" des Codeeditors dort hin.

Keks 2. Apr 2011 14:27

AW: TCategoryPanelGroup modifizieren
 
Zitat:

Zitat von himitsu (Beitrag 1092618)
Strg+Linksklick auf TCategoryPanelGroup

Das geht imho aber nur, wenn der Pfad zu der pas in den Library-Angabenenthalten ist. Da bei mir der "[...]\RAD Studio\8.0\source\vcl" Pfad dort nicht drin war, hat das mit dem Klicken auch nicht funktioniert.

Ich komme allerdings gerade nicht weiter mit dem Überschreiben einer Funktion der Basiskomponente.
Ich habe jetzt folgendes:
Delphi-Quellcode:
unit MyCategoryPanelGroup;

interface

uses
  SysUtils, Classes, Controls, Forms, ExtCtrls, Graphics;

type
  TMyCategoryPanelGroup = class(TCategoryPanelGroup)
  private
    { Private declarations }
  protected
    { Protected declarations }
    procedure DrawHeaderChevron(ACanvas: TCanvas); override;
  public
    { Public declarations }
  published
    { Published declarations }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('My', [TMyCategoryPanelGroup]);
end;

procedure TCategoryPanelGroup.DrawHeaderChevron(ACanvas: TCanvas);
begin
  //
end;

end.
Damit sollte der Pfeil doch schon mal nicht gezeichnet werden, oder? Jedenfalls erhalte ich beim Kompilieren die Meldung: "Method 'DrawHeaderChevron' not found in base class". DrawHeaderChevron ist Teil von TCustomCategoryPanel von dem TCategoryPanel abgeleitet ist. Ich denke für meinen Fall ist es einfacher von TCategoryPanel abzuleiten statt von TCustomCategoryPanel, da ich sonst erst alles, was fehlt, selbst nachrüsten müsste.
Warum wird DrawHeaderChevron also nicht gefunden?

Keks 2. Apr 2011 22:02

AW: TCategoryPanelGroup modifizieren
 
Würde mich sehr freuen, wenn mir jemand zeigt, wie das geht!
Habe es selbst leider nicht herausfinden können. :(

Bummi 2. Apr 2011 22:50

AW: TCategoryPanelGroup modifizieren
 
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type

  TCategoryPanel = class(extctrls.TCategoryPanel)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    procedure DrawHeaderChevron(ACanvas: TCanvas);override;

    { Public declarations }
  published
    { Published declarations }
  end;

  TForm1 = class(TForm)
    CategoryPanelGroup1: TCategoryPanelGroup;
    CategoryPanel1: TCategoryPanel;
    CategoryPanel2: TCategoryPanel;
    Button1: TButton;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TCategoryPanelGroup }

procedure TCategoryPanel.DrawHeaderChevron(ACanvas: TCanvas);
begin
  //>> beispiel
  Acanvas.FillRect(Rect(0,0,width,Height));
end;

end.

Keks 2. Apr 2011 23:47

AW: TCategoryPanelGroup modifizieren
 
Vielen Dank, Bummi! Das funktioniert. :)

Aber wie komme ich jetzt noch an die Zustände wie FHeaderState oder FCollapsed bzw. weitere Attribute wie die gesetzten Farben (FPanelGroup.ChevronColor) heran?

Bummi 3. Apr 2011 07:17

AW: TCategoryPanelGroup modifizieren
 
Du musst Dir die Sachen einfach zusammensuchen, ich habe noch mal ein sinnfreies Beispiel angehängt...

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TCategoryPanel = class(extctrls.TCategoryPanel)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    procedure DrawHeaderChevron(ACanvas: TCanvas);override;
    property HeaderState;
    { Public declarations }
  published
    { Published declarations }
  end;
  TForm1 = class(TForm)
    CategoryPanelGroup1: TCategoryPanelGroup;
    CategoryPanel1: TCategoryPanel;
    CategoryPanel2: TCategoryPanel;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure TCategoryPanel.DrawHeaderChevron(ACanvas: TCanvas);
begin
  //>> beispiel
  Acanvas.Brush.Color := TCategoryPanelGroup(Parent).ChevronColor;
  Acanvas.FillRect(Rect(0,0,width,Height));
  Case HeaderState Of
    hsNormal: ACanvas.TextOut(0,0,'N');
    hsPressed: ACanvas.TextOut(0,0,'P');
    hsHot: ACanvas.TextOut(0,0,'H');
  End;

end;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:37 Uhr.
Seite 1 von 2  1 2      

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