![]() |
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". |
Re: TreeView Farbe
Zitat:
|
Re: TreeView Farbe
Liste der Anhänge anzeigen (Anzahl: 1)
:oops: Bei einem TreeNode ist es die Eigenschaft .Data
Demo im Anhang. Aber ich sehe eben das dies wohl alles nichts für Grunzke ist. Ich dachte es ginge um etwas anderes :oops: |
Re: TreeView Farbe
Danke ich werds mir mal ansehen. Aber da ich und Grunzke zusammenarbeiten haben wir wohl genau das gleiche Problem :D
|
Re: TreeView Farbe
Hallo Michael,
Zitat:
Delphi-Quellcode:
Emoticons sind nicht mein Ding, aber wäre anstelle von mrgreen nicht stupid die bessere Wahl gewesen?
procedure TDemoForm.TreeViewCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean); begin if Node.Selected and (TreeView.Tag = 1) then Sender.Canvas.Font.Color := clGreen else Sender.Canvas.Font.Color := clBlack; end; procedure TDemoForm.HighLightButtonClick(Sender: TObject); begin with TreeView do begin Tag := 1 - Tag; Invalidate; end; end; Freundliche Grüße vom marabu |
Re: TreeView Farbe
Zitat:
:mrgreen: :wink: EDIT: Leute ich glaube ihr versteht mich falsch. Nix angeklickt: Node1 Node2 Node3 Node4 Node3 angeklickt: Node1 Node2 Node3 Node4 Und jetzt klickt man Node4 an: Node1 Node2 Node3 Node4 so soll das aussehen. Mit den Methoden wie ihr es macht wird es aber nachher so: Node1 Node2 Node3 Node4 Habt ihr verstanden ?^^ |
Re: TreeView Farbe
Mein Code tut genau das, was du zum wiederholten Male beschreibst. Den letzten Fall kann ich mit meinem Code nicht produzieren. Wenn du meinen Code ausprobiert hast und das Ergebnis ist nicht wie gewünscht, dann vermute ich Seiteneffekte durch anderen Code, den du gleichzeitig in deiner Anwendung hast.
Mäßig verwirrte Grüße vom marabu |
Re: TreeView Farbe
Ja mit deinem Code geht das ja faaast.. nur soll die Färbung permanent sein und nicht nur solange das Item selektiert ist...
Node markieren --> Button klicken --> Node wird rot --> Man entmarkiert den Node --> Immernoch rot!! --> Solange bis ich ein anderes Node markiere und mit dem Button einfärbe. --> Es soll immer nur ein Node gefärbt sein Ich hoffe mal ihr habt mein Problem verstande. Langsam bin ich nämlich auch verwirrt :wiejetzt: |
Re: TreeView Farbe
Langsam verstehe ich dich besser. Die Färbung ist nicht von der Selektion des Knoten abhängig. Du verwendest die Selektion nur um den Knoten zu markieren, der über den Button gefärbt werden soll. Dazu solltest du wie von Sharky beschrieben die Data property des Node verwenden. Sharky hat doch auch Code beigelegt - hast du den schon ausprobiert?
marabu PS: Ansonsten geht es auch mit meinem Code - leicht verändert:
Delphi-Quellcode:
procedure TDemoForm.TreeViewCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean); begin if Succ(Node.AbsoluteIndex) = TreeView.Tag then Sender.Canvas.Font.Color := clGreen else Sender.Canvas.Font.Color := clBlack; end; procedure TDemoForm.HighLightButtonClick(Sender: TObject); begin with TreeView do begin Tag := Succ(Selected.AbsoluteIndex); Invalidate; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:52 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