Delphi-PRAXiS

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.

Keks 3. Apr 2011 15:48

AW: TCategoryPanelGroup modifizieren
 
Vielen Dank, damit komme ich jetzt zurecht!
Wünsche einen schönen Sonntag! :)

Keks 3. Apr 2011 20:39

AW: TCategoryPanelGroup modifizieren
 
Ich habe jetzt die angesprochenen Punkte (Abstand entfernt, Pfeile selbst gezeichnet) hinbekommen.
Nun wollte ich noch den Rand (die 1px breite, dunkelgraue Linie um die Komponente) der CategoryPanelGroup entfernen. Leider finde ich keinen Anhaltspunkt, wo diese gezeichnet wird. Könnte mir bitte jemand helfen, diese Umrandung zu entfernen?

Keks 7. Okt 2017 21:44

AW: TCategoryPanelGroup modifizieren
 
Zitat:

Zitat von Keks (Beitrag 1092818)
Nun wollte ich noch den Rand (die 1px breite, dunkelgraue Linie um die Komponente) der CategoryPanelGroup entfernen. Leider finde ich keinen Anhaltspunkt, wo diese gezeichnet wird. Könnte mir bitte jemand helfen, diese Umrandung zu entfernen?

Leider habe ich diese Frage auch nach sechs Jahren immer noch. Ich habe mich damals mit dem dunkelgrauen 1px-Rand arrangiert, aber je nach Projekt und UI Design passt dieser einfach nicht. Ich würde diesen gerne entfernen oder umfärben können. Leider finde ich auch jetzt beim besten Willen nicht heraus, wo dieser genau generiert wird und wie ich ihn entsprechend entfernen könnte. Hat vielleicht jetzt jemand eine Idee?

TiGü 9. Okt 2017 10:01

AW: TCategoryPanelGroup modifizieren
 
Zitat:

Zitat von Keks (Beitrag 1382827)
Zitat:

Zitat von Keks (Beitrag 1092818)
Nun wollte ich noch den Rand (die 1px breite, dunkelgraue Linie um die Komponente) der CategoryPanelGroup entfernen. Leider finde ich keinen Anhaltspunkt, wo diese gezeichnet wird. Könnte mir bitte jemand helfen, diese Umrandung zu entfernen?

Leider habe ich diese Frage auch nach sechs Jahren immer noch. Ich habe mich damals mit dem dunkelgrauen 1px-Rand arrangiert, aber je nach Projekt und UI Design passt dieser einfach nicht. Ich würde diesen gerne entfernen oder umfärben können. Leider finde ich auch jetzt beim besten Willen nicht heraus, wo dieser genau generiert wird und wie ich ihn entsprechend entfernen könnte. Hat vielleicht jetzt jemand eine Idee?

Das ist der Window Frame, der wird im Message-Handler für WM_NCPAINT gezeichnet.
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Mit einen kleinen Interceptor kannst du das leicht abstellen:

Delphi-Quellcode:
unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, System.UITypes;

type
  TCategoryPanelGroup = class(Vcl.ExtCtrls.TCategoryPanelGroup)
    procedure WMNCPaint(var Message: TWMNCPaint); message WM_NCPAINT;
  end;

  TForm1 = class(TForm)
    CategoryPanelGroup1: TCategoryPanelGroup;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm2 }

procedure TCategoryPanelGroup.WMNCPaint(var Message: TWMNCPaint);
var
  MitHässlichenRand: Boolean;
begin
  MitHässlichenRand := False;
  if MitHässlichenRand then
  begin
    inherited;
  end;
end;

end.
Bevor die Frage kommt: Ja, es reicht wenn du das in eine eigene Unit schiebst und immer nach Vcl.ExtCtrls in der Uses-Klausel aufnimmst.

Keks 9. Okt 2017 11:04

AW: TCategoryPanelGroup modifizieren
 
Wow, super! Vielen lieben Dank!!

Und wenn ich eine andere Farbe verwenden möchte (statt ganz ohne Rand), wäre das dann die richtige Möglichkeit oder geht es irgendwie direkter?
Delphi-Quellcode:
procedure TCategoryPanelGroup.WMNCPaint(var Message: TWMNCPaint);
var
  dc: hDc;
  Pen: hPen;
begin
  Message.Result := 1;
  dc := GetWindowDC(Handle);
  Pen := CreatePen(PS_SOLID, 1, clRed);
  SelectObject(dc, Pen);
  Rectangle(dc, 0, 0, Width, Height);
  DeleteObject(Pen);
  ReleaseDC(Handle, dc);
end;

TiGü 9. Okt 2017 12:05

AW: TCategoryPanelGroup modifizieren
 
Zitat:

Zitat von Keks (Beitrag 1382883)
Wow, super! Vielen lieben Dank!!

Und wenn ich eine andere Farbe verwenden möchte (statt ganz ohne Rand), wäre das dann die richtige Möglichkeit oder geht es irgendwie direkter?
Delphi-Quellcode:
procedure TCategoryPanelGroup.WMNCPaint(var Message: TWMNCPaint);
var
  dc: hDc;
  Pen: hPen;
begin
  Message.Result := 1;
  dc := GetWindowDC(Handle);
  Pen := CreatePen(PS_SOLID, 1, clRed);
  SelectObject(dc, Pen);
  Rectangle(dc, 0, 0, Width, Height);
  DeleteObject(Pen);
  ReleaseDC(Handle, dc);
end;

Das ist schon ok so.
Alternativ kannst du auch ein TCanvas erzeugen und dessen Handle das DC zuweisen.
Aber das ist Geschmackssache.

cpux86 7. Nov 2019 18:54

AW: TCategoryPanelGroup modifizieren
 
#### Moderatoren, Bitte diesen Beitrag löschen! Doppelpost! ######


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:25 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