Toon posts:

[Delphi] Treeview node breedte

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb nu een mooie treeview met nodes en childnodes.

Ik wil nu, zodra ik op een node klik (en hij heeft childnodes) dat ie expand. (Zonder dubbel-klik)
Probleem is dat je precies op de tekst moet klikken wil hij een treeview.selected = true geven.

Ik wil dus eigenlijk dat wanneer je naast de tekst (maar nog wel op dezelfde row) klikt hij ook de juiste node pakt. Dus de node moet eigenlijk net zo breed worden als de treeview. Of je moet kunnen aangeven dat hij de node moet pakken van de geselecteerde rij (onclick).

Is dit mogelijk? En hoe?

alvast bedankt.

  • schoene
  • Registratie: Maart 2003
  • Laatst online: 29-04 17:24
Het is wel in C++ Builder, maar dit komt op hetzelfde neer:

C++:
1
2
3
4
5
6
7
8
9
10
11
void __fastcall TForm1::TreeView1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
TTreeNode *node = TreeView1->GetNodeAt (X, Y);

if (node)
   {
   node->Focused  = true;
   node->Selected = true;
   }
}

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
schoene schreef op maandag 10 oktober 2005 @ 14:53:
Het is wel in C++ Builder, maar dit komt op hetzelfde neer:

C++:
1
TTreeNode *node = TreeView1->GetNodeAt (X, Y);
Uhm, ik heb geen niet zoveel kaas gegeten van dit spul (Delphi, C++) enzo, maar geeft GetNodeAt(X,Y) niet alleen een (reference naar een?) node terug de X, Y binnen een node valt? TS wil toch juist de X, Y van een bepaalde "row" :? Dus zeg maar dat de node even breed is als de control zelf. Of ben ik gek :?

[ Voor 17% gewijzigd door RobIII op 10-10-2005 14:59 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • schoene
  • Registratie: Maart 2003
  • Laatst online: 29-04 17:24
tjah, ik vind het ook vreemd, maar blijkbaar wordt enkel naar de Y-coordinaat gekeken. Ik heb natuurlijk ook eerst getest voor ik deze code gepost heb.

Edit: net zoals ik dacht dat de property RowSelect dit automatisch zou doen, maar dit werkt dan weer niet.

[ Voor 27% gewijzigd door schoene op 10-10-2005 15:16 ]


Verwijderd

Topicstarter
Ja, of ik wil iig de node van die row.

Was ook al aan het kijken naar die functie GetNodeAt(X, Y), maar krijg hem nog niet goed werkend.
Kan aan de onclick geen X, Y meegeven. (Of ik doe wat verkeerd).

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 18-04 05:37

alienfruit

the alien you never expected

Misschien kan je wat doen met WM_NCHITTEST message? Als ik het me goed herriner wordt daar bepaald waar opgeklikt woordt of de text node, glyph of de uitklap icoon. Ik heb alleen nu geen Delphi op deze computer staan dus kan het niet controleren voor je.

Overigensis er een mooi alternatief voor de treview namelijk virtual treeview component van Linschke. Het wordt ook gebruikt door Allen voor bepaalde onderdelen van Delphi 8-2005

URL: http://www.lischke-online.de/VirtualTreeview/

Misschien een mogelijkheid het is echt een heerlijke treeview en nog een stuk sneller ook :-)

[ Voor 37% gewijzigd door alienfruit op 10-10-2005 15:25 ]


Verwijderd

Topicstarter
OK,

heb het nu onder OnMouseDown gegooit ipv OnClick. Nu werkt het perfect :D

Kijken of de rest van de functionaliteit ook nog werkt.

Ik dank u

  • schoene
  • Registratie: Maart 2003
  • Laatst online: 29-04 17:24
Verwijderd schreef op maandag 10 oktober 2005 @ 15:17:
Ja, of ik wil iig de node van die row.

Was ook al aan het kijken naar die functie GetNodeAt(X, Y), maar krijg hem nog niet goed werkend.
Kan aan de onclick geen X, Y meegeven. (Of ik doe wat verkeerd).
je moet het focusen in de OnMouseDown doen, en het expanden in de OnClick. Iets in de aard van

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void __fastcall TForm1::TreeView1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
TTreeNode *node = TreeView1->GetNodeAt (X, Y);

if (node)
   {
   node->Focused  = true;
   node->Selected = true;
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TreeView1Click(TObject *Sender)
{
if (TreeView1->Selected)
   {
   if (TreeView1->Selected->Expanded)
      TreeView1->Selected->Collapse (false);
   else
      TreeView1->Selected->Expand (false);
   }
}

  • GAEvakYD
  • Registratie: Juni 2001
  • Laatst online: 28-04 17:17
Nu we het toch over Delphi hebben icm een treeview dan heb ik nog een vraag over de image van het geselecteerde item.

Ik heb aan de treeview een imagelist toegevoegd. Nu zie ik netjes verschillende icoontje bij de parrents, childeren, subchilderen. Het enige nadeel dat ik nu heb is dat wanneer ik een subitem selecteer, hij het icoontje gaan tonen van de parent. Ik kan hier nergens een property voor vinden waar ik dit gedrag uit kan zetten. Ik wil gewoon helemaal geen ander icoontje / image als ik en (sub)item selecteer. Of als dat niet mogelijk is, hetzelfde icoontje /image als dat het item al had.

Kan dit met het standaard TTreeview component of moet ik daarvoor toch wijken naar het VirtualTreeview component dat al eerder genoemd werd in deze post.

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 18-04 05:37

alienfruit

the alien you never expected

TTreeNode.ImageIndex en/of selectedindex en dan die op -1 of -2 zetten? Misschien zelfs binnen de onExpand en onCollapse events

[ Voor 47% gewijzigd door alienfruit op 10-10-2005 15:58 ]

Pagina: 1