Delphi-PRAXiS
Seite 2 von 2     12   

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)

sakura 7. Jul 2003 14:25

Re: TVirtualStringTree -> XML
 
Bevor ich mir den VST installiere, tue mir mal den Gefallen und poste noch vstProjects.GetNodeData(....);

Danke,
...:cat:...

CalganX 7. Jul 2003 14:28

Re: TVirtualStringTree -> XML
 
vstProjects ist das VST. Hier GetNodeData(...);:
Delphi-Quellcode:
{Copy & Paste from VirtualTrees.pas by http://www.delphi-gems.com}
function TBaseVirtualTree.GetNodeData(Node: PVirtualNode): Pointer;

// Returns the address of the user defined data area in the node.

begin
  Assert(FNodeDataSize > 0, 'NodeDataSize not initialized.');
 
  if (FNodeDataSize <= 0) or (Node = nil) or (Node = FRoot) then
    Result := nil
  else
    Result := PChar(@Node.Data) + FTotalInternalDataSize;
end;
Chris

sakura 7. Jul 2003 14:32

Re: TVirtualStringTree -> XML
 
Ich weiss zwar nicht, was Du in der Proc erreichen willst, aber für die RootNode gibt die wohl immer nil zurück.

Code:
{Copy & Paste from VirtualTrees.pas by http://www.delphi-gems.com}
function TBaseVirtualTree.GetNodeData(Node: PVirtualNode): Pointer;

// Returns the address of the user defined data area in the node.

begin
  Assert(FNodeDataSize > 0, 'NodeDataSize not initialized.');
 
  if (FNodeDataSize <= 0) or (Node = nil) [u][b][color=#ff0008]or (Node = FRoot) [/color][/b][/u]then
    Result := nil
  else
    Result := PChar(@Node.Data) + FTotalInternalDataSize;
end;
...:cat:...

CalganX 7. Jul 2003 14:36

Re: TVirtualStringTree -> XML
 
:shock:
:wiejetzt:
Hm... das ist schlecht... Sehr schlecht. Und was kann man da tun?

Chris

sakura 7. Jul 2003 14:43

Re: TVirtualStringTree -> XML
 
Du solltest in Deinen Code mal direkt auf das Data zugreifen, oder den Node-Data Pointer separat speichern und darauf zurück zu greifen. Vielleicht hilft es Dir. Oder Du versuchst, die Original Sourcen (nach Backup!) zu ändern und neu kompilieren.

...:cat:....

CalganX 7. Jul 2003 15:03

Re: TVirtualStringTree -> XML
 
*ächz* Gott sei Dank gibt es sowas, wie MSN Messenger. Mit philwo's Hilfe habe ich es dann doch hinbekommen.
so sieht das ganze jetzt aus:
Code:
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);

  xmlDoc.setProperty('NewParser', true);


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

[color=#ff0000] rootNode := vstProjects.RootNode.FirstChild; [/color]

  for i:=0 to vstProjects.RootNodeCount - 1 do begin
    if rootNode = nil then Exit;
    curData := PData(vstProjects.GetNodeData(rootNode))^;
    if not Assigned(@curData)then ShowMessage('Alert');
    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');
[color=#ff0000]   subRootNode := rootNode.FirstChild;[/color]
    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;
Chris

sakura 7. Jul 2003 15:17

Re: TVirtualStringTree -> XML
 
Super, dann schalte noch die "offene Frage" aus und Du darfst weiterprogrammieren :coder:

...:cat:...

P.S.: Ich habe nichts gesagt, ist schon geschehen ;-)


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

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-2025 by Thomas Breitkreuz