Einzelnen Beitrag anzeigen

Peter666

Registriert seit: 11. Aug 2007
357 Beiträge
 
#3

AW: VirtualTreeview -> HTML

  Alt 7. Apr 2019, 10:33
Danke für die Antwort. Das Problem ist, dass ich einen Stream auswerte und die Ergebnisse aufbereitet in dem Virtualtreeview speichere. Da noch eine zusätzliche Baumstruktur zu hinterlegen ist doppelgemoppelt. Was ich aber jetzt gemacht habe ist die Passage für den HTML Export zu extrahieren und alles was dort mit css zu tun hat, habe ich entfernt.

Falls jemand den Code dazu brauchen sollte:

Delphi-Quellcode:
function ContentToHTML(ATree: TVirtualStringTree): String;
var
  Buffer: TBufferedUTF8String;
  I,J : Integer;
  Level, MaxLevel: Cardinal;
  Save, Run: PVirtualNode;
  Text: String;

  RenderColumns: Boolean;
  Columns: TColumnsArray;
  Index: Integer;

begin
  Buffer := TBufferedUTF8String.Create;
  try
    Buffer.Add('<table>');
    Buffer.AddNewLine;

    Columns := nil;
    RenderColumns := ATree.Header.UseColumns;
    if RenderColumns then
      Columns := ATree.Header.Columns.GetVisibleColumns;

    Run := ATree.GetFirst;
    Save := Run;

    MaxLevel := 0;
    while Assigned(Run) do
    begin
          Level := ATree.GetNodeLevel(Run);
          if Level > MaxLevel then
            MaxLevel := Level;
      Run := ATree.GetNext(Run);
    end;

    if RenderColumns then
    begin
      Buffer.Add('<tr>');
      Buffer.AddNewLine;
      // Make the first row in the HTML table an image of the tree header.
      for I := 0 to High(Columns) do
      begin
        Buffer.Add('<th>');
        if Length(Columns[I].Text) > 0 then
          Buffer.Add(Columns[I].Text);
        Buffer.Add('</th>');
      end;
      Buffer.Add('</tr>');
      Buffer.AddNewLine;
    end;

    Run := Save;
    while Assigned(Run) do
    begin
      Level := ATree.GetNodeLevel(Run);
      Buffer.Add('<tr>');
      Buffer.AddNewLine;

      I := 0;
      while (I < Length(Columns)) or not RenderColumns do
      begin
        if RenderColumns then
          Index := Columns[I].Index
        else
          Index := NoColumn;

        if not RenderColumns or (coVisible in Columns[I].Options) then
        begin
          if Index = ATree.Header.MainColumn then
            // Create a cell for each indentation level.
              for J := 1 to Level do
                Buffer.Add('<td>&nbsp;</td>');

          Buffer.Add(' <td>');
          Text := ATree.Text[Run, Index];
          if Length(Text) > 0 then
            Buffer.Add(Text);
          Buffer.Add('</td>');
        end;

        if not RenderColumns then
          Break;
        Inc(I);
      end;
      Run := ATree.GetNext(Run);
      Buffer.Add(' </tr>');
      Buffer.AddNewLine;
    end;
    Buffer.Add('</table>');

    Result := Buffer.AsUTF8String;
  finally
    Buffer.Free;
  end;
end;
Ich werde nun die ganzen Table Referenzen durch divs ersetzen.
  Mit Zitat antworten Zitat