Kompatibilität von Borland C++ Builder 4.0 zu 6.0, Problem beim schreiben eines RTF-files
-
Hallo Leute,
seit Gestern habe ich den 6.0 von Borland installiert. Habe aber festgestellt, dass Programme die ich über den 4.0 auf NT2000 programmierte unter XP und dem 6.0 nicht mehr einwandfrei funktionieren. Beispiel in der alten Version habe ich char Zeichen in eine Datei geschrieben. Das Dateiformat habe ich als *.rtf vorgegeben. Das heißt, eine Datei neu angelegt beschrieben und wieder geschlossen, anschließend in einem Word (Word 97) Editor oder im RichEdit Eingabefeld angezeigt, alles wunderbar.
So nun beim 6.0 , XP und Word 2000 wird zwar die Datei angelegt aber falsch beschrieben und angezeigt. Habe mit dem Editor überpfüft ob die Datei falsch ausgelesen wird, jedoch wird sie nicht richtig beschrieben. Was kann hier nicht stimmen habe doch gar nichts am Code geändert?Hoffe es kann mir jemand Helfen.
Beispiel:
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * G E R Ä T E I D E N T I F I K A T I O N * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * _________________________________________________________________ Bezeichnung:ULT3000 Seriennummer:1 BA - Nummer: Kommision - Nr: Datum: Kunde:LAGER _________________________________________________________________
So wäre das OK
Jetzt wir aber nur noch eine Trennlinie geschriben.
Beispiel:
_________________________________________________________________
Warum dieser Efekt???
Hier mal den Code:
// Hilfvariablen zum Zerlegen und neuem generieren des Pfades. char s[_MAX_PATH]; char drive[_MAX_DRIVE]; char dir[_MAX_DIR]; char file[_MAX_FNAME]; char ext[_MAX_EXT]; //Damit ein aktueller Dateiname generiert wird NameGenerieren(); // generierten Dateinamen in Hilsvariable speichern char * HistName = ""; HistName = Form1->SaveDialog1->FileName.c_str(); getcwd(s,_MAX_PATH); // Erhält aktuelles Arbeitsverzeichnis if (s[strlen(s)-1] != '\\') strcat(s,"\\"); // Hängt ein abschließendes Zeichen \ an _splitpath(s,drive,dir,file,ext); // Teilt den String in separate Elemente auf strcat(dir,"Historien"); // Gibt das Verzeichnis an in dem die Datei gespeichert wird. strcpy(file,"\\Hist@"); // Praefix für die Historien - Dateien. Achtung! Escape-Sequenz '\\' für ein '\' strcat(file,HistName); // anhängen der Gerätespezifischen Daten Seriennummer usw. strcpy(ext,".RTF"); // Angabe des Dateiformat (Rich Text Format) // Nun wird der Komplette Pfad gebildet und der Dateiname angehängt. char * HistDatei = ""; strcpy(HistDatei,drive); strcat(HistDatei,dir); strcat(HistDatei,file); strcat(HistDatei,ext); /* Variablen die zum kopieren und schreiben in Datei benoetig werden. Sie erzeugen den Dateikopf, übernehmen die Eingegebenen Daten und tragen sie in die Datei ein.*/ char RahmenOU[100] = "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *"; char RahmenLR[100] = "* *"; char Kopf[100] = "* G E R Ä T E I D E N T I F I K A T I O N *"; char Trennung[150] = "_____________________________________________________________________________"; char Leer[200] = " "; char Bezeichnung[20] = "Bezeichnung:"; char Seriennummer[20] = "Seriennummer:"; char Datum[20] = "Datum:"; char KommNummer[20] = "Kommision - Nr:"; char BaNummer[20] = "BA - Nummer:"; char Kunde[20] = "Kunde:"; char Vorangestellt[200]; //Lege Dateivariable an und oeffnet Datei zum Lesen ab 1. Zeile ofstream schreiben; // Oeffnen der Datei fur die eine neue Seriennummer angelegt wurde // "app" bedeutet Coursor auf das Ende der Datei. schreiben.open(HistDatei); // Pruefen ob Datei geoefnnet wurde if (!schreiben) { //Hier noch eine Messagebox ausgeben das Daten nicht geöffnet werden konnte. Application->MessageBox("Die Datei konnte nicht angelegt oder geöffnet werden! \ \nÜberprüfen Sie das Verzeichnis auf die fehlende Datei.", "Hinweis", MB_OK); return; } /* ************************** KOPF ******************** */ // Den vorbereiteten Rahmen für den Kopf schreiben an forgegebene Stelle schreiben, // an die der Coursor gesetzt wird. schreiben << Leer << endl; schreiben << Leer << endl; schreiben.seekp(0,ios::app); schreiben << RahmenOU << endl; schreiben.seekp(0,ios::app); schreiben << RahmenLR << endl; schreiben.seekp(0,ios::app); schreiben << Kopf << endl; schreiben.seekp(0,ios::app); schreiben << RahmenLR << endl; schreiben.seekp(0,ios::app); schreiben << RahmenOU << endl; schreiben.seekp(0,ios::app); schreiben << Leer << endl; schreiben.seekp(0,ios::app); schreiben << Leer << endl; schreiben.seekp(0,ios::app); schreiben << Trennung << endl; schreiben.seekp(0,ios::app); schreiben << Leer << endl; /* ************************** BEZEICHNUNG ******************** */ // Kopieren der Vorbereiteten Hilfsvariable StrCopy(Vorangestellt,Bezeichnung); // Speicher für Zeichen die eingelesenwerden anlegen char* Inhalt = new char[ Vorangestellt[0] + Form1->Edit1->Text.Length()]; StrCopy(Inhalt, Vorangestellt); StrCat(Inhalt, Form1->Edit1->Text.c_str()); // Inhalt an forgegebene Stelle schreiben, an die der Coursor gesetzt wird. schreiben.seekp(0,ios::app); schreiben << Inhalt; // Leere Zeichen vorschreiben int i; for( i = 0 ; i < 42 - Form1->Edit1->Text.Length() ; i++) { schreiben.seekp( 0 , ios::app); schreiben << Leer; } delete [] Inhalt; /* ************************** SERIENNUMMER ******************** */ // Kopieren der Vorbereiteten Hilfsvariable StrCopy(Vorangestellt,Seriennummer); Inhalt = new char[ Vorangestellt[0] + Form1->Edit2->Text.Length()]; StrCopy(Inhalt, Vorangestellt); StrCat(Inhalt, Form1->Edit2->Text.c_str()); // Inhalt an forgegebene Stelle schreiben, an die der Coursor gesetzt wird. schreiben.seekp(530,ios::beg); schreiben << Inhalt << endl; delete [] Inhalt; /* ************************** LEERE ZEILE ********************* */ // Zwischenzeile einfuegen schreiben << Leer <<endl; /* ************************** BA-NUMMER ********************** */ // Kopieren der Vorbereiteten Hilfsvariable StrCopy(Vorangestellt,BaNummer); Inhalt = new char[ Vorangestellt[0] + Form1->Edit5->Text.Length()]; StrCopy(Inhalt, Vorangestellt); StrCat(Inhalt, Form1->Edit5->Text.c_str()); // Inhalt an forgegebene Stelle schreiben, an die der Coursor gesetzt wird. schreiben.seekp(0,ios::app); schreiben << Inhalt; // Leere Zeichen vorschreiben for( i = 0 ; i < 29 - Form1->Edit5->Text.Length() ; i++) { schreiben.seekp( 0 , ios::app); schreiben << Leer; } /* ************************** KOMMISINNUMMER ***************** */ // Kopieren der Vorbereiteten Hilfsvariable StrCopy(Vorangestellt,KommNummer); Inhalt = new char[ Vorangestellt[0] + Form1->Edit4->Text.Length()]; StrCopy(Inhalt, Vorangestellt); StrCat(Inhalt, Form1->Edit4->Text.c_str()); // Inhalt an Dateiende beschreiben. schreiben.seekp((587 + Form1->Edit2->Text.Length()),ios::beg); schreiben << Inhalt << endl; /* ************************** LEERE ZEILE ******************** */ // Zwischenzeile einfuegen schreiben << Leer <<endl; /* ************************** DATUM*************************** */ // Kopieren der Vorbereiteten Hilfsvariable StrCopy(Vorangestellt,Datum); Inhalt = new char[ Vorangestellt[0] + Form1->Edit3->Text.Length()]; StrCopy(Inhalt, Vorangestellt); StrCat(Inhalt, Form1->Edit3->Text.c_str()); // Inhalt an Dateiende beschreiben. schreiben.seekp(0,ios::app); schreiben << Inhalt; // Leere Zeilen vorschreiben for( i = 0 ; i < 43 - Form1->Edit3->Text.Length() ; i++) { schreiben.seekp( 0 , ios::app); schreiben << Leer; } /* ************************** KUNDE ************************** */ // Kopieren der Vorbereiteten Hilfsvariable StrCopy(Vorangestellt,Kunde); Inhalt = new char[ Vorangestellt[0] + Form1->Edit6->Text.Length()]; StrCopy(Inhalt, Vorangestellt); StrCat(Inhalt, Form1->Edit6->Text.c_str()); // Inhalt an Dateiende beschreiben. schreiben.seekp((655 + Form1->Edit2->Text.Length() +Form1->Edit4->Text.Length()),ios::beg); schreiben << Inhalt << endl; /* ************************** LEERE ZEILE ******************** */ // Zwischenzeile einfuegen schreiben << Leer << endl; /* ************************** TRENNLINIE ******************** */ schreiben.seekp(0,ios::app); schreiben << Trennung << endl; /* ************************** LEERE ZEILE ******************* */ schreiben.seekp(0,ios::app); schreiben << Leer << endl; // Datei wieder schliesen schreiben.close(); // Speicher wieder freigeben delete [] Inhalt; return; }
PS: Danke für jede Hilfe im voraus.
Edit:
Bitte die Code-Tags benutzen. Danke!
-
Vielleich bemühst du dich ja erst mal selbst, gehst den Code per Debugger schrittweise durch und vergleichst den tatsächlichen Inhalt der jeweiligen Variablen mit deinen Erwartungen.
-
OK, OK!!!
Gut werd ich machen. Verstehe dann aber immer noch nicht warumm es unter Win 2000, Word 97 und dem BC++B 4.0 funzt und unter Win XP Word 2000 und BC++B 6.0 nicht mehr. Glaubst Du echt es liégt an einem falschen Inhalt der Variablen die ich in das File schreibe???
Werd aufjeden Fall noch mal Debuggen vieleicht hab ich ja was übersehen.
Sehe so ne Antwort als wink mit dem Zaunpfahl.
Wenn nicht, haste sonst noch ne Idee???
Alsop bis dann...