Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TVirtualStringTree -> XML (https://www.delphipraxis.net/6317-tvirtualstringtree-xml.html)

CalganX 6. Jul 2003 16:53


TVirtualStringTree -> XML
 
Hi,
ich programmiere derzeit ein Projektmanagementsystem, bei dem, in einem TVirtualStringTree (http://www.delphi-gems.com), Projekte und Sourcefiles stehen.
Beim beenden sollen diese Daten in eine XML-Datei gespeichert werden. Dazu muss man wissen, dass der Sinn vom TVST ist, dass jede Node eigentlich ein record (bzw. ein Pointer auf ein Record) ist und somit die Node an sich die Daten beeinhaltet (meiner Meinung nach das genialste, was jemals erfunden wurde ;)).

Nun werden die Daten aber nicht richtig gespeichert. Der Aufbau ist der folgende (in den [ stehen die vers. Eigenschaften, die sichtbar sind):
Code:
+ Projekt [Projektverzeichnis, Projektname, Projektsprache, Projektprogrammiersprache]
|- Sourcefile [Dateiname, Programmiersprache
|- Sourcefile
+ Projekt
+ Projekt
|- Sourcefile
|- Sourcefile
|- Sourcefile
|- Sourcefile
+ Projekt
 .
 .
 .
Meine Prozedur zum speichern sieht folgendermaßen aus:
Delphi-Quellcode:
type
  TData = record
    mode: byte;                // 0 = Project
                                // 1 = Sourcefile
    Name: WideString;
    PrgLanguage: WideString;   // Programminglanguage
    Language: WideString;      // Language / only 0
    ProjectDir: WideString;    // only 0
    FileName: WideString;      // only 1
  end;
  PData = ^TData;
{...}
procedure TMainForm.SaveToXML(aFileName: string);
var
  xmlDoc: IXMLDOMDocument2;
  mainNode, subNode, subsubNode: IXMLDOMNode;
  curData, curSubData: TData;
  rootnode, subrootnode: PVirtualNode;
  i, j: integer;
  f: TextFile;
begin
  DeleteFile(aFileName);
  AssignFile(f, aFileName);
  Rewrite(f);
  writeln(f, '<?xml version="1.0"?>');
  writeln(f, '<projects>');
  writeln(f, '</projects>');
  CloseFile(f);

  xmlDoc := CoDOMDocument40.Create();
  xmlDoc.load(aFileName);

  if XMLDoc.parseError.errorCode <> 0 then begin
    ShowMessage('XML Fehler: ' + #13#10 + XMLDoc.parseError.reason + #13#10
                + 'Source: ' + xmldoc.parseError.srcText);
    xmldoc := nil;
  end;

  rootNode := vstProjects.RootNode;
 
  for i:=0 to vstProjects.RootNodeCount - 1 do begin
    curData := PData(vstProjects.GetNodeData(rootNode))^;
    if not Assigned(@curData) then break;
    mainNode := xmlDoc.createElement('project');

    xmlDoc.documentElement.appendChild(mainNode);
    subNode := xmlDoc.createElement('name');
    subNode.text := curData.Name;
    mainNode.appendChild(subNode);

    xmlDoc.documentElement.appendChild(mainNode);
    subNode := xmlDoc.createElement('prglanguage');
    subNode.text := curData.PrgLanguage;
    mainNode.appendChild(subNode);

    xmlDoc.documentElement.appendChild(mainNode);
    subNode := xmlDoc.createElement('language');
    subNode.text := curData.Language;
    mainNode.appendChild(subNode);

    xmlDoc.documentElement.appendChild(mainNode);
    subNode := xmlDoc.createElement('projectdir');
    subNode.text := curData.ProjectDir;
    mainNode.appendChild(subNode);

    xmlDoc.documentElement.appendChild(mainNode);
    subNode := xmlDoc.createElement('sourcefiles');
    subRootNode := rootNode.LastChild;
    for j:=0 to rootNode.ChildCount - 1 do begin
      curSubData := PData(vstProjects.GetNodeData(subRootNode))^;

      xmlDoc.documentElement.appendChild(mainNode);
      subsubNode := xmlDoc.createElement('name');
      subsubNode.text := curSubData.Name;
      subNode.appendChild(subsubNode);

      xmlDoc.documentElement.appendChild(mainNode);
      subsubNode := xmlDoc.createElement('prglanguage');
      subsubNode.text := curSubData.PrgLanguage;
      subNode.appendChild(subsubNode);

      xmlDoc.documentElement.appendChild(mainNode);
      subsubNode := xmlDoc.createElement('filename');
      subsubNode.text := curSubData.FileName;
      subNode.appendChild(subsubNode);

      subRootNode := subRootNode.NextSibling;
    end;
    mainNode.appendChild(subNode);
    xmlDoc.save(aFileName);

    rootNode := rootNode.NextSibling;
  end;
end;
Beim speichern bricht er einfach ab mit einer AccessViolation, aber ohne eine Zeile anzugeben. Grund? Ich habe keine Ahnung.

Habt ihr eine Idee? Ich vermute, dass ich einen Fehler beim Umgang mit den Pointern gemacht habe.

Chris

sakura 6. Jul 2003 17:05

Re: TVirtualStringTree -> XML
 
Der ist schwer nachzuvollziehen ;-) Setze doch mal ein paar Messageboxen und schaue, wenn er abbricht, vielleicht kommst Du damit der "bösen" Zeile auf die Schliche.

...:cat:...

MadMason 6. Jul 2003 17:08

Re: TVirtualStringTree -> XML
 
setz doch einfach in der ersten zeile des Algos einen Haltepunkt und geh die Prozedure Zeile für Zeile durch, dann ist wenigstens schon mal die Zeile identifiziert.

sakura 6. Jul 2003 17:11

Re: TVirtualStringTree -> XML
 
Ich glaube der Fehler liegt am Ende der inneren Schleife
Delphi-Quellcode:
  subRootNode := subRootNode.NextSibling;
...:cat:...

CalganX 6. Jul 2003 17:27

Re: TVirtualStringTree -> XML
 
Hm... eine Idee wäre es, aber lt. den Haltepunkten ist der Fehler noch vor dem
Delphi-Quellcode:
  rootNode := vstProjects.RootNode;
Chris

CalganX 6. Jul 2003 17:38

Re: TVirtualStringTree -> XML
 
Auf ganz suspekte Art und Weise gibt es angeblich in der Zeile
Delphi-Quellcode:
    curData := PData(vstProjects.GetNodeData(rootNode))^;
den Fehler. Das habe ich mir auch irgendwo schon gedacht, denn irgendwie habe ich das Gefühl, dass der Source an dieser Stelle äußerst daneben ist... :\

Chris

CalganX 6. Jul 2003 21:16

Re: TVirtualStringTree -> XML
 
:wall: Das ist einfach nicht zu fassen! :cry:
Egal, was ich mache: der Fehler bleibt. Ich habe inzwischen alle möglichen Möglichkeiten, meiner Meinung nach, ausprobiert, aber es hat bisher nichts gebracht.. :evil:

Chris

CalganX 7. Jul 2003 13:18

Re: TVirtualStringTree -> XML
 
*jetzt die dp nerv und alle mods aggressiv mach*
Kann mir denn niemand helfen? :cry:
Also der Fehler besteht darin, dass die Daten der rootNode-Variable nicht existieren. Allerdings müssen sie das eigentlich... :(

Chris

sakura 7. Jul 2003 13:30

Re: TVirtualStringTree -> XML
 
Poste doch mal den Code, wo Du die Daten in der Root-Node speicherst.

...:cat:...

CalganX 7. Jul 2003 14:10

Re: TVirtualStringTree -> XML
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hm...
Ich hänge das ganze einfach mal an. Eigentlich braucht man zusätzlich nur noch TVST der aktuellen Version. SynEdit ist verwerflich.
Aber zur "Übersichtlichkeit" wegen hier mal die weiteren wichtigen Stellen:
Delphi-Quellcode:
procedure TMainForm.miNewProjectClick(Sender: TObject); // neues Projekt
var
  newNode: PVirtualNode;
  newData: PData;
begin
  newNode := vstProjects.AddChild(nil);
  vstProjects.Text[newNode, 1] := 'test';
  newData := vstProjects.GetNodeData(newNode);
  newData^.mode := 0;
  newData^.Name := vstProjects.DefaultText;
  newData^.ProjectDir := '';
end;

procedure TMainForm.miiCreateNewClick(Sender: TObject); // neue Datei
var
  selData: PData;
  selNode: PVirtualNode;
  newData: PData;
  newNode: PVirtualNode;
begin
  vstProjects.BeginUpdate;
  selNode := vstProjects.FocusedNode;
  if not Assigned(selNode) then Exit;
  selData := vstProjects.GetNodeData(selNode);
  if selData^.mode <> 0 then selNode := selNode.Parent;
  newNode := vstProjects.AddChild(selNode);
  newData := vstProjects.GetNodeData(newNode);
  newData^.mode := 1;
  newData^.Name := 'Neue Sourcefile';
  newData^.PrgLanguage := selData^.PrgLanguage;
  vstProjects.FullExpand(selNode);
  vstProjects.EndUpdate;
  vstProjects.Refresh;
end;
Chris


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