![]() |
TreeView als *.html-Datei speichern
Nabend,
Ich hoffe mir kann jemand bei meinem Problem behilflich sein. Ich möchte die Struktur eines TreeViews in eine *.html-Datei speichern und mein Problem ist, dass ich wohl eine Endlosschleife programmiert habe ... :roteyes: Hier erst mal die Prozedur die den TreeView abspeichern soll:
Delphi-Quellcode:
und hier wird sie aufgerufen:
procedure TForm1.FillHTMLNodes(var StartIndex : Integer; EndNode : TTreeNode);
var i : Integer; Node1, Node2 : TTreeNode; NewIndex : Integer; CurItem : TTreeNode; begin Node1 := JvTreeView1.Items[StartIndex]; Writeln(FText, '<ul>'); if (Node1.Index <> EndNode.Index) then begin repeat Writeln(Ftext, '[*]' + Node1.Text + ''); Node2 := Node1.GetNext; if (Node2.Index < EndNode.Index) then begin if (Node2.Level <> Node1.Level) then begin NewIndex := Node2.Index; FillHTMLNodes(NewIndex, JvTreeView1.Items[JvTreeView1.Items.Count - 1]); end (* of if *) else Node1 := Node1.GetNextVisible; end; (* of if *) Writeln(FText, '[/list]'); until (Node2.Index = EndNode.Index); Writeln(FText, '[/list]'); end; (* of if *) end;
Delphi-Quellcode:
procedure TForm1.BitBtn_SaveHtmlClick(Sender: TObject);
var StartIndex : Integer; begin if (JvTreeView1.Items.Count > 0) then begin if JvSaveDialog1.Execute then begin AssignFile(FText, JvSaveDialog1.FileName); Rewrite(FText); try Writeln(FText, '<html>'); Writeln(FText, '<head>'); Writeln(FText, '<title>FolderTree</title>'); Writeln(FText, '</head>'); Writeln(FText, '<body> '); Writeln(FText, 'Verzeichnis und Dateiliste für ' + DirName + ' '); StartNode := 0; FillHTMLNodes(StartIndex, JvTreeView1.Items[JvTreeView1.Items.Count-1]); Writeln(FText, '</body>'); Writeln(FText, '</html>'); finally CloseFile(FText); end; end; (* of if *) end (* of if *) else ShowMessage('Es sind keine Ordner/Dateien vorhanden!'); end; Jedenfalls kommt, wenn ich den TreeView abspeichere, immer die gleiche Sequenz. Erst hat Node2 den Index 0, dann 1, dann 2 und dann wieder 0 (???). Ich habe auch oben schon einmal den rekursiven Aufruf der Prozedur ausgeklammert, aber daran lag es nicht, der Fehler blieb immer noch bestehen. Also wenn Node1.Index = 2 ist und oben Node1.GetNext ausgeführt wird, erhält Node2 den Knoten mit dem Index 0. Somit kann die Abbruchbedingung nie erfüllt werden. Ich hoffe ihr findet vielleicht den groben Schnitzer - den ich nicht finde, falls da einer ist oder könnt mir anderweitig behilflich sein. Ich bedanke mich und wünsche eine geruhsame Nacht... Lorenz |
Re: TreeView als *.html-Datei speichern
Hallo,
ich hoffe, ich habe dein Problem richtig verstanden. Wenn ja, habe ich diese kleine, UNGETESTETE, Funktion für dich geschustert, Kann sehr gut sein, dass ich mich bei manchen property-Namen vertan habe. Das Prinzip soltle aber klar sein. Übrigens rücke ich normalerweise nicht mit Tabs ein, das liegt daran, dass ich das ganze in einem HTML-Editor geschrieben habe, weil ich ihn gerade schon offen hatte und keinen bock, die IDE zu starten^^
Delphi-Quellcode:
//Edit: Doch nochmal was zur Funktionsweise: Die Funktion listet alle Subknoten des Übergebenen Start-Knotens auf.
function NodeAsHTML(Node: TTreeNode): string;
var i: integer; subnode: TTreeNode; begin result := '<ul>'; for i := 0 to node.count-1 do begin subnode := node.nodes[i]; result := result+format('[*]%s',[subnode.text]); if subnode.count > 0 then result := result+NodeAsHTML(subnode); end; result := result+ '[/list]'; end; |
Re: TreeView als *.html-Datei speichern
Hallo,
hier noch ein Ansatz:
Delphi-Quellcode:
Gute Nacht
uses
StrUtils // DupeString() ; // encode characters not allowed in html text function HtmlText(const s: string): string; begin Result := s; // poor man's encoding end; procedure NodesToHtml( node: TTreeNode; // node to start with lines: TStrings; // stringlist to receive html count: Integer; // number of nodes to process const indent: string = ' ' // level indentation ); var s: string; begin lines.BeginUpdate; // pause rendering if Assigned(node) then // safety first begin s := DupeString(indent, node.Level); // prepare indentation lines.Add(s + '<ul>'); repeat Dec(count); lines.Add(s + indent + '[*]' + HtmlText(node.Text) + ''); if node.HasChildren then NodesToHtml(node.getFirstChild, lines, node.Count, indent); node := node.getNextSibling; until not Assigned(node) or (count < 1); lines.Add(s + '[/list]'); end; lines.EndUpdate; // restart rendering end; |
Re: TreeView als *.html-Datei speichern
Recht herzlichen Dank für die Tipps, habt mir sehr weitergeholfen ... ;)
Bis zum nächsten Mal Lorenz |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:29 Uhr. |
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