Thema: FreePascal Dateien in Excel übertragen

Einzelnen Beitrag anzeigen

Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#1

Dateien in Excel übertragen

  Alt 27. Sep 2019, 15:51
Moin zusammen,

ein wenig weiter bin ich nun gekommen, jedoch scheitere ich an folgender Hürde, da ich leider keine Fehlermeldung erhalte, nur einen "halben" Absturz:
Delphi-Quellcode:
function StringGridToXLS(AXLApp : OleVariant; AGrid : TStringGrid; Sheetname : widestring):Boolean;
var
  Sheet: OLEVariant;
  MaxCol : Integer;
  MaxRow : Integer;
  Range : OleVariant;
  Data : OleVariant;
  Col : Integer;
  Row : Integer;
  R1,R2 : string;
begin
  Result := False;
  try
    //Worksheet auswählen
    if (Sheetname <> '') and HaveSheet(AXLApp, String(Sheetname)) then
    begin
      Sheet := AXLApp.WorkSheets[sheetname];
    end else
    begin
      Sheet := AXLApp.WorkSheets[1];
    end;
    Sheet.select;
    if AXLApp.ActiveSheet.FilterMode then
    begin
      AXLApp.ActiveSheet.ShowAllData;
    end;
    // Der vorhandenen Daten im Grid, nicht der möglichen in Excel...
    MaxCol := AGrid.ColCount;
    MaxRow := AGrid.RowCount;

    if (MaxRow > 0) and (MaxCol > 0) then
    begin
      //Bereich auswählen
      R1 := RefToCell(1, 1);
      R2 := RefToCell(MaxCol, MaxRow);
      Range := Sheet.Range[R1, R2]; //--ABSTURZ--!!
      if not VarIsNull(Range) then
      begin
        //Daten aus Grid holen
        Data := VarArrayCreate([1, MaxRow, 1, MaxCol], varVariant);
        for Row := 0 to Pred(MaxRow) do
        begin
          for Col := 0 to Pred(MaxCol) do
          begin
            Data[Succ(Row), Succ(Col)] := AGrid.Cells[Col, Row];
          end;
        end;
        //Daten dem Excelsheet übergeben
        Range.Value := Data;
        Range.Columns.AutoFit;
        Result := True;
      end;
    end;
  finally
    SaveExcel(AXLApp);
    Range := UnAssigned;
    Sheet := Unassigned;
    Data := Unassigned;
  end;
end;
An der markierten Stelle, also bei Range := Sheet.Range[R1, R2]; //--ABSTURZ--!! stürzt das Programm ab.
Die Werte in R1 und R2 sind korrekt ermittelt worden und in weder in Excel noch sonst irgendwie erhalte ich eine Fehlermeldung.
Ich lande in Lazarus nur im Assembler: 0000000077C7F2D0 895c2420 mov %ebx,0x20(%rsp) und muss sowohl das Programm als auch Excel dann "killen". Was macht Lazarus hier wieder anders?
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.
  Mit Zitat antworten Zitat