AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein virtualstringtree in excel exportieren
Thema durchsuchen
Ansicht
Themen-Optionen

virtualstringtree in excel exportieren

Ein Thema von youuu · begonnen am 13. Jul 2010 · letzter Beitrag vom 20. Jul 2010
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.386 Beiträge
 
Delphi 12 Athens
 
#1

AW: virtualstringtree in excel exportieren

  Alt 16. Jul 2010, 09:10
Es kommt auch erstmal darauf an, wie du die Daten im VST ablegst/anzeigst/verwaltest.

dieses ließt z.B. alle Hauptknoten/Zeilen aus (wenn man den VST als Tabelle nutzt:
Delphi-Quellcode:
var
  RowCount: Integer;
  Row: PVirtualNode;
begin
  RowCount := VirtualStringTree1.RootNodeCount;
  Row := VirtualStringTree1.RootNode;
  while Assigned(Row) do begin

    // die Spalten der jeweiligen Zeile aus Row.Data auslesen,
    // irgendwie wirst du dort ja die Daten verwalten

    Row := Row.NextSibling;
  end;
end;
Aber ich würde nicht den Export aus dem VST erzeugen.
- im Hintergrund liegen alle Daten in einer eigenen Struktur/Liste rum
- der VST wird, für die Anzeige mit dieser Struktur/Liste verknüpft
- auch der Export wird aus der internen Liste erstellt

Der VST ist ja gerade dafür entworfen wurden, daß er selber keine Daten vorhalten/verwalten muß, sondern z.B. nur Zeiger auf die Daten bekommt und diese dann "virtuell" anzeigt, aber aus externen Quellen holt.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (16. Jul 2010 um 09:13 Uhr)
  Mit Zitat antworten Zitat
youuu

Registriert seit: 2. Sep 2008
Ort: Kleve
822 Beiträge
 
Delphi 2010 Professional
 
#2

AW: virtualstringtree in excel exportieren

  Alt 16. Jul 2010, 09:34
Ah, gut das versteh ich.
Auch wenn es sich jetzt dumm anhört, wie spicht man die Liste an in der diese Daten liegen?
Steven
  Mit Zitat antworten Zitat
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#3

AW: virtualstringtree in excel exportieren

  Alt 16. Jul 2010, 11:32
@himitsu: dazu muß der Export aber die Struktur kennen. Wenn das nicht der Fall ist, dann muß man direkt aufs VST gehen. Hat den Vorteil das der Export dann universell bleibt.

Hier noch mein Vorschlag (ein wenig Umgebaut von himitsus post):

Delphi-Quellcode:
procedure ExportVirtualStringTreeToExcel(VirtualStringTree : TVirtualStringTree);
var
  ExcelApp,
  Workbook,
  Worksheet,
  Range,
  Data : OleVariant;
  iCol,
  iRow,
  ColCount,
  RowCount : Integer;
  FNodeData : PGridTreeData;
  FNode : PVirtualNode;
begin
  //Verbindung zu Excel herstellen
  ExcelApp := CreateOleObject('Excel.Application');
  if not VarIsNull(ExcelApp) then
  begin
    //Neues Workbook öffnen
    Workbook := ExcelApp.Workbooks.Add;
    //Worksheet auswählen
    Worksheet := Workbook.ActiveSheet;
    if not VarIsNull(Workbook) then
    begin
      RowCount := VirtualStringTree.TotalCount;
      ColCount := VirtualStringTree.Header.Columns.Count;

      if (RowCount > 0) and (ColCount > 0) then
      begin
        //Bereich auswählen
        Range := Worksheet.Range[RefToCell(1, 1), RefToCell(ColCount, RowCount)];
        if not VarIsNull(Range) then
        begin
          Data := VarArrayCreate([0, RowCount - 1,
                                  0, ColCount - 1], varVariant);

          with VirtualStringTree do
          begin
            FNode := GetFirst;

            for iRow := 0 to RowCount - 1 do
            begin
              FNodeData := GetNodeData(FNode);
              for iCol := 0 to ColCount - 1 do
              begin
                Data[iRow, iCol] := FNodeData^.Columns[iCol];
              end;

              FNode := GetNext(FNode);
            end;
          end;

          Range.Value := Data;
          Range.Columns.AutoFit;
          //Excel anzeigen
          Workbook.Activate;
          ExcelApp.Visible := True;
        end;
      end;
    end
    else
      raise Exception.Create('neues Workbook konnte nicht angelegt werden');
  end
  else
    raise Exception.Create('Excel.Application konnte nicht geladen werden');
end;
Das ist übrigens Late-binding.

Gruß David
  Mit Zitat antworten Zitat
youuu

Registriert seit: 2. Sep 2008
Ort: Kleve
822 Beiträge
 
Delphi 2010 Professional
 
#4

AW: virtualstringtree in excel exportieren

  Alt 19. Jul 2010, 07:31
Schönen guten Morgen,

danke David, allerdings funktioniert diese Stelle bei mir nicht

FNodeData : PGridTreeData; undeklarierter Bezeichner wird mir da zurück gegeben.
Steven

Geändert von mkinzler (20. Jul 2010 um 07:44 Uhr) Grund: Code-Tag durch Delphi-Tag ersetzt
  Mit Zitat antworten Zitat
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#5

AW: virtualstringtree in excel exportieren

  Alt 19. Jul 2010, 13:04
ich sehe gerade das der Export so doch nicht unabhänig von den Daten ist.

Hier was noch fehlt:
Delphi-Quellcode:
type
  TGridTreeData = record
    Columns : TStringList;
  end;
  PGridTreeData = ^TGridTreeData;
Das sind quasi die Daten einer Reihe. Entweder übernimmst du das so, oder du nimmst deine eigene Struktur.

David
  Mit Zitat antworten Zitat
youuu

Registriert seit: 2. Sep 2008
Ort: Kleve
822 Beiträge
 
Delphi 2010 Professional
 
#6

AW: virtualstringtree in excel exportieren

  Alt 19. Jul 2010, 13:16
Hm da erhalt ich eine Zugriffsverletzung bei.
Steven
  Mit Zitat antworten Zitat
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#7

AW: virtualstringtree in excel exportieren

  Alt 19. Jul 2010, 14:10
Wie sieht denn bei dir die Datenstruktur aus, in die du die Daten schreibst?

Hier noch wie wir das machen:
Delphi-Quellcode:
procedure TfraGLOB_VSTAnalyseGrid.LoadVST;
var
  GridNodeData : PGridTreeData;
  newGridNode : PVirtualNode;
  i : integer;
begin
  FDataSource.DataSet.Open;
  FDataSource.DataSet.First;

  vstAnalyse.Clear;
  vstAnalyse.BeginUpdate;

  while not FDataSource.DataSet.Eof do
  begin
    newGridNode := vstAnalyse.AddChild(nil);
    GridNodeData := vstAnalyse.GetNodeData(newGridNode);
    vstAnalyse.ValidateNode(newGridNode, false);
    GridNodeData^.Columns := TStringList.Create;

    for i := 0 to FDataSource.DataSet.Fields.Count - 1 do
      GridNodeData^.Columns.Add(FDataSource.DataSet.Fields[i].AsString);

    FDataSource.DataSet.Next;
  end;

  vstAnalyse.EndUpdate;
  SetHeaders;
  SetColumnWidth;

  newGridNode := vstAnalyse.GetFirst;

  if newGridNode <> nil then
  begin
    vstAnalyse.Selected[newGridNode] := true;
  end;
  
  SetControls;
end;

Geändert von David Martens (19. Jul 2010 um 14:16 Uhr)
  Mit Zitat antworten Zitat
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#8

AW: virtualstringtree in excel exportieren

  Alt 19. Jul 2010, 15:21
Na dann ist es doch einfach:
(Dann steht auch ColCount fest)

Delphi-Quellcode:
procedure ExportVirtualStringTreeToExcel(VirtualStringTree : TVirtualStringTree);
var
  ExcelApp,
  Workbook,
  Worksheet,
  Range,
  Data : OleVariant;
  iCol,
  iRow,
  ColCount,
  RowCount : Integer;
  FData : TData;
  FNode : PVirtualNode;
begin
  //Verbindung zu Excel herstellen
  ExcelApp := CreateOleObject('Excel.Application');
  if not VarIsNull(ExcelApp) then
  begin
    //Neues Workbook öffnen
    Workbook := ExcelApp.Workbooks.Add;
    //Worksheet auswählen
    Worksheet := Workbook.ActiveSheet;
    if not VarIsNull(Workbook) then
    begin
      RowCount := VirtualStringTree.TotalCount;
      ColCount := VirtualStringTree.Header.Columns.Count;

      if (RowCount > 0) and (ColCount > 0) then
      begin
        //Bereich auswählen
        Range := Worksheet.Range[RefToCell(1, 1), RefToCell(ColCount, RowCount)];
        if not VarIsNull(Range) then
        begin
          Data := VarArrayCreate([0, RowCount - 1,
                                  0, ColCount - 1], varVariant);

          with VirtualStringTree do
          begin
            FNode := GetFirst;

            for iRow := 0 to RowCount - 1 do
            begin
              // hier steht jetzt deine Datenstruktur
              FData := TData(VstScan.GetNodeData(node)^);
              Data[iRow, 0] := FData.name;
              Data[iRow, 1] := FData.url;
              Data[iRow, 2] := FData.date;

              // oder so, dann brauchst du FData nicht:
              Data[iRow, 0] := TData(VstScan.GetNodeData(node)^).name;
              Data[iRow, 1] := TData(VstScan.GetNodeData(node)^).url;
              Data[iRow, 2] := TData(VstScan.GetNodeData(node)^).date;

              FNode := GetNext(FNode);
            end;
          end;

          Range.Value := Data;
          Range.Columns.AutoFit;
          //Excel anzeigen
          Workbook.Activate;
          ExcelApp.Visible := True;
        end;
      end;
    end
    else
      raise Exception.Create('neues Workbook konnte nicht angelegt werden');
  end
  else
    raise Exception.Create('Excel.Application konnte nicht geladen werden');
end;
Das ist übrigens Late-binding.

Gruß David[/QUOTE]

Geändert von David Martens (19. Jul 2010 um 15:24 Uhr)
  Mit Zitat antworten Zitat
youuu

Registriert seit: 2. Sep 2008
Ort: Kleve
822 Beiträge
 
Delphi 2010 Professional
 
#9

AW: virtualstringtree in excel exportieren

  Alt 19. Jul 2010, 20:33
Hmmmm Wieder Exception mit Lesen von Adresse 0000000 als wenn es nicht existiert.


Bei: FData := TKundendata(VirtualStringTree.GetNodeData(node)^); Edit: Ok habs gefunde.

Bei: FData := TKundendata(VirtualStringTree.GetNodeData(FNode)^); muss es heißen, das "F" leder vergessen gehabt.

Super nun klappt es, Danke David
Steven

Geändert von mkinzler (20. Jul 2010 um 12:23 Uhr) Grund: Code-Tags durch Delphi-Tags ersetzt
  Mit Zitat antworten Zitat
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#10

AW: virtualstringtree in excel exportieren

  Alt 20. Jul 2010, 12:20
Bitte
  Mit Zitat antworten Zitat
Antwort Antwort


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 15:44 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