Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TreeView Farbe (https://www.delphipraxis.net/57787-treeview-farbe.html)

Grunzke 26. Nov 2005 19:04


TreeView Farbe
 
Hi, ich möchte in einem TreeView den makierten Punkt durch Buttonklick verfärben weiß aber nicht wie.

marabu 26. Nov 2005 19:28

Re: TreeView Farbe
 
Aber ich:

Delphi-Quellcode:
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;
Stelle HideSelection auf FALSE - besser ist das...

Grüße vom marabu

Neutral General 3. Dez 2005 16:15

Re: TreeView Farbe
 
Ehm welche Unit muss man für TCustomDrawState einbinden ? Also in der DelphiHilfe finde ich auch nichts..

marabu 3. Dez 2005 17:09

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

Lannes 3. Dez 2005 17:35

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.

Neutral General 3. Dez 2005 17:35

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:

Neutral General 4. Dez 2005 14:37

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 :(

marabu 4. Dez 2005 19:52

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:
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;
Grüße vom marabu

Mit diesem Code kann ich gleich prüfen, wer rot-grün-blind ist...

Neutral General 5. Dez 2005 16:45

Re: TreeView Farbe
 
Dein Ansatz ist für mein Problem auch falsch :mrgreen:

So ein bisschen Pseudocode zur Verdeutlichung:

Delphi-Quellcode:
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;
:mrgreen:

Sharky 5. Dez 2005 16:48

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".

Neutral General 5. Dez 2005 16:53

Re: TreeView Farbe
 
Zitat:

Zitat von Sharky
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".

Ok ich weiß was ein Object ist, ich weiß was eine Zeichenfarbe ist, ich weiß was ein Flag ist und ich weiß was casten ist aber ich verstehe trotzdem nicht was ich machen soll :mrgreen:

Sharky 5. Dez 2005 17:12

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:

Neutral General 5. Dez 2005 18:08

Re: TreeView Farbe
 
Danke ich werds mir mal ansehen. Aber da ich und Grunzke zusammenarbeiten haben wir wohl genau das gleiche Problem :D

marabu 5. Dez 2005 18:22

Re: TreeView Farbe
 
Hallo Michael,

Zitat:

Zitat von Neutral General
Dein Ansatz ist für mein Problem auch falsch

entweder liegen bei dir Problembeschreibung und Anforderung verdammt weit auseinander oder in das OnClick Ereignis deines HighlightButton gehört die Anweisung TreeView.Invalidate - den Rest macht der Code aus Beitrag #8. Wenn du das Highlighting auch wieder wegnehmen möchtest, dann geht das so:

Delphi-Quellcode:
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;
Emoticons sind nicht mein Ding, aber wäre anstelle von mrgreen nicht stupid die bessere Wahl gewesen?

Freundliche Grüße vom marabu

Neutral General 5. Dez 2005 18:26

Re: TreeView Farbe
 
Zitat:

Emoticons sind nicht mein Ding, aber wäre anstelle von mrgreen nicht stupid die bessere Wahl gewesen?
Naja ich benutze aber doch so gerne den hier : :mrgreen:

: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 ?^^

marabu 5. Dez 2005 18:46

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

Neutral General 5. Dez 2005 18:58

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:

marabu 5. Dez 2005 19:17

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 22:31 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