Abstürze bei Ole Automation
-
Hi,
ich programiere noch nicht all zu lange in C++ und habe jetzt ein Problem beim speichern von nem StringGrid in Excel.
Bei mir gibt es zwischen 1 und 50 Stringgriddateien, die eingelesen werden.
Für jeden Datensatz legt er in Excel ne neue Tabelle an und benennt sie Datensatz x, wobei x für die Datensatznummer steht.
Wenn ich die Excel speichern funktion zum ersten mal in der Laufzeit aufrufe, funktioniert auch alles wunderbar.Wenn ich Excel dann schließe und das ganze nochmal machen will, bekomme ich bei Datensatz2 ne Access Violation.
Das heißt Datensatz1 wird komplett exportiert und beim 2. ändert er nur noch den Tabellenname und stürzt dann ab.
Ich bin kurz vor dem verzweifeln.Hoffe ihr könnt mir weiterhelfen.
Gruß Benjamin
#define SIZEOF_BUFFER 1024 FILE *fp; int row; char *buffer=new char[SIZEOF_BUFFER]; Variant Excel; Excel = Variant::CreateObject("Excel.Application"); Excel.OlePropertyGet("ActiveWorkBook"); Excel.OlePropertyGet("WorkBooks").OleFunction("Add"); Excel.OlePropertySet("Visible",1); Variant WorkSheets = Excel.OlePropertyGet("Worksheets"); for(int x=1;x<maxDatensatz;x++) { WorkSheets.OleFunction("Add"); } for(int z=0;z<maxDatensatz;z++) { Variant WorkSheet = WorkSheets.OlePropertyGet("Item", z+1); WorkSheet.OlePropertyGet("Columns",1).OlePropertySet("ColumnWidth",10); WorkSheet.OlePropertyGet("Columns",2).OlePropertySet("ColumnWidth",15); WorkSheet.OlePropertyGet("Columns",3).OlePropertySet("ColumnWidth",15); WorkSheet.OlePropertyGet("Columns",4).OlePropertySet("ColumnWidth",25); AnsiString Blattname="Datensatz " +IntToStr(z+1); WorkSheet.OlePropertySet("Name",Blattname.c_str()); Datensatzname=ExtractFilePath(Application->ExeName)+"Grid"+IntToStr(z+1)+".dat"; // Hier wird ein Stringgrid mit Daten gefüttert if((fp=fopen(Datensatzname.c_str(), "r"))==NULL) { ShowMessage("Datei konnte nicht geöffnet werden"); delete buffer; return; } fgets(buffer, SIZEOF_BUFFER, fp); if(memcmp(buffer, "StringGridData", 14)!=0) { ShowMessage("Keine StringGrid Datendatei !"); fclose(fp); delete buffer; return; } fgets(buffer, SIZEOF_BUFFER, fp); StringGrid1->RowCount=atoi(buffer); fgets(buffer, SIZEOF_BUFFER, fp); StringGrid1->ColCount=atoi(buffer); for(row=0; fgets(buffer, SIZEOF_BUFFER, fp); row++) StringGrid1->Rows[row]->CommaText=buffer; fgets(buffer, SIZEOF_BUFFER, fp); Form1->Datum->Caption=buffer; fgets(buffer, SIZEOF_BUFFER, fp); Form1->Probennummer->Caption=buffer; fgets(buffer, SIZEOF_BUFFER, fp); Form1->Systemnummer->Caption=buffer; fgets(buffer, SIZEOF_BUFFER, fp); Form1->Programmnummer->Caption=buffer; fgets(buffer, SIZEOF_BUFFER, fp); Form1->Dichte->Caption=buffer; fclose(fp); delete buffer; for(int i=0;i<4;i++) { Variant Range = WorkSheet.OlePropertyGet("Cells", 1, i+1); AnsiString FeldWert=StringGrid1->Cells[i][0]; Range.OlePropertySet("Value", FeldWert.c_str() ); } for(int x=0;x<15;x++) { for(int y=0;y<4;y++) { Variant Range = WorkSheet.OlePropertyGet("Cells", x+1, y+1); AnsiString FeldWert=StringGrid1->Cells[y][x]; Range.OlePropertySet("Value", FeldWert.c_str() ); } } }
-
Ich weiß nicht,
vielleicht könnte man auch den Aufruf von Excel, anders machen, dann wäre das Problem vielleicht auch behoben.Das FAQ hat mich da aber nicht weitergebracht,...