![]() |
TreeView Farbe
Hi, ich möchte in einem TreeView den makierten Punkt durch Buttonklick verfärben weiß aber nicht wie.
|
Re: TreeView Farbe
Aber ich:
Delphi-Quellcode:
Stelle HideSelection auf FALSE - besser ist das...
procedure TDemoForm.ColorButtonClick(Sender: TObject);
var tn: TTreeNode; begin tn := TreeView.Selected; if not Assigned(tn) then Exit; tn.Data := Pointer(1 - Integer(tn.Data)); TreeView.Invalidate; end; procedure TDemoForm.TreeViewCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean); begin if Assigned(Node.Data) then Sender.Canvas.Font.Color := clRed else Sender.Canvas.Font.Color := clBlack; end; Grüße vom marabu |
Re: TreeView Farbe
Ehm welche Unit muss man für TCustomDrawState einbinden ? Also in der DelphiHilfe finde ich auch nichts..
|
Re: TreeView Farbe
Hallo Michael,
wenn bei dir das Ereignis nicht zur Verfügung steht, dann ist D3 wohl zu alt. Grüße vom marabu |
Re: TreeView Farbe
Hallo,
es geht auch mit Delphi 3, da ist aber Handarbeit angesagt. Das Beispiel färbt die Einträge des Level 0 rot, wenn Level > 0, dann blau. Der Code ist noch in der Bearbeitung/Entwicklung, bietet aber schon einen Ansatz, denke ich. Den Code habe ich von VB übersetzt und er bezog sich ursprünglich auf das Einfärben von ListView-Zeilen.
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, CommCtrl; const { define the ListView constants } LVS_OWNERDATA = $01000; NM_CUSTOMDRAW = (NM_FIRST - 12); //NM_CUSTOMDRAW = $0; CDDS_PREPAINT = $00000001; CDDS_ITEM = $10000; CDDS_ITEMPREPAINT = (CDDS_ITEM or CDDS_PREPAINT); CDRF_DODEFAULT = $00000000; CDRF_NEWFONT = $2; CDRF_NOTIFYITEMDRAW = $20; CDIS_SELECTED = $0001; CDIS_FOCUS = $0010; type { define the Custom Draw records } NMCUSTOMDRAW = record hdr : TNMHdr; dwDrawStage : DWORD; hdc : HDC; rc : TRect; dwItemSpec : DWORD; uItemState : UINT; lItemlParam : LPARAM; end; NMTVCUSTOMDRAW = record nmcd : NMCUSTOMDRAW; clrText : COLORREF; clrTextBk : COLORREF; //iSubItem : Integer; iLevel: Integer; end; type TForm1 = class(TForm) TreeView1: TTreeView; private { Private-Deklarationen } public { Public-Deklarationen } procedure WMNotify(var Msg: TMessage); message WM_NOTIFY; end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.WMNotify(var Msg: TMessage); var lpnm : ^TNMTreeView; lplvcd : ^NMTVCUSTOMDRAW; Index : Integer; begin // grab a pointer to the ListView NMHDR lpnm := Pointer(Msg.LParam); // if it's a Custom Draw message if lpnm.hdr.code = NM_CUSTOMDRAW then begin // if it's from our ListView if lpnm.hdr.hwndFrom = TreeView1.Handle then begin // grab a pointer to the Custom Draw record lplvcd := Pointer(Msg.LParam); // prior to painting if lplvcd.nmcd.dwDrawStage = CDDS_PREPAINT then begin // tell Windows we want notification // for each item being drawn Msg.Result := CDRF_NOTIFYITEMDRAW; exit; end // prior to each item being drawn else if lplvcd.nmcd.dwDrawStage = CDDS_ITEMPREPAINT then begin // get the index of the item to draw Index := lplvcd.nmcd.dwItemSpec; // color every other item for example if (Index mod 2 = 0) then// ???????? begin // change text color if lplvcd.nmcd.uItemState = CDIS_FOCUS or CDIS_SELECTED then begin lplvcd.clrText := ColorToRGB(clBlack); lplvcd.clrTextBk := ColorToRGB(clWhite); end else begin if lplvcd.iLevel = 0 then lplvcd.clrText := ColorToRGB(clRed) else lplvcd.clrText := ColorToRGB(clBlue); //lplvcd.clrTextBk := ColorToRGB($00F4EFEA); end; // change background color // if lplvcd.iLevel = 0 then //lplvcd.clrTextBk := ColorToRGB($00F4EFEA); //Hintergrund färben // tell Windows we changed the color Msg.Result := CDRF_NEWFONT; exit; end; end // otherwise, let Windows draw the item else begin Msg.Result := CDRF_DODEFAULT; exit; end; end; end; inherited; end; end. |
Re: TreeView Farbe
Ich hab Delphi7 aber ich habe Delphi3 benutzt weil Delphi3 schneller startet -.-
Dadrauf hätte ich auch kommen können :wall: Naja danke. In Delphi7 klappts ;) :) @ Lannes: Hat sich ja erledigt^^ Ich änder glaube ich mal mein Profil :mrgreen: |
Re: TreeView Farbe
Ehm wie kann man machen das immer nur ein Item gefärbt ist. Also ich wollte zuerst mit einer for-Schleife alles Schwarz färben und dann den markierten Eintrag grün aber ich bekomms nicht hin :(
|
Re: TreeView Farbe
Dein Ansatz ist falsch, Michael. Du kannst nicht erst alles schwarz zeichnen und dann den markierten Eintrag grün - das Ereignis OnCustomDrawItem() gibt dir die Chance genau einen Eintrag zu zeichnen und du musst entscheiden, wie du ihn anmalen willst. Da der markierte Knoten sowieso schon hervorgehoben wird, macht das Färben dort eigentlich keinen Sinn, aber so gehts:
Delphi-Quellcode:
Grüße vom marabu
procedure TDemoForm.TreeViewCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean); begin if Node.Selected then Sender.Canvas.Font.Color := clRed else Sender.Canvas.Font.Color := clBlack; end; Mit diesem Code kann ich gleich prüfen, wer rot-grün-blind ist... |
Re: TreeView Farbe
Dein Ansatz ist für mein Problem auch falsch :mrgreen:
So ein bisschen Pseudocode zur Verdeutlichung:
Delphi-Quellcode:
:mrgreen:
procedure TForm1.Button1Click(Sender: TObject);
begin ÄnderDieSchriftFarbeVomAngewähltenNode(clgreen); // Dauerhaft ÄnderDieSchriftFarbeVonAllenAnderenNodes(clblack); // Dauerhaft. Bis halt ein anderes Node markiert ist und der Button geklickt wird. Dann soll das neue Node grün sein und die anderen schwarz end; |
Re: TreeView Farbe
Hai Neutral,
wenn die Auswahl der Farbe nicht von dem Select-Zustand abhängt könntest Du für jeden Node in seiner Object-Eigenschaft die zu verwendende Zeichenfarbe oder ein anderes Flag "rein casten". |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:44 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