Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   virtualstringtree in excel exportieren (https://www.delphipraxis.net/152931-virtualstringtree-excel-exportieren.html)

David Martens 19. Jul 2010 13:04

AW: virtualstringtree in excel exportieren
 
:oops: 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

youuu 19. Jul 2010 13:16

AW: virtualstringtree in excel exportieren
 
Hm da erhalt ich eine Zugriffsverletzung bei.

David Martens 19. Jul 2010 14:10

AW: virtualstringtree in excel exportieren
 
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;

youuu 19. Jul 2010 14:21

AW: virtualstringtree in excel exportieren
 
Delphi-Quellcode:
type
  Tdata = class
    name: WideString;
    url: WideString;
    date: WideString;
end;
So ist meine Struktur

Delphi-Quellcode:
with data do
  Begin
    data.name := NameExport(RKundenSource.Lines.Text);
    data.date := DateExport(RKundenSource.Lines.Text);  
    data.url := sl[i];                
  end;

  VstScan.update;
  VstScan.addchild(nil, data);
  VstScan.endupdate;

David Martens 19. Jul 2010 14:23

AW: virtualstringtree in excel exportieren
 
Als Klasse? Das geht doch bei VST garnicht.

youuu 19. Jul 2010 14:25

AW: virtualstringtree in excel exportieren
 
Also bislang funktionierte es super, bzw. hatte keine Probleme damit.

David Martens 19. Jul 2010 14:47

AW: virtualstringtree in excel exportieren
 
Wie greifst du denn später auf "data" aus VstScan.addchild(nil, data); zu?

Moment ich sehe gerade:

Zitat:

Zitat von youuu (Beitrag 1036188)
Code:
type
  Tdata = class
    name: WideString;
    url: WideString;
    date: WideString;
end;
So ist meine Struktur

Code:
with data do
  Begin
    Kunde.name := NameExport(RKundenSource.Lines.Text);
    Kunde.date := DateExport(RKundenSource.Lines.Text);  
    Kunde.url := sl[i];                
  end;

  VstScan.update;
  VstScan.addchild(nil, data);
  VstScan.endupdate;

Da haut was nicht hin. Was ist denn Kunde, das ist in der Klasse doch garnicht definiert. Damit speicherst du nicht ab.

Versuchs mal hiermit

Delphi-Quellcode:
  TGridTreeData = record
    name: WideString;
    url: WideString;
    date: WideString;
  end;
  PGridTreeData = ^TGridTreeData;

...
var
  GridNodeData : PGridTreeData;
  newGridNode : PVirtualNode;
begin
    newGridNode := vstAnalyse.AddChild(nil);
    GridNodeData := vstAnalyse.GetNodeData(newGridNode);
    vstAnalyse.ValidateNode(newGridNode, false);

    GridNodeData^.name := NameExport(RKundenSource.Lines.Text);
    GridNodeData^.date := DateExport(RKundenSource.Lines.Text);  
    GridNodeData^.url := sl[i];

youuu 19. Jul 2010 14:52

AW: virtualstringtree in excel exportieren
 
Also, wenn ich eine Zeile anklick(Doppelklick)

lass les ich so all die Daten ein.

Delphi-Quellcode:
  Node:= VstScan.FocusedNode;

  data:= TData(VstScan.GetNodeData(node)^ );
Edit: oben nochmal Editiert, das mit Kunde war ein Kopie Fehler.
Probiere dein nachher aus, wenn ich zurück bin.

David Martens 19. Jul 2010 15:21

AW: virtualstringtree in excel exportieren
 
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]

youuu 19. Jul 2010 20:33

AW: virtualstringtree in excel exportieren
 
Hmmmm Wieder Exception mit Lesen von Adresse 0000000 als wenn es nicht existiert.


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

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

Super nun klappt es, Danke David


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:13 Uhr.
Seite 3 von 4     123 4      

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