Solved

Multiple colors in a treeview node's Text

Posted on 2003-11-05
7
1,256 Views
Last Modified: 2007-12-19
Hi everyone.

I'm using a TTreeView to display a list of item which have subitems... so far so good. Problem is that for each parent item I have more information that I'd like to display Next to the item between parenthesis, the problem I have is that I'd like the text between parenthesis to be of another color. I wrote a nice little procedure in the AdvancedCustomDraw of my treeview (see below) but for some reasons I can't get the 2 colors... Anybody has an idea?

//////////////////// BeginCode

      if cdsSelected in state then
        Font.Color := clHighlightText
      else
        Font.Color := clWindowText;

      TextOut(NodeRect.Left, NodeRect.Top, 'blah');
      li_TextWidth := TextWidth('blah');

      if cdsSelected in state then
        Font.Color := clInactiveCaptionText
      else
        Font.Color := clGray;

      TextOut(NodeRect.Left + 1 + li_TextWidth, NodeRect.Top, '(ExtraText)');
   
//////////////////// EndCode

The whole text for the Node ends up begin of clInactiveCaptionText color... Anybody has an idea?
0
Comment
Question by:A1ternity
  • 4
  • 3
7 Comments
 
LVL 26

Accepted Solution

by:
EddieShipman earned 500 total points
ID: 9690286
Try this example from Serge Gubenko. I've tweeked it a bit to move the frame over a little.

procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
var
  XNodeRect :trect;
  XDC: HDC;
  XBrush, XFrame: HBrush;
  XCaption: string;
  XFormat: longint;
  XFont: TFont;
begin
  DefaultDraw:=true;
  XNodeRect:=Node.DisplayRect(true);
  if UpperCase(node.Text)='TWO (3)' then
  begin
    XNodeRect.Left:=XNodeRect.Right + 25;
    XNodeRect.Right:=XNodeRect.Right + Canvas.TextWidth(node.Text) + 25;
    XCaption:='$10';
    XFormat:=DT_VCENTER + DT_SINGLELINE + DT_CENTER;

    XDC:=GetDC(Sender.Handle);
    XBrush:=CreateSolidBrush(ColorToRGB(clYellow));
    XFrame:=CreateSolidBrush(ColorToRGB(clBlack));
    XFont:=TFont.Create;
    try
      XFont.Style:=[fsItalic, fsBold];
      XFont.Name:='Arial';
      XFont.Size:=10;

      FillRect(XDC, XNodeRect, XBrush);
      SelectObject(XDC, XFont.Handle);
      SetTextColor(XDC, clBlue);
      SetBkColor(XDC, clYellow);
      DrawText(XDC, PChar(XCaption),
               length(XCaption), XNodeRect, XFormat);
      FrameRect(XDC, XNodeRect, XFrame);
    finally
      DeleteObject(XBrush);
      DeleteObject(XFrame);
      ReleaseDC(Sender.Handle, XDC);
      XFont.Free;
    end;
  end;
end;
0
 

Author Comment

by:A1ternity
ID: 9694335
Well... this method works as long as you don't have to put more than 1 color on the text of a single particular node.

Thanks for the help but sadly it didn't work for what I'm trying to do...
0
 
LVL 26

Expert Comment

by:EddieShipman
ID: 9695879
Wanna bet??
0
Problems using Powershell and Active Directory?

Managing Active Directory does not always have to be complicated.  If you are spending more time trying instead of doing, then it's time to look at something else. For nearly 20 years, AD admins around the world have used one tool for day-to-day AD management: Hyena. Discover why

 
LVL 26

Expert Comment

by:EddieShipman
ID: 9696241
I do not have time to follow up on this bet but maybe you should look into
the HTMLTreeview from TMS. It allows you to format your node text with
a limited set of HTML tags, including font tags and can have multiple colors
on one line.

http://www.tmssoftware.com/htmltv.htm
0
 
LVL 26

Expert Comment

by:EddieShipman
ID: 9696267
In HTMLTreeview, this sets the text Blah to Blue and the Text (Extra Text) to red with two space between:
(Set the Node's text property when you edit them)
<font face="MS Sans Serif" size="8" color="clblue">Blah</font>&nbsp; &nbsp;<font face="MS Sans Serif" size="8" color="clred">(Extra Text)</font>
0
 

Author Comment

by:A1ternity
ID: 9696281
I will take a deeper look at the code sample you provided... I only had time to try it quickly this morning and can't return to it right now. As for using the HTML Treeview I'd rather avoid using another component...

I'll keep you informed...
0
 

Author Comment

by:A1ternity
ID: 9832188
Still havn't had the time to try the solution and that part of the project is put aside for now...

Still here are your points! (won't say I'm not a good sports! Didn't even try your solution and I still pay! ;)
0

Featured Post

3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

A lot of questions regard threads in Delphi.   One of the more specific questions is how to show progress of the thread.   Updating a progressbar from inside a thread is a mistake. A solution to this would be to send a synchronized message to the…
In this tutorial I will show you how to use the Windows Speech API in Delphi. I will only cover basic functions such as text to speech and controlling the speed of the speech. SAPI Installation First you need to install the SAPI type library, th…
Along with being a a promotional video for my three-day Annielytics Dashboard Seminor, this Micro Tutorial is an intro to Google Analytics API data.
This video shows how to quickly and easily add an email signature for all users on Exchange 2016. The resulting signature is applied on a server level by Exchange Online. The email signature template has been downloaded from: www.mail-signatures…

770 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question