Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Fragen zu VirtualTreeView (https://www.delphipraxis.net/213831-fragen-zu-virtualtreeview.html)

H.Bothur 2. Okt 2023 23:12

Fragen zu VirtualTreeView
 
Moin,

ich arbeite das Tutorial zu Virtualtreeview durch und habe schon auf den ersten Seiten zwei Fragen:

1) auf Seite zwei wird geschrieben wie man an einer bestimmten Stelle einen Node einfügen kann:

Delphi-Quellcode:
Node := vst.InsertNode(vst.FocusedNode, amInsertAfter);
allerdings wird bei mir das "amInsertAfter" als unbekannt markiert - fehlt mir da ein uses ?


2) auf Seite 3 werden Noites mit Beschriftung erstellt:

Delphi-Quellcode:
function AddVSTStructure(AVST: TCustomVirtualStringTree; ANode: PVirtualNode;
 ARecord: TTreeData): PVirtualNode;
var
  Data: PTreeData;
begin
  Result:=AVST.AddChild(ANode);
  Data:=AVST.GetNodeData(Result);
  Avst.ValidateNode(Result, False);
  Data^.FCaption:=ARecord.FCaption;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
  I: Integer;
  TreeData: TTreeData;
begin
  VST.NodeDataSize:=SizeOf(TTreeData);
  VST.BeginUpdate;
  for I:=0 to 100 do
  begin
    TreeData.FCaption:='Node-Nummer: '+IntToStr(I);
    AddVSTStructure(VST,nil,TreeData);
  end;
  VST.EndUpdate;
end;
Ich hötte erwartet das jetzt statt "Node" immer "Node-Nummer 1..2..3..4..usw" steht - es steht aber weiterhin nur Node.
Denke ich da falsch ? Was mache ich denn wenn da nicht nur Node stehen soll.´??

Hans

DieDolly 2. Okt 2023 23:37

AW: Fragen zu VirtualTreeView
 
amInsertAfter war in der Unit VirtualTrees.pas.
Mit Version 7.6, die du scheinbar nutzt, gab es Breaking Changes. Deswegen ist amInsertAfter jetzt in VirtualTrees.Types.pas.

jaenicke 3. Okt 2023 06:04

AW: Fragen zu VirtualTreeView
 
Zitat:

Zitat von H.Bothur (Beitrag 1527618)
Ich hötte erwartet das jetzt statt "Node" immer "Node-Nummer 1..2..3..4..usw" steht - es steht aber weiterhin nur Node.
Denke ich da falsch ? Was mache ich denn wenn da nicht nur Node stehen soll.´??

Du zeigst nur den Teil, in der diese Information in die Datenstruktur geschrieben wird. Fehlt vielleicht das OnGetText Event? Dort bekommt der Tree von dir die Information welcher Text in der angegebenen Zeile und Spalte angezeigt werden soll.

H.Bothur 3. Okt 2023 11:01

AW: Fragen zu VirtualTreeView
 
Zitat:

Zitat von DieDolly (Beitrag 1527619)
amInsertAfter war in der Unit VirtualTrees.pas.
Mit Version 7.6, die du scheinbar nutzt, gab es Breaking Changes. Deswegen ist amInsertAfter jetzt in VirtualTrees.Types.pas.

Danke !

Zitat:

Zitat von jaenicke (Beitrag 1527620)
Zitat:

Zitat von H.Bothur (Beitrag 1527618)
Ich hötte erwartet das jetzt statt "Node" immer "Node-Nummer 1..2..3..4..usw" steht - es steht aber weiterhin nur Node.
Denke ich da falsch ? Was mache ich denn wenn da nicht nur Node stehen soll.´??

Du zeigst nur den Teil, in der diese Information in die Datenstruktur geschrieben wird. Fehlt vielleicht das OnGetText Event? Dort bekommt der Tree von dir die Information welcher Text in der angegebenen Zeile und Spalte angezeigt werden soll.

OK - ich hätte geacht das beim zeichnen des Baums diese Daten mit angezeigt werden :-) ... aber ich arbeite mal weiter - wird wohl noch kommen :-)

Hans

jaenicke 3. Okt 2023 11:37

AW: Fragen zu VirtualTreeView
 
Zitat:

Zitat von H.Bothur (Beitrag 1527627)
OK - ich hätte geacht das beim zeichnen des Baums diese Daten mit angezeigt werden :-)

Du selbst hast ja die Datenstruktur außerhalb der Komponente definiert. Daher kennt die Komponente auch deren Struktur nicht und kann damit auch nichts anfangen. Daher musst du der Komponente die Daten daraus geben, wenn diese sie zur Anzeige braucht (OnGetText) und die Komponente sagt dir Bescheid, wenn der Benutzer diese im Baum verändert hat (OnSetText), damit du sie in deine Datenstruktur schreiben kannst.

DieDolly 3. Okt 2023 11:37

AW: Fragen zu VirtualTreeView
 
Zitat:

OK - ich hätte geacht das beim zeichnen des Baums diese Daten mit angezeigt werden ... aber ich arbeite mal weiter - wird wohl noch kommen
Wenn ich du wäre, würde ich das ganze AddVSTStructure-Ding wegwerfen. So habe ich das auch gemacht und es ist totaler Mist. Diese Tutorials sollten verboten werden.

Speichere deine Daten in einer ObjectList oder sowas Klassenstruktur. Damit lässt es sich wesentlich besser arbeiten. Das ist anfänglich mehr Aufwand, aber es lohnt sich.

mytbo 3. Okt 2023 14:30

AW: Fragen zu VirtualTreeView
 
Zitat:

Zitat von H.Bothur (Beitrag 1527627)
OK - ich hätte geacht das beim zeichnen des Baums diese Daten mit angezeigt werden :-)

Ein Beispiel für die Umsetzung findest du in diesem Artikel mit Quelltext.

Bis bald...
Thomas

jaenicke 3. Okt 2023 18:46

AW: Fragen zu VirtualTreeView
 
Zitat:

Zitat von DieDolly (Beitrag 1527629)
Wenn ich du wäre, würde ich das ganze AddVSTStructure-Ding wegwerfen. So habe ich das auch gemacht und es ist totaler Mist. Diese Tutorials sollten verboten werden.

Mittlerweile geht das auch generisch, so dass die Pointerspielerei außen wegfällt. Grundsätzlich kommt es auf den Anwendungsfall an, ob das Sinn macht. Für viele Zwecke macht die Vorgehensweise durchaus Sinn.

H.Bothur 5. Okt 2023 12:51

AW: Fragen zu VirtualTreeView
 
Leider habe ich noch eine Frage da ich etwas noch nicht verstehe - geht um das Speichern der Daten. Ich habe noch nie mit Streams gearbeitet, deswegen stehe ich da ein bisschen auf dem Schlauch.

Zum Speichern wird folgende procedure genutzt:

Delphi-Quellcode:
procedure TForm1.vstSaveNode(Sender: TBaseVirtualTree; Node: PVirtualNode;
 Stream: TStream);
var
  Data: PTreeData;
  Len: integer;
begin
  Data := vst.GetNodeData(Node);
  Len := Length(Data.TestStr);
  Stream.write(Len, SizeOf(Len));
  Stream.write(PChar(Data.TestStr)^, Len);
end;
Da sind die Daten aber nur ein String, wie geht das denn wenn es mehrere Strings sind ? So etwa ? Das kommt mir kompliziert vor:

Delphi-Quellcode:
procedure TSerienDB.VSTSaveNode(Sender: TBaseVirtualTree; Node: PVirtualNode; Stream: TStream);
var
  Data: PTreeData;
  Len: integer;
begin
  Data := VST.GetNodeData(Node);
  Len := Length(Data.FCaption);
  Stream.write(Len, SizeOf(Len));
  Stream.write(PChar(Data.FCaption)^, Len);
  Len := Length(Data.FColumn1);
  Stream.write(Len, SizeOf(Len));
  Stream.write(PChar(Data.FColumn1)^, Len);
  Len := Length(Data.FColumn2);
  Stream.write(Len, SizeOf(Len));
  Stream.write(PChar(Data.FColumn2)^, Len);
  Len := Length(Data.FColumn3);
  Stream.write(Len, SizeOf(Len));
  Stream.write(PChar(Data.FColumn3)^, Len);
end;
Wie ist das denn richtig ?

Gruss
Hans

himitsu 5. Okt 2023 13:13

AW: Fragen zu VirtualTreeView
 
Zitat:

PChar und Length
NEIN :!:

Delphi-Quellcode:
Len := Length(S) * SizeOf(S[1]);
// oder
Len := Length(S) * SizeOf(Char);
Denn PChar = PWideChar
und WideChar = 2 Byte (seit Delphi 2009, also seit 15 Jahren schon)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:32 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz