AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TVirtualStringTree -> XML

Ein Thema von CalganX · begonnen am 6. Jul 2003 · letzter Beitrag vom 7. Jul 2003
Antwort Antwort
Seite 1 von 2  1 2      
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#1

TVirtualStringTree -> XML

  Alt 6. Jul 2003, 16:53
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
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: TVirtualStringTree -> XML

  Alt 6. Jul 2003, 17:05
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.

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
MadMason

Registriert seit: 9. Nov 2002
Ort: Altenburg
126 Beiträge
 
Delphi 2005 Architect
 
#3

Re: TVirtualStringTree -> XML

  Alt 6. Jul 2003, 17:08
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.
Einstein ist tot
Newton ist tot
und mir ist auch schon ganz schlecht
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: TVirtualStringTree -> XML

  Alt 6. Jul 2003, 17:11
Ich glaube der Fehler liegt am Ende der inneren Schleife  subRootNode := subRootNode.NextSibling; ......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: TVirtualStringTree -> XML

  Alt 6. Jul 2003, 17:27
Hm... eine Idee wäre es, aber lt. den Haltepunkten ist der Fehler noch vor dem
  rootNode := vstProjects.RootNode; Chris
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: TVirtualStringTree -> XML

  Alt 6. Jul 2003, 17:38
Auf ganz suspekte Art und Weise gibt es angeblich in der Zeile
    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
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: TVirtualStringTree -> XML

  Alt 6. Jul 2003, 21:16
Das ist einfach nicht zu fassen!
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..

Chris
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: TVirtualStringTree -> XML

  Alt 7. Jul 2003, 13:18
*jetzt die dp nerv und alle mods aggressiv mach*
Kann mir denn niemand helfen?
Also der Fehler besteht darin, dass die Daten der rootNode-Variable nicht existieren. Allerdings müssen sie das eigentlich...

Chris
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: TVirtualStringTree -> XML

  Alt 7. Jul 2003, 13:30
Poste doch mal den Code, wo Du die Daten in der Root-Node speicherst.

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: TVirtualStringTree -> XML

  Alt 7. Jul 2003, 14:10
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
Angehängte Dateien
Dateityp: zip mpms.zip (658,7 KB, 14x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 03:53 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