Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Virtualstringtree Exception beim aufklappen (https://www.delphipraxis.net/127855-virtualstringtree-exception-beim-aufklappen.html)

WS1976 20. Jan 2009 06:31


Virtualstringtree Exception beim aufklappen
 
Hallo,
ich habe, mit virtualstringtree, eine Tabelle mit Subnodes erzeugt.
Beim Aufklappen des Subnodes bekomme ich eine in der VSTGetText Methode eine Zugriffsverletzung. Weiss nicht warum.
Kann mir jemand helfen?

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, VirtualTrees, StdCtrls, ImgList;

type
  POmeinedaten=^TOmeinedaten;
  TOmeinedaten=class
  private
  published
  public
    Bezeichnung:string;
    Feld:array[1..6] of string;
    Fobject:tobject;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    VST: TVirtualStringTree;
    ImageList1: TImageList;
    procedure Button1Click(Sender: TObject);
    procedure VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
      Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
    procedure FormCreate(Sender: TObject);
  private
    function add_entry(node:PVirtualNode;bez,f1,f2,f3,f4,f5,f6:string):PVirtualNode;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.add_entry(node:PVirtualNode;bez,f1,f2,f3,f4,f5,f6:string):PVirtualNode;
var daten:TOmeinedaten;
begin
  daten:=TOmeinedaten.Create;
  If node<>nil then
     Begin
       daten:=vst.GetNodeData(node);
     End;
        daten.Bezeichnung:=bez;
        daten.Feld[1]:=f1;
        daten.Feld[2]:=f2;
        daten.Feld[3]:=f3;
        daten.Feld[4]:=f4;
        daten.Feld[5]:=f5;
        daten.Feld[6]:=f6;
  result:=vst.addchild(node,daten);
end;

procedure TForm1.Button1Click(Sender: TObject);
var I:Integer;
aNode:PVirtualNode;
begin
  anode:=add_entry(nil,'Telegramm aktiv Ein','s','s','s','s','s','s');
  add_entry(anode,'Telegramm aktiv Ein passiv','a','a','a','a','a','a');
//  node:=add_entry(nil,'Telegramm aktiv Aus','','','','','','');
//  node:=add_entry(nil,'Telegramm aktiv Aus passiv','','','','','','');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  vst.nodedatasize:=sizeof(TOmeinedaten);
end;

procedure TForm1.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var
  data : TOmeinedaten;t0:integer;
begin
  data:=TOmeinedaten(VST.getnodedata(node)^);
        case Column of
        0: celltext:=Data.Bezeichnung;
        1: celltext:=Data.Feld[1];
        2: celltext:=Data.Feld[2];
        3: celltext:=Data.Feld[3];
        4: celltext:=Data.Feld[4];
        5: celltext:=Data.Feld[5];
        6: celltext:=Data.Feld[6];
        end;
end;

end.
Grüsse
Rainer

nuclearping 20. Jan 2009 06:49

Re: Virtualstringtree Exception beim aufklappen
 
Was hast du denn bisher schon versucht, um die Zugriffsverletzung im OnGetText einzugrenzen? Kommt die AV IMMER, egal welche Column? Oder nur bei bestimmten Columns? Oder erwartest du, dass jemand deinen Code kopiert, ein neues Projekt erstellt und es für dich debuggt? ... Oder oder oder?

Vorallem verstehe ich hier wieder nicht, warum du in deinem Fall mit Klassen als Knotendaten arbeitest, statt mit Records?

Dir sollte auch klar sein, dass du - nach meinem Verständnis der Materie - mit
Delphi-Quellcode:
daten:=TOmeinedaten.Create;
  If node<>nil then
     Begin
       daten:=vst.GetNodeData(node);
     End;
die Instanz des Objekts "daten" überschreibst, wenn "node<>nil" ist. Somit haben deine Unterknoten keine "TOmeinedaten"-Instanz, was auch der Grund für deine AV sein wird.

WS1976 20. Jan 2009 07:25

Re: Virtualstringtree Exception beim aufklappen
 
Hallo nuclearping,

es geht doch sicherlich, im Ton, auch etwas freundlicher oder?

Zitat:

Vorallem verstehe ich hier wieder nicht, warum du in deinem Fall mit Klassen als Knotendaten arbeitest, statt mit Records?
Ist ganz einfach! In die Klasse werden später Objects aufgenommen. (Checkboxes, Comboboxes usw)

Zitat:

Oder erwartest du, dass jemand deinen Code kopiert, ein neues Projekt erstellt und es für dich debuggt? ... Oder oder oder?
Um Himmels Willen, das erwarte ich nicht. Aber es könnte ja sein, dass irgendjemand eine Idee hat.

Sobald ich die celltext aus der VSTGetText rausnehme funktioniert das.

Ich habe die get_entry Methode geändert. Bringt auch nichts.
Delphi-Quellcode:
function TForm1.add_entry(node:PVirtualNode;bez,f1,f2,f3,f4,f5,f6:string):PVirtualNode;
var daten:TOmeinedaten;
begin
  If node<>nil then
     Begin
       daten:=vst.GetNodeData(node);
     End
  else
     Begin
       daten:=TOmeinedaten.Create;
     End;
        daten.Bezeichnung:=bez;
        daten.Feld[1]:=f1;
        daten.Feld[2]:=f2;
        daten.Feld[3]:=f3;
        daten.Feld[4]:=f4;
        daten.Feld[5]:=f5;
        daten.Feld[6]:=f6;
  result:=vst.addchild(node,daten);
end;
Grüsse
Rainer

nuclearping 20. Jan 2009 07:44

Re: Virtualstringtree Exception beim aufklappen
 
Ich kling nur so unfreundlich, weil das da absolut "dahingeschusselt" aussieht. Fast so, als ob du selbst nicht wirklich wüßtest, was du da machst.

Afaik werden Check- und Comboboxes auch nicht SO in den Baum gebracht, sondern über Property-Links oder wie das heisst.

Zitat:

Ich habe die get_entry Methode geändert. Bringt auch nichts.
Ja, weil du's damit noch schlimmer gemacht hast. Wie wäre es so?
Delphi-Quellcode:
function TForm1.add_entry(node:PVirtualNode;bez,f1,f2,f3,f4,f5,f6:string):PVirtualNode;
var daten:TOmeinedaten;
begin
  daten:=TOmeinedaten.Create;

        daten.Bezeichnung:=bez;
        daten.Feld[1]:=f1;
        daten.Feld[2]:=f2;
        daten.Feld[3]:=f3;
        daten.Feld[4]:=f4;
        daten.Feld[5]:=f5;
        daten.Feld[6]:=f6;
  result:=vst.addchild(node,daten);
end;

WS1976 20. Jan 2009 08:06

Re: Virtualstringtree Exception beim aufklappen
 
Hallo nuclearping,

ich hab das Teil (VST) nach der Anleitung ( Video hier in der DP ) programmiert.
Wieso ist der Code "hingeschusselt"?
Könntest du mir etwas genauer erklären was du damit meinst?

Grüsse
Rainer

nuclearping 20. Jan 2009 08:11

Re: Virtualstringtree Exception beim aufklappen
 
Schau dir doch einfach die Demos an, die beim VST dabei sind (Advanced Demo). Die deckt eigentlich alles ab.

WS1976 20. Jan 2009 08:21

Re: Virtualstringtree Exception beim aufklappen
 
Hallo,

beim neuesten Installationsteil zum VST sind keine Beispiele mehr dabei und die alten funktionieren nicht mehr komplett.
Man kann damit eigentlich nichts mehr anfangen. Uminstallieren mag ich das Ganze auch nicht.

Noch etwas:
Lass doch bitte, in deinen Beiträgen, die bewertenden Äusserungen weg.
Könnte sein, dass du damit jemanden kränkst oder verletzt.
Bitte antworte nicht mehr. Für mich ist das Thema erledigt.

Grüsse
Rainer


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:59 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