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...


Anmelden zum Antworten