AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TreeView Farbe

Ein Thema von Grunzke · begonnen am 26. Nov 2005 · letzter Beitrag vom 5. Dez 2005
Antwort Antwort
Seite 1 von 2  1 2      
Grunzke

Registriert seit: 7. Nov 2005
Ort: Harz
8 Beiträge
 
Delphi 6 Personal
 
#1

TreeView Farbe

  Alt 26. Nov 2005, 20:04
Hi, ich möchte in einem TreeView den makierten Punkt durch Buttonklick verfärben weiß aber nicht wie.
Mathias
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: TreeView Farbe

  Alt 26. Nov 2005, 20:28
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
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: TreeView Farbe

  Alt 3. Dez 2005, 17:15
Ehm welche Unit muss man für TCustomDrawState einbinden ? Also in der DelphiHilfe finde ich auch nichts..
Michael
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: TreeView Farbe

  Alt 3. Dez 2005, 18:09
Hallo Michael,

wenn bei dir das Ereignis nicht zur Verfügung steht, dann ist D3 wohl zu alt.

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von Lannes
Lannes

Registriert seit: 30. Jan 2005
Ort: Münster
745 Beiträge
 
Delphi 3 Professional
 
#5

Re: TreeView Farbe

  Alt 3. Dez 2005, 18:35
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.
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

Re: TreeView Farbe

  Alt 3. Dez 2005, 18:35
Ich hab Delphi7 aber ich habe Delphi3 benutzt weil Delphi3 schneller startet -.-
Dadrauf hätte ich auch kommen können

Naja danke. In Delphi7 klappts

@ Lannes: Hat sich ja erledigt^^ Ich änder glaube ich mal mein Profil
Michael
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

Re: TreeView Farbe

  Alt 4. Dez 2005, 15:37
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
Michael
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: TreeView Farbe

  Alt 4. Dez 2005, 20:52
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...
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

Re: TreeView Farbe

  Alt 5. Dez 2005, 17:45
Dein Ansatz ist für mein Problem auch falsch

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;
Michael
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#10

Re: TreeView Farbe

  Alt 5. Dez 2005, 17:48
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".
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:20 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