Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Daten-Rekord zu TreeView hinzufügen - Problem/AV (https://www.delphipraxis.net/190739-daten-rekord-zu-treeview-hinzufuegen-problem-av.html)

Jim Carrey 2. Nov 2016 11:26

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Demo befindet sich im Beitrag oben drüber =)
Da ist nur das Nötigste drin.

Aviator 2. Nov 2016 11:36

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Zitat:

Zitat von Jim Carrey (Beitrag 1352417)
Demo befindet sich im Beitrag oben drüber =)
Da ist nur das Nötigste drin.

Also beim Start deiner fertigen Exe habe ich keine AV bekommen. :shock:

Nachdem ich sie dann neu compiliert habe (auch im Release Modus), kam sie dann.

Die AV tritt bei mir in der folgenden Zeile auf:
Delphi-Quellcode:
Data^ := aRecord;
Scheinbar gibt es da irgendwie Probleme beim Kopieren der Daten. Auf
Delphi-Quellcode:
sInformation
kann beim Debuggen z.B. nicht zugegriffen werden. Beim Debuggen durch den Disassebly Code bleibt er in der Methode
Delphi-Quellcode:
UStrAsg
hängen die von
Delphi-Quellcode:
CopyRecord
aufgerufen wird. Es ist also wohl keine gute Idee einen Record zu übergeben und den dann weiterzuverarbeiten.

Auch das Umschreiben auf einen normalen record anstatt eines packed record hat bei mir nichts gebracht.

EDIT: Vielleicht kann jaenicke dazu noch was sagen. Er benutzt den VST ja auch häufig und kann dir bei dem Fehler bestimmt noch besser helfen.

Alternativ bleibt wohl, dass du nicht über eine Zwischenprozedur gehst oder zumindest über eine, die die Daten nicht übergeben bekommt. Oder du steigst auf eine Miniklasse um. Ist zwar vielleicht etwas overkill, aber wird den Fehler wohl beheben und du hast mehr Möglichkeiten in der Zukunft.

Jim Carrey 2. Nov 2016 11:38

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Das ist sehr seltsam. Früher habe ich ausschließlich diese "Dirty-Methode" benutzt und hatte nie Probleme :cry:
Ich habe gerade noch rausbekommen, dass die AV nur kommt, wenn man mindestens 2x den Button drückt.

Jim Carrey 2. Nov 2016 11:58

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe das Ganze jetzt mal zum Test auf eine TObjectList umgestellt und es funktioniert ohne Fehler.
Dann muss ich wohl doch die TObjectList nehmen :(

Gleich nach dem Essen muss ich dann nur noch rausbekommen, wie man Unterknoten einfügt und betitelt.

rokli 2. Nov 2016 12:29

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Moin!

sag mal, fehlt bei Dir möglicherweise die Größenzuweisung?

Delphi-Quellcode:
   VST.NodeDataSize   := SizeOf(TTreeData);

Gruß

Jim Carrey 2. Nov 2016 12:54

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
- Problem hat sich erledigt, ich benutze letzten Endes das VST doch nicht, da es mich zu sehr nervt :lol:

Aviator 2. Nov 2016 14:27

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Zitat:

Zitat von Jim Carrey (Beitrag 1352426)
- Problem hat sich erledigt, ich benutze letzten Endes das VST doch nicht, da es mich zu sehr nervt :lol:

Komisch. :roll:
Ihr gebt immer alle so schnell auf wenn mal etwas nicht funktioniert. Und dabei ist der VST eigentlich sehr einfach zu benutzen wenn man ihn mal verstanden hat. :shock:

Jim Carrey 2. Nov 2016 15:07

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Naja. Das VST sieht schöner aus keine Frage. Aber das ListView kann ich viel einfacher speichern und laden.
Das VST speichert mir nur irgendwelche Dateien mit kryptischen Inhalt.
Das ist auch ein Grund.

Jim Carrey 2. Nov 2016 17:01

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Wie würde ich bei diesem Beispiel denn an den String "sInformation" kommen und es im Child eines Nodes anzeigen lassen?

Aviator 2. Nov 2016 18:07

AW: Daten-Rekord zu TreeView hinzufügen - Problem/AV
 
Zitat:

Zitat von Jim Carrey (Beitrag 1352461)
Wie würde ich bei diesem Beispiel denn an den String "sInformation" kommen und es im Child eines Nodes anzeigen lassen?

Also generell werden Daten eigentlich der Node zugeordnet, die auch später die Informationen anzeigen soll. Man kann natürlich auch auf die Node Daten des Parents zugreifen und sich dort die Informationen ziehen.

Hier mal ein Beispiel wie das aussehen könnte (nur hier im Editor runtergetippt).

Das wäre jetzt der Fall, wenn die Daten der Node zugeordnet werden, welche diese auch anzeigen soll.
Delphi-Quellcode:
procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex;
  TextType: TVSTTextType; var CellText: string);
var
 Data: PVSTData;
begin
  Data := VirtualStringTree1.GetNodeData(Node);

  case Sender.GetNodeLevel(Node) of
    0: CellText := Data^.sTitle;
    1: CellText := Data^.sInformation;
  end;
end;
Das wäre jetzt der Fall, wenn die Daten vom Parent gezogen werden.
Delphi-Quellcode:
procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex;
  TextType: TVSTTextType; var CellText: string);
var
 Data: PVSTData;
begin
  case Sender.GetNodeLevel(Node) of
    0:
    begin
      Data := Sender.GetNodeData(Node);
      CellText := Data^.sTitle;
    end;

    1:
    begin
      Data := Sender.GetNodeData(Node^.Parent); // Hier kann man ja sicher sein, dass ein Parent existiert, da der NodeLevel 1 ist
      CellText := Data^.sInformation;
    end;
  end;
end;
Eigentlich nicht so kompliziert. Du musst eben nur die richtige Datenstruktur im Hintergrund haben um ordentlich damit arbeiten zu können. Alternativ zu den Records kannst du auch Klassen verwenden (mache ich lieber). Die lassen sich dann einfacher mit ObjectLists speichern und das FreeNode Event fällt dadurch auch weg. Zusätzlich kann man statt AddChild() die Events OnInitNode() und OnInitChildren() verwenden, was den virtuellen Modus nochmal etwas besser herausstechen lässt.

Wenn du es dann ganz extrem machen willst, dann kannst du den Klassen auch jeweils ein Interface spendieren und pro NodeLevel eine eigene Klasse hinterlegen. Dieses Interface stellt dann bspw. eine GetText() Methode zur Verfügung mit der sich der Tree bequem die anzuzeigenden Daten ziehen kann.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:45 Uhr.
Seite 2 von 4     12 34      

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