![]() |
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? |
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. |
AW: TCategoryPanelGroup modifizieren
Die Grafiken für die Pfeile kannst du so ändern, ohne eine eigene Komponente abzuleiten.
|
AW: TCategoryPanelGroup modifizieren
Zitat:
Im Embarcadero Ordner habe ich den Quelltext jetzt auch. :roll: Zitat:
Also danke Euch beiden erstmal. Dann schaue ich mal, ob ich mit der Anpassung zurechtkomme. :) |
AW: TCategoryPanelGroup modifizieren
Zitat:
Statt Strg+Linksklick kann man auch über's Kontextmenü "Deklaration suchen" des Codeeditors dort hin. |
AW: TCategoryPanelGroup modifizieren
Zitat:
Ich komme allerdings gerade nicht weiter mit dem Überschreiben einer Funktion der Basiskomponente. Ich habe jetzt folgendes:
Delphi-Quellcode:
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.
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. Warum wird DrawHeaderChevron also nicht gefunden? |
AW: TCategoryPanelGroup modifizieren
Würde mich sehr freuen, wenn mir jemand zeigt, wie das geht!
Habe es selbst leider nicht herausfinden können. :( |
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. |
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? |
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. |
AW: TCategoryPanelGroup modifizieren
Vielen Dank, damit komme ich jetzt zurecht!
Wünsche einen schönen Sonntag! :) |
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? |
AW: TCategoryPanelGroup modifizieren
Zitat:
|
AW: TCategoryPanelGroup modifizieren
Zitat:
![]() Mit einen kleinen Interceptor kannst du das leicht abstellen:
Delphi-Quellcode:
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.
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. |
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; |
AW: TCategoryPanelGroup modifizieren
Zitat:
Alternativ kannst du auch ein TCanvas erzeugen und dessen Handle das DC zuweisen. Aber das ist Geschmackssache. |
AW: TCategoryPanelGroup modifizieren
#### Moderatoren, Bitte diesen Beitrag löschen! Doppelpost! ######
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz