Toon posts:

[Delphi, VirtualStringTree] Data/caption vullen..

Pagina: 1
Acties:
  • 232 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik gebruik de VirtualStringTree van [url="http://www.lischke-online.de"]Mike Lischke[/url].

Mijn vraag is, is het onmogelijk om de caption van een node in te stellen buiten de OnInitNode event.

Zo dus bijv:
code:
1
2
3
4
5
6
    VST.ChildCount[SchapNode] := VST.ChildCount[SchapNode] + 1;
    Node := VST.GetNext(Node);

    NodeData := VST.GetNodeData(Node);
    Temp := FieldByName('SCHAPNAAM').AsString;
    NodeData.Text := Temp;

En wat is precies het verschil tussen de OnInitNode event en de OnGetText event?

edit:

Ik heb het nu toch werkend gekregen. Maar ik zou nog wel graag willen weten, op je nu alles moet doen in de InitNode event of dat het niet uitmaakt.

Verwijderd

Maakt niet uit.

Als je een node toevoegt, zul je hem moeten initialiseren; Dat kun je meteen doen, of in de OnInitNode event.

Ik doe meestal zoiets:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
type
  PTreeData = ^TTreeData;
  TTreeData = record
    [..]
  end;

[..]

var
  Node: PVirtualNode;
  NodeData: PTreeData;
begin
  { Ik gebruik de tree meestal als 'stringgrid' met
    AddChild(nil) voeg je een regel toe }
  Node := Tree.AddChild(nil);
  NodeData := Tree.GetNodeData(Node);
  with NodeData^ do
  begin
    { vullen }
  end;
end;

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Op woensdag 24 juli 2002 19:08 schreef tokkie het volgende:
Mijn vraag is, is het onmogelijk om de caption van een node in te stellen buiten de OnInitNode event.
En wat is precies het verschil tussen de OnInitNode event en de OnGetText event?
VT werkt anders dan de TTreeView. De naam zegt het al, het is een virtuele tree. Dat betekend dat de tree niet zelf de informatie 'onthoud' wat er in het grid moet staan. Hij vraagt gewoon elke keer via de event OnGetText om wat er in de caption zoals jij het noemt moet staan.

OnInitNode is voor de eerste initializatie van de nodes. Deze wordt dus maar 1x per node aangeroepen. OnGetText mogelijk vele malen.

OnInitNode hoef je niet te gebruiken, je kan het ook gewoon meteen zelf doen zonder event.

VirtualTree is vrij ingewikkeld en daarom niet het beste tree control voor als je net begind. De TTreeView is veel makkelijker te begrijpen en te besturen. VT heeft weer hele andere voordelen, maar maakt het er niet makkelijker op :)

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
Oke, bedankt voor de duidelijke uitleg.

Verwijderd

Topicstarter
Ik zit nu nog met het probleem dat je de node's niet kunt selecteren met de muis. De tree wordt wel gewoon netjes getekend. Maar als ik dan een node wil selecteren, kan ik klikken wat ik wil, maar hij wordt niet geselecteerd. Klik ik net naast het lijntje dan werkt het wel (dus op de tekst klikken werkt niet).

Ga ik met de pijltjes toetsen 1 keer door alle node's heen dan werkt het selecteren met de muis op de teksten van de nodes ook gewoon goed.

Ik heb deze code:
code:
1
2
3
4
5
type
  PTreeData = ^TTreeData;
  TTreeData = record
    Text: WideString;
  end;

In de constructor van het form:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  with VST do
  begin
    NodeDataSize := SizeOf(TTreeData);
    RootNodeCount := 3;

    Node := GetFirst;
    SchapNode := Node;
    NoteData := GetNodeData(Node);
    NoteData.Text := 'Schappen';

    ReclameNode := GetNextSibling(SchapNode);
    NoteData := GetNodeData(ReclameNode);
    NoteData.Text := 'Reclame';

    DemoNode := GetNextSibling(ReclameNode);
    NoteData := GetNodeData(DemoNode);
    NoteData.Text := 'Demo';
  end;

en
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TFormArtikelBeheer.VSTGetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: WideString);
var
  Data: PTreeData;
begin
  Data := Sender.GetNodeData(Node);
  if Assigned(Data) then
    CellText := Data.Text;
end;

procedure TFormArtikelBeheer.VSTFreeNode(Sender: TBaseVirtualTree;
  Node: PVirtualNode);
var Data: PTreeData;
begin
  Data := Sender.GetNodeData(Node);
  if Assigned(Data) then
    Data.Text := '';
end;

Weet iemand hoe ik dit kan oplossen?

Verwijderd

Topicstarter
Heeft dit misschien toch wat te maken met die OnInitNode event? (Ik gebruik die namelijk niet)

Verwijderd

Gebruik BeginUpdate, EndUpdate, als je tekst gaat veranderen.

Verwijderd

Topicstarter
Op donderdag 25 juli 2002 15:39 schreef DiFool het volgende:
Gebruik BeginUpdate, EndUpdate, als je tekst gaat veranderen.
Maakt niks uit, nog steeds hetzelfde probleem.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Op donderdag 25 juli 2002 13:28 schreef tokkie het volgende:
Heeft dit misschien toch wat te maken met die OnInitNode event? (Ik gebruik die namelijk niet)
Nee, dat lijkt mij erg stug. Heb je niet iets vreemds in je OnClick of OnMouseDown ofzo?

Zou je niet gewoon naar een normaal TTeeView gaan? Is er een rede voor dat je zo vasthoud aan deze tree ondanks dat ie je zoveel moeite kost?

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
Op donderdag 25 juli 2002 16:41 schreef LordLarry het volgende:
Heb je niet iets vreemds in je OnClick of OnMouseDown ofzo?
Nee, alleen de code die ik gepost heb, wordt er gebruikt.
Zou je niet gewoon naar een normaal TTeeView gaan? Is er een rede voor dat je zo vasthoud aan deze tree ondanks dat ie je zoveel moeite kost?
Deze tree is sneller, mooier en heeft meer mogelijkheden. Maar hij is wel lastiger. Als het echt niet anders kan, moet ik wel over stappen op de "normale" Tree.

Verwijderd

Dit werkt gewoon bij mij :?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  with VST do
  begin
    BeginUpdate;
    try
    NodeDataSize := SizeOf(TTreeData);
    RootNodeCount := 3;

    Node := GetFirst;
    SchapNode := Node;
    NoteData := GetNodeData(Node);
    NoteData.Text := 'Schappen';

    ReclameNode := GetNextSibling(SchapNode);
    NoteData := GetNodeData(ReclameNode);
    NoteData.Text := 'Reclame';

    DemoNode := GetNextSibling(ReclameNode);
    NoteData := GetNodeData(DemoNode);
    NoteData.Text := 'Demo';
    finally
    EndUpdate;
    end;
  end;

[edit]
Heb je trouwens Header kolommen toegevoegd?

Verwijderd

Topicstarter
Op donderdag 25 juli 2002 18:43 schreef DiFool het volgende:
Heb je trouwens Header kolommen toegevoegd?
Nee, dat is toch niet nodig?

Verwijderd

Nee, maar als je dat wel doet, werkt het volgens mij wel.

Maar werkt bovenstaande nu?

Verwijderd

Topicstarter
Het werkt inderdaad als ik 1 kolom (header) toevoeg. Of dit probleem is een bug (volgens mij niet, want ik kwam geen info tegen over dit probleem en van deze tree wordt zeer veel gebruik van gemaakt) of ik doe iets fout.

Want nu heb je weer het probleem dat die de caption van de nodes half tekent. Dus moet je die breedte weer aanpassen, enz. Dus het is niet de beste oplossing.

Verwijderd

Ik bedoelde eigenlijk de BeginUpdate, EndUpdate.

Verwijderd

Topicstarter
Mooi, het werkt nu. Ik had die BeginUpdate en EndUpdate steeds om de NodeData.Text..... staan


Maar dat bleek niet te werken. Maar hoe jij het zegt, werkt het wel.

Bedankt!
Pagina: 1