Zugriff verweigert (Öffnen einer 2. Excel Datei) (Excel Warpperklasse)
-
Bleibt die Excelinstanz in deiner Klasse erhalten?
Beim Durchschauen ist mir auch aufgefallen, dass die CloseWorkbook Funktion einen Fehler hat. Sie sollte so aussehen.bool TMLExcel::CloseWorkbook(AnsiString BookName) { try { int temp=IndexOfWorkbooks(BookName); if(Connect && temp != -1) //Test von temp gegen -1 und nicht gegen 0 var_Excel.OlePropertyGet("Workbooks",temp).OleProcedure("Close"); else return false; UpdateBookList(); return true; } catch (...) { return false; } }
IndexOfWorkbooks gibt -1 und nicht 0 zurück wenn das Workbook nicht existiert. Das problem kann also bei allen Funktionen auftreten, die IndexOfWorkbooks verwenden.
-
Ich habe mal meine Änderungen der Excel-Klasse hier eingepflegt.
http://www.c-plusplus.net/forum/viewtopic-var-t-is-214989.html
Welche Office Variante hast du eigentlich?
-
Hallo,
also when ich CloseWorkbook aufrufe bleibt die Excel Instanz zumindest geöffnet. Diese schließe ich dann mit OleFunction("Quit").
Das Problem mit Zugriff auf "DateiName" verweigert besteht weiter.
Danke schon mal für die Verbesserung
Gruß
Grim
-
Nochmal die Frage, Welche Office-Version verwendest du?
In einer Antwort in dem von mir verlinkten Thread hat jemand von Problemen mit Office 2007 berichtet. Da ich das nicht habe, kann ich dazu aber nichts sagen.
-
Hallo,
ich verwende Office 2002 SP3.
Wird aber im Laufe des Jahres auf Office 2007 umgestellt.Gruß
Mathias
-
Ich kann dein Problem nicht nachvollziehen. Evtl. kannst du ja mal etwas mehr Code zeigen oder falls das zuviel ist, mir dein Projekt schicken.
-
So hier mal etwas mehr.
Diese Routine wird geöffnet nachdem beim Standard Öffnendialog gerufen wird.Gruß
void __fastcall TDesignForm::FileOpen1Accept(TObject *Sender) { //Routine die gerufen wird, sobald der FileOpen-Dialog beendet wird //Danach soll eine Musterprojekt geöffnet werden AnsiString path, fname; AnsiString ModDatFName, ModDatFName2, s1, s2; bool test; bool case2; path = ExtractFilePath(FileOpen1->Dialog->FileName); ED.ProjFName = FileOpen1->Dialog->FileName; ED.FilePath = path; ED.Excel = new TMLExcel; ED.Excel->OpenWorkbook(ED.ProjFName); fname = ExtractFileName(ED.ProjFName); this->ProjektNameFrame->Wert->Text = fname; bool existsProj; existsProj = false; s1 = "test"; s2 = "test"; AnsiString Item, name; int count = 0; int i, k, j, l; j = 0; for(l = 0; l < 2; l++) { for(k = 0; k < ED.Excel->WorkbookCount; k++) { for(i = 0; i < ED.Excel->Books[k]->WorksheetCount; i++) { name = ED.Excel->Books[k]->Sheets[i]->Name; if(name == "EDaten(T)") { existsProj = true; this->ProjektNrFrame->Wert->Text = ED.Excel->Books[k]->Sheets[i]->CellString[6][2]; if(this->ProjektNrFrame->Wert->Text == "6345789") { this->ProjektNrFrame->Wert->Text = ""; } this->KundeFrame->Wert->Text = ED.Excel->Books[k]->Sheets[i]->CellString[5][2]; if(this->ProjektNrFrame->Wert->Text == "6345789") { this->ProjektNrFrame->Wert->Text = ""; } this->DatenQuelleFrame->Wert->Text = ""; } } } } if(!existsProj) { ShowMessage("Die gewaehlte Datei ist keine Projektdatei!"); this->ProjektNameFrame->Wert->Text = "Projekt"; } //Teilinitialisierung //Es werden weder Elektronik, noch Blechschnitt initialisiert ED.Init(-1,-1,-1); test = false; ED.Excel->CloseWorkbook(ED.ProjFName); ED.Excel->DeusExMachina(); //ED.Excel->~TMLExcel(); //ModDatFName2 = "C:\\Documents and Settings\\z563187\\Desktop\\Design v46 Basis\\Modelldat.xls"; if(ED.ModeldatName == NULL || ED.ModeldatName == "") { ModDatFName = OpenDialog(); ED.ModelDat = new TMLExcel; ED.ModelDat->OpenWorkbook(ModDatFName); } else { ED.Excel->OpenWorkbook(path + ED.ModeldatName); } test = true; if(!test) { ModDatFName = OpenDialog(); Sleep(500); case2 = ED.Excel->OpenWorkbook(ModDatFName2); } for(k = 0; k < ED.Excel->WorkbookCount; k++) { for(i = 0; i < ED.Excel->Books[k]->WorksheetCount; i++) { name = ED.Excel->Books[k]->Sheets[i]->Name; if(name == "ModelldatMot") //i = ED.Excel->Books[k]->IndexOfWorksheets("ModelldatMot"); { if(i != -1) { while((count != 6345789)) { count = StrToInt(ED.Excel->Books[k]->Sheets[i]->CellString[1][5 + j]); Item = ED.Excel->Books[k]->Sheets[i]->CellString[2][5 + j]; this->BlechschnittComboFrame->Auswahl->AddItem(Item, BlechschnittComboFrame); j = j + 1; count = StrToInt(ED.Excel->Books[k]->Sheets[i]->CellString[1][5 + j]); } } } } } j = 0; count = 0; for(k = 0; k < ED.Excel->WorkbookCount; k++) { for(i = 0; i < ED.Excel->Books[k]->WorksheetCount; i++) { name = ED.Excel->Books[k]->Sheets[i]->Name; if(name == "ModelldatLE") //i = ED.Excel->Books[k]->IndexOfWorksheets("ModelldatLE"); { if(i != -1) { while((count != 6345789)) { count = StrToInt(ED.Excel->Books[k]->Sheets[i]->CellString[1][4 + j]); Item = ED.Excel->Books[k]->Sheets[i]->CellString[2][5 + j]; this->ElektronikComboFrame->Auswahl->AddItem(Item, ElektronikComboFrame); j = j + 1; count = StrToInt(ED.Excel->Books[k]->Sheets[i]->CellString[1][5 + j]); } } } } } EnDis(true); }
-
Warum ist die Excel-Instanz bei dir Mitglied der Klasse? Das scheint mir nicht nötig. Brauchst du die auch noch woanders?
Da das Einlesen wohl nur in dieser Funktion erfolgt, würde ich die Excelinstanzen lokal dort erzeugen. Das muß auch nicht dynamisch geschehen (per new). Statt ED.ModelDat legst du dann einfach eine zweite lokale Instanz an. Dann hast du auch keine Probleme mehr mit der Speicherfreigabe.
Den Rest schau ich mir später an.
-
Hi,
so ich habe nun die Excelinstanz aus der Struktur ED extrahiert.
Ich habe also in meiner FileOpenAccept-funktion eineTMLExcel Musterprojekt; Musterprojekt = new TMLExcel;
angelegt.
Nun wird das erste Excel-File geöffnet.
Musterprojekt->OpenWorkbook(ED.ProjFName);
Einige Operationen ausgeführt und dann das Workbook geschlossen.
Musterprojekt->CloseWorkbook(ED.ProjFName);
So, nun möchte ich mit der Instanz ein anderes Workbook öffnen.
Musterprojekt->OpenWorkbook(ModDatFName);
Aber leider das selbe Fehlerbild.
Was mache ich falsch?
Danke für Euren Support
Gruß
Grim
-
Hi,
mein Problem hat sich gerade gelöst.
Es lag wohl an meinem Handle, den ich für den Öffnen-Dialog verwendet habe.Nochmals Danke für Eure Mühen.
Gruß
Grim
-
Was für ein Handle?