Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1618
  • Last Modified:

Treeview with bold nodes

I'd like to do a treeview where the currently selected node and it's parents are drawn with bold text
(maybe even in color?). so it would be more obvious what path is currently selected.
any hints???
I use delphi 3.01  
0
pwyss
Asked:
pwyss
  • 3
  • 3
  • 2
  • +1
1 Solution
 
philipleighsCommented:
I think I saw a free owner draw tree view on DSP.
Try a search on http://sunsite.icm.edu.pl/delphi/
0
 
MadshiCommented:
Look at Brad Stowers' Homepage (http://members.aye.net/~bstowers/delphi/). There you will find extended Tree-/List-View components, which should be able to do what you need.

Please tell me if that helped...

Regards, Madshi.
0
 
EpsylonCommented:
Try this:

- Put a TreeView compontent on your form and add some items to it
- Implement the OnCustomDrawItem Eventhandler (See CustomDrawItem under Events in the Object Inspector):


procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
  Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
var r: TRect;
begin
  if Node = Sender.Selected then
    with Sender.Canvas do
    begin
      Font.Color := clRed;
      Font.Style := [fsUnderline];
    end;
  DefaultDraw := True;
end;


In this example only the selected item is modified. Of course you can change the code to your needs.

Good luck!!!

0
Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

 
MadshiCommented:
Hi Epsylon, you're solution is correct. But I guess it works only with Delphi4, right?

Regards, Madshi.
0
 
pwyssAuthor Commented:
Epsylon, unfortunatly madshi is rigth, in Delphi 3 there is no OnCustomDrawItem Event in TreeView. Guess I have to look at the components on the net...
[or are there any other proposals ??? like deriving a class from TTreeView (TCustomTreeView???) and overriding one or two methodes... ]

thanx anyway
patrick

ps: i will add a comment if any of the proposed componets work...
0
 
EpsylonCommented:
Maybe you can derive a class and override the Delphi 3 properties and methods with those of Delphi 4. I don't know what the code of Delphi 3 looks like...

I will look into it later this day. Have to install my second computer first.

0
 
pwyssAuthor Commented:
Epsylon: the one you told me is still in beta, I downloaded it, but didn't take a look at it until now.

But I found something, that works on http://sunsite.icm.edu.pl/delphi/:

http://members.tripod.com/~rublin/ztree/ztree.html

only question remaining is how does this work. if someone explains this to me he can have the points.

procedure TZTreeView.Bold(node : TTreeNode);
var lev,i : Integer;
begin
    SetNodeState(node, TVIS_BOLD);
end;

procedure TZTreeView.SetNodeState(node : TTreeNode; State : Integer);
var
  tvi  : TTVItem;
begin
  FillChar(tvi, Sizeof(tvi), 0);
  tvi.hItem := node.ItemID;
  tvi.mask := TVIF_STATE;
  tvi.stateMask := TVIS_BOLD;
  tvi.state := State;
  TreeView_SetItem(node.Handle, tvi);
  Change(Node);
end;

question:
TTVItem is a packed record:
  TTVItemA = packed record
    mask: UINT;
    hItem: HTreeItem;
    state: UINT;
    stateMask: UINT;
    pszText: PAnsiChar;
    cchTextMax: Integer;
    iImage: Integer;
    iSelectedImage: Integer;
    cChildren: Integer;
    lParam: LPARAM;
  end;

seems to be some windows API stuff. Anybody knows what these fields are about, or where I can get information about this?

0
 
EpsylonCommented:
You can not change colors with this.
The API stuff can be found in the Win32 Programmer's Reference help file. Delphi 3 does not include this file if I'm correct.


Here is how the code works.

Add a TreeView (with some items) and 2 buttons to a new form.
Then add the following code:


procedure SetNodeState(node : TTreeNode; State : Integer);
var
  tvi: TTVItem;
begin
  FillChar(tvi, Sizeof(tvi), 0);  // fill the record with zeros
  tvi.hItem := node.ItemID;       // assign the node id to the record
  tvi.mask := TVIF_STATE;         // You only want to change the state
  tvi.stateMask := TVIS_BOLD;     // Only allow bold (or normal)
  tvi.state := State;             // copy the wanted state into the record
  TreeView_SetItem(node.Handle, tvi);   // change the node
//  Change(Node);                 // I don't need this in Delphi 4, maybe Delphi 3 does
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
// set the selected node to bold
  SetNodeState(TreeView1.Selected, TVIS_BOLD);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
// set the selected node to normal
  SetNodeState(TreeView1.Selected, 0);
end;

0
 
pwyssAuthor Commented:
thank you!

the Change() call is to make the treeview call it's FOnChange() [send the OnCHange event], but I don't need this...

patrick
0

Featured Post

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

  • 3
  • 3
  • 2
  • +1
Tackle projects and never again get stuck behind a technical roadblock.
Join Now