font zuweisen in ttreeview

Rund um die LCL und andere Komponenten
Antworten
JosefKoller
Beiträge: 115
Registriert: Sa 17. Mär 2007, 10:53

font zuweisen in ttreeview

Beitrag von JosefKoller »

Hallo,

kann mir jemand sagen warum mit diesem Code keine Schriftfarbe zugewiesen wird. die Auskommentierten Zeilen sind Versuche. Mal mit mal ohne.

Es wird lediglich "bold" ausgeführt. Dafür das bold aber gleich in den beiden Levels. Die Schriftfarbe bleibt in beiden Levels schwarz.

Code: Alles auswählen

procedure TfAuftrag_bearbeiten.TVauftraegeCustomDrawItem(
  Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState;
  var DefaultDraw: Boolean);
var l:integer;
begin
 //DefaultDraw:=false;
    case node.Level of
    0:
      begin
        TCustomTreeView(Sender).canvas.Font.Color := $000000F0; //clRed;
        TCustomTreeView(Sender).canvas.Font.Style := [fsbold];
        //DefaultDraw := true;
        //TCustomTreeView(Sender).canvas.Brush.Color := $00F2E8DB;
      end;
    1:
      begin
        TCustomTreeView(Sender).canvas.Font.Color := clnavy;
        TCustomTreeView(Sender).canvas.Brush.Color := $00F2E8DB;
        //DefaultDraw := true;
      end;
  end;
 //DefaultDraw := true;
end;
Danke.

Josef
Zuletzt geändert von Lori am Fr 17. Feb 2012, 16:15, insgesamt 1-mal geändert.
Grund: Bitte den Highlighter benutzen

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: font zuweisen in ttreeview

Beitrag von Socke »

JosefKoller hat geschrieben:kann mir jemand sagen warum mit diesem Code keine Schriftfarbe zugewiesen wird.
Die Schriftfarbe wird zugewiesen; nur wird sie von Windows wohl nicht beachtet.

Das heißt: du musst den Text selbst zeichnen.

P.S.: Über dem Eingabefeld findest du das Auswahlfeld "Highlighter". Damit kannst den Quelltext hier im Forum formatieren, sodass er besser lesbar wird (Syntax-Highlighting)
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: font zuweisen in ttreeview

Beitrag von theo »

Probier mal das AdvancedCustomDrawItem Ereignis. Irgendwie so, da kann man noch feilen:

Code: Alles auswählen

procedure TForm1.TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage;
  var PaintImages, DefaultDraw: boolean);
var
  Rec: TRect;
  Style: TTextStyle;
begin
  PaintImages := True;
  FillChar(Style, SizeOf(TTextStyle), 0);
  Style.Opaque := True;
  Style.SystemFont := True;
  TCustomTreeView(Sender).canvas.Brush.Color := clWhite;
  case node.Level of
    0:
    begin
      TCustomTreeView(Sender).canvas.Font.Color := $000000F0; //clRed;
      TCustomTreeView(Sender).canvas.Font.Style := [fsbold];
    end;
    1:
    begin
      TCustomTreeView(Sender).canvas.Font.Style := [];
      TCustomTreeView(Sender).canvas.Font.Color := clnavy;
      TCustomTreeView(Sender).canvas.Brush.Color := $00F2E8DB;
    end;
  end;
  Rec := Node.DisplayRect(True);
  TCustomTreeView(Sender).canvas.TextRect(Rec, Rec.Left + 2, Rec.Top, Node.Text, Style);
end;

JosefKoller
Beiträge: 115
Registriert: Sa 17. Mär 2007, 10:53

Re: font zuweisen in ttreeview

Beitrag von JosefKoller »

Hallo,

vielen Dank für den Hinweis. In advancedcustomdraw läßt sich sowas realisieren.

Code: Alles auswählen

procedure TfAuftrag_bearbeiten.TVauftraegeAdvancedCustomDrawItem(
  Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState;
  Stage: TCustomDrawStage; var PaintImages, DefaultDraw: Boolean);
var
   Rec: TRect;
   Style: TTextStyle;
begin
 
  PaintImages := True;
  FillChar(Style, SizeOf(TTextStyle), 0);
  Style.Opaque := True;
 
  case node.Level of
    0:
    begin
      TCustomTreeView(Sender).canvas.Font.Color := $000000F0; //clRed;
      TCustomTreeView(Sender).canvas.Font.Style := [fsbold];
    end;
    1:
    begin
      TCustomTreeView(Sender).canvas.Font.Style := [];
      TCustomTreeView(Sender).canvas.Font.Color := clblack;
      end;
  end;
  Rec := Node.DisplayRect(True);
  rec.Right:=rec.right-1;
  rec.Bottom:=rec.bottom-1;
  if node.selected = true then
  begin
       TCustomTreeView(Sender).canvas.Brush.Color:=clGradientActiveCaption; //clBlue;
       TCustomTreeView(Sender).canvas.Font.Color:=clWhite;
       TCustomTreeView(Sender).canvas.TextRect(Rec, Rec.Left+2, Rec.Top+1, Node.Text, Style);
  end else begin
      TCustomTreeView(Sender).canvas.TextRect(Rec, Rec.Left+2, Rec.Top+1, Node.Text, Style);
  end;
 
  end;
Nach Deiner Vorlage mußte nur noch hinzugefügt werden, daß die einträge sich auch bei einem Selected irgendwie darstellen müssen. Das Rec mußte in den Ausmßen auch noch etwas angepaßt werden.

Siehe Code.

Trotzdem noch eine Frage:

Im "Normalzustand" wird der selected node ähnlich einem Button angezeigt. Das bring ich mit obigem Code nicht hin. 'So wie ich das geschrieben habe, wird halt die angegebene Background Farbe angezeigt.

Kann man bei dem if mit node.selected wieder in den "Normalzustand" wechseln und das CustomDraw eben nur anstoßen, wenn der Eintrag nicht selektiert ist?

Danke.

Josef

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: font zuweisen in ttreeview

Beitrag von theo »

Vllt. hilft da der Parameter:
State: TCustomDrawState;

Antworten