AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Daten-Rekord zu TreeView hinzufügen - Problem/AV
Thema durchsuchen
Ansicht
Themen-Optionen

Daten-Rekord zu TreeView hinzufügen - Problem/AV

Ein Thema von Jim Carrey · begonnen am 2. Nov 2016 · letzter Beitrag vom 3. Nov 2016
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
Jim Carrey
(Gast)

n/a Beiträge
 
#1

Daten-Rekord zu TreeView hinzufügen - Problem/AV

  Alt 2. Nov 2016, 10:46
Ich bin scheinbar wieder zu doof die Sachen anzuwenden, die ich einst gelernt habe.
Für eine VirtualStringTree die nur sehr wenige Nodes enthalten soll (weniger als 10), benutze ich ein Rekord und folgendes Konstrukt:

Delphi-Quellcode:
type
 PVSTData = ^TVSTData;

 TVSTData = packed record
  sTitle, sInformation: string;
 end;
Delphi-Quellcode:
procedure AddVSTStructure(aVST: TVirtualStringTree; aRecord: TVSTData);
var
 Data: PVSTData;
 Node: PVirtualNode;
begin
 Node := aVST.AddChild(nil);
 Data := aVST.GetNodeData(Node);

 Data^ := aRecord;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 aVSTData: TVSTData;
begin
 aVSTData.sTitle:= 'Title';
 aVSTData.sInformatio := 'Info';
 AddVSTStructure(VirtualStringTree1, aVSTData);
end;

procedure TForm1.VirtualStringTree1FreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
 Data: PVSTData;
begin
 Data := VirtualStringTree1.GetNodeData(Node);
 Finalize(Data^);
end;
Den Code AddVSTStructure habe ich vor langer Zeit hier im Forum gefunden und er hat auch immer funktioniert.
Nur bei diesem simplen Beispiel erhalte ich eine AV beim Klicken auf den Button (Zugriffsverletzung). Der node wird hinzugefügt, es gibt aber eine AV.
Das Problem ist: mein Testprojekt enthält nur diesen Button, das VST und sonst nichts.

Geändert von Jim Carrey ( 2. Nov 2016 um 11:00 Uhr)
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Ich bin wieder zu doof - TreeView

  Alt 2. Nov 2016, 10:58
Gibt Deinem Beitrag bitten dennoch einen Aussagekräftigen Titel - das macht es für andere leichter, diesen zu finden, wenn sie ein ähnliches Problem haben.
Danke Dir.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Headbucket

Registriert seit: 12. Dez 2013
Ort: Dresden
172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

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

  Alt 2. Nov 2016, 11:11
In welcher Zeile tritt denn die access violation auf?
Mir ist aufgefallen, dass bei deiner AddVSTStructure Methode der Aufruf von ValidateNode fehlt. Aber das hat nichts mit der access violation zu tun... .

Das ganze sollte jedoch so aussehen:
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;
Zitat:
The method ValidateNode will initialise the nodes. This is important at the freeing of the data, because otherwise the data will be released into the memory. The first parameter
must be the node you want to initialise, the second if you also want to initialise its children.
Wie sieht denn deine GetText-Methode des VST aus?

Grüße
Headbucket
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#4

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

  Alt 2. Nov 2016, 11:13
Also am SourceCode selbst kann ich keinen Fehler erkennen. Bist du mal mit dem Debugger durchgegangen und hast dir (ggf. anhand des StackTraces) mal angeschaut wo er die AV bringt?

EDIT: Von der Methode AddChild() sollte man generell Abstand nehmen. Siehe auch den Kommentar über dere AddChild() Methode in der VirtualTrees.pas

Dann brauchst du auch keine ValidateChildren mehr, da du die Daten dann selbst vorhalten musst.
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#5

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

  Alt 2. Nov 2016, 11:14
Wo die AV auftritt weiß ich nicht. Der Code hat wie gesagt bisher immer wunderbar funktioniert.

Delphi-Quellcode:
procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
var
 Data: PVSTData;
begin
 Data := VirtualStringTree1.GetNodeData(Node);

 CellText := Data.sTitle;
end;
Ich hasse VirtualStringTree einfach.
Ich dachte ich kann schnell einen Node mit 1 Children erzeugen und delbst das klappt nicht.

Edit:
Zitat:
EDIT: Von der Methode AddChild() sollte man generell Abstand nehmen. Siehe auch den Kommentar über dere AddChild() Methode in der VirtualTrees.pas
Naja, weil ich ja eh weniger als 10 Nodes hinzufüge dieses mal dachte ich, nehme ich die "einfache" Variante ohne TObjectList und all dem Quark.

Geändert von Jim Carrey ( 2. Nov 2016 um 11:16 Uhr)
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#6

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

  Alt 2. Nov 2016, 11:16
Wo die AV auftritt weiß ich nicht. Der Code hat wie gesagt bisher immer wunderbar funktioniert.

Delphi-Quellcode:
procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
var
 Data: PVSTData;
begin
 Data := VirtualStringTree1.GetNodeData(Node);

 CellText := Data.sTitle; // <------------------ HIER FEHLT EIN ZIRKUMFLEX
end;
Das sollte der Fehler sein. Richtig müsste es lauten: CellText := Data^.sTitle;
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#7

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

  Alt 2. Nov 2016, 11:18
Das sollte der Fehler sein. Richtig müsste es lauten: CellText := Data^.sTitle;
AV kommt noch immer beim Beenden des Programms obwohl ich beim beenden Der Demo absolut nichts mache

Also im Prinzip einfach:
wenn ich die Zeile im Button mit AddVSTStructure() weglasse, kommt keine AV.
  Mit Zitat antworten Zitat
Headbucket

Registriert seit: 12. Dez 2013
Ort: Dresden
172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

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

  Alt 2. Nov 2016, 11:18
Data ist ein Zeiger. Du versuchst also in GetText auf die Adresse dieses Zeigers zuzugreifen und dort dann auf den Record...das klappt natürlich nicht. Du solltest auf den INHALT des Zeigers zugreifen:
Delphi-Quellcode:
procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
var
 Data: PVSTData;
begin
 Data := VirtualStringTree1.GetNodeData(Node);
 CellText := Data^.sTitle;
end;
Hast du ValidateNode hinzugefügt?

Grüße
Headbucket

Geändert von Headbucket ( 2. Nov 2016 um 11:20 Uhr) Grund: Edit: Man bin ich langsam
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#9

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

  Alt 2. Nov 2016, 11:20
Ich baue euch mal eine Demo.
Angehängte Dateien
Dateityp: zip VST_DEMO.zip (1,10 MB, 7x aufgerufen)

Geändert von Jim Carrey ( 2. Nov 2016 um 11:24 Uhr)
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#10

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

  Alt 2. Nov 2016, 11:24
Lass mal das FreeNode Event komplett weg. Nimm es aus dem Objektinspektor einfach mal raus. Spielt jetzt erstmal keine Rolle ob ein Memory Leak ensteht oder nicht. Wenn dann keine AV mehr kommt, dann kann ich es mir nur noch so erklären, dass es an dem Finalize() liegt. Obwohl das eigentlich kein Problem machen sollte.

Das Ding ist nur, dass beim Klick auf den Button noch kein FreeNode ausgeführt wird, deshalb dürfte der Fehler auch da nicht drin liegen.

Welche VST Version verwendest du denn?

Ich hasse VirtualStringTree einfach.
Ich dachte ich kann schnell einen Node mit 1 Children erzeugen und delbst das klappt nicht.
Wenn du einmal einen funktionierenden VST hast und dich richtig mit der Komponente beschäftigst/beschäftigen kannst, dann wirst du ihn lieben.

Ich baue euch mal eine Demo.
Ja das wäre mal nicht schlecht.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:46 Uhr.
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