Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Borland C++ Builder » Kompatibilität von Borland Builder 4.0 zu 6.0???

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
09.02.2004, 12:29 Uhr
ARM-Tec



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


PS: Danke für jede Hilfe im voraus.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.02.2004, 12:46 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ich würde vermuten das du zum schreiben in die datei routinen benutzt hast die die neuen libs unter einigen os's eventuell nicht mehr richtig unterstüzen...Am besten schreibst du sowas wenn möglich immer in ANSI-C/C++ um maximal mögliche kompatibilität zu erreichen...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.02.2004, 15:32 Uhr
ARM-Tec



Hallo,

weiß nicht genau, was hier nicht ANSI C/C++ sein soll? Weist Du noch eine Andere Möglichkeit? Wäre toll du hättest noch mehr Rat für mich.

CODE: Wie unten geschrieben.

PS: Bin für jeden Tipp dankbar.


C++:
// 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;
}




Bearbeitung von Pablo:

Bitte, bei so einem laaaaaangen Code, CPP tags selber benutzen!!!


Dieser Post wurde am 09.02.2004 um 17:38 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.02.2004, 16:11 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


hmm ich würde das nicht alles so zusammenballern sondern mir ne eigene methode schreiben der ich dann das zu schreibende übergebe...

C++:
#include <iostream>
#include <fstream>

bool write2file(char *filename,char *bez,char *ser,char *banum,char* kommnr,char* datum,char* Kunde){
    std::ofstream os(filename);
    if(os.fail())return false;
    os<<"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n";
    os<<"*                                                                       *\n";
    os<<"*                    G E R Ä T E I D E N T I F I K A T I O N            *\n";
    os<<"*                                                                       *\n";
    os<<"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n";
    os<<"\n\n\n";
    os<<"__________________________________________________________________________\n";
    os<<"Bezeichnung: "<<bez <<"\t\t\tSeriennummer: "<<ser<<std::endl<<std::endl;
    os<<"BA - Nummer: "<<banum <<"\t\t\tKommision - Nr: "<<kommnr<<std::endl<<std::endl;
    os<<"Datum: "<<datum <<"\t\t\tKunde: "<<Kunde;
    os.close();
    return true;
}


int main(){write2file("hallo.txt","ULT3000","123bc-34-d","0815","4711","23-11-4028","windowsfreund");}



wenn du übrigens sowieso c++ verwendest empfiehlt es sich std::string statt char-arrays zu verwenden...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.02.2004, 09:09 Uhr
ARM-Tec



Hallo,

Ja ist ja schön und recht mit dem std::string, wusste aber nicht, dass es das gibt, Kannst Du mir das geneuer erklären, habe in der Hillfe schon gesucht aber nichts gefunden.

Und dann wollte ich fragen, ob Du daran gedacht hast, dass wenn ich eine Bezeichnung, Seriennummer, Datum usw. in den Edit Feldern eingebe auch unteschidliche Abstände haben kann, zwischen z.B. Bezeichnung und Seriennummer, BA-Nummer und Kommisionnummer, Datum und Kunde? Es ist oben nicht ganz korrekt angezeigt, aber der Doppelpunkt sollte immer untereinander sein. Deshalb auch die Positionsangaben des Schreibcousor und die einzelnen Schleifen um die Lücken zufüllen.

Dann habe ich noch die Bitte, schau dir mal die Themen "Suchfunktion für Seriennummern", "Variabel einen Text anzeigen über Hint der ComboBox" und "Brauche Hilfe für Datenbank an" hast Du vieleicht eine Ideen dazu. Die Datenbanksache würde mir sehr helfen.

Danke im voraus und wäre nicht unnett von Dir mir zu helfen. Hab bemerkt dass Du auf vieles eine Antwort hast und genug Hintergrundwissen vom programmieren hast. Ich bin leider noch nicht soweit. Kann ja aber noch werden.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
10.02.2004, 13:30 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


wenn du so ne "lückenfüller" machen willst köntest du einfach gucken wie lange der string ist den du schreiben willst (mit strlen) und dann einfach (erforderliche anzahl an zeichen - strlen(zu schreibender string) ) leerzeichen reinschreiben, dann sollte es immer an der von dir gewünschten stelle stehen, musst dann nur aufpassen das die wörter nicht zu lange werden (also grösser als der von dir dafür vorgesehene Platz...


Zitat:

Dann habe ich noch die Bitte, schau dir mal die Themen "Suchfunktion für Seriennummern", "Variabel einen Text anzeigen über Hint der ComboBox" und "Brauche Hilfe für Datenbank an" hast Du vieleicht eine Ideen dazu. Die Datenbanksache würde mir sehr helfen.


äh ich weiss gerade nciht wovon du redest? was für ne datenbank... was genau meinst du...


std::string kanst du ganz einfach benutzen...da musst du dich nicht mit dummen char-arrays rumärgen...

einfach mal in die forumssuche eingeben da sind massenweise beispiele dazu...
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 20.02.2004 um 00:19 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
13.02.2004, 14:22 Uhr
ARM-Tec



Hallo Windalf und andere Leute,

also das Problem ist nicht das <es nicht funktionier und das ich noch nicht habe was ich möchte, sonder WARUM FUNKTIONIERT ES NICHT UNTER WIN XP, WORD 2000 und BORLAND BUILDER 6.0???

Muß man vieleicht ein Update (Downgrate) instalieren das es unter den neuen Bedingungen funktionier???

Danke für jede Info.

MfG ARM-Tec
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
13.02.2004, 16:53 Uhr
Bruder Leif
dances with systems
(Operator)


Moin!

Wieder mal typisch. Der Modi hält sich am wenigsten in "seinem" Teil des Forums auf. Ganz dickes Sorry...

Hab den Quellcode oben mal überflogen und bin bei dieser Stelle hier ordentlich gestolpert:


C++:
// 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);



Kein Wunder, dass das nicht richtig funktioniert. Ein Zeiger auf einen String wird angelegt, der String selbst aber nicht. Und danach wird mit strcpy und strcat der Speicher vollgemüllt; wer weiß, welche Variablen dabei überschrieben werden. Kann sein, dass es mit dem alten BCB zufällig funktioniert hat, aber sei froh, dass der Fehler jetzt bei Dir aufgetreten ist und nicht später beim Kunden...
Wenn Du schon in C++ mit C-Strings arbeiten willst, musst Du ihnen auch einen Speicherplatz zuweisen:


C++:
// Nun wird der Komplette Pfad gebildet und der Dateiname angehängt.
char HistDatei[1024];  // Länger wird wohl kaum ein Dateiname werden :-)

strcpy(HistDatei,drive);
strcat(HistDatei,dir);
strcat(HistDatei,file);
strcat(HistDatei,ext);



oder noch besser dynamisch:


C++:
// Nun wird der Komplette Pfad gebildet und der Dateiname angehängt.
char * HistDatei = (char*) malloc(1024);  // Länger wird wohl kaum ein Dateiname werden :-)

strcpy(HistDatei,drive);
strcat(HistDatei,dir);
strcat(HistDatei,file);
strcat(HistDatei,ext);

.....

// Sobald "HistDatei" nicht mehr gebraucht wird:
free(HistDatei);



Durchsuche mal den restlichen Quellcode und bau alle solchen Stellen um, wenns dann immer noch nicht funktioniert, sehen wir weiter.
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
19.02.2004, 14:18 Uhr
ARM-Tec



Hallo Leifus,

erstmal gut, dass ich dich ereicht habe und danke für die Antworten in all den Sachen. Werd ich auf jedenfall mal probieren. Verstehe nur eines nicht was das mit dem Dateiname zu tun hat, was in die Datei selbst geschrieben wird. Die Datei wird unter dem Richtigen Namen angelegt, nur der Inhalt ist nicht OK.

Meldest dich mal? Danke im Voraus
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
19.02.2004, 17:55 Uhr
Bruder Leif
dances with systems
(Operator)


Das Problem ist nicht der Dateiname, sondern einfach ein Zeiger, der auf EIN Byte zeigt, und später werden mehrere Bytes reingeschrieben. Nachdem Variablen meistens *g* direkt hintereinander auf dem Stack abgelegt werden, überschreibst Du damit verschiedene andere Variablen, je nachdem, wie sie der Compiler auf dem Stack abgelegt hat. Und schwupps hat eine Variable einen anderen Wert. Oder in einer Funktion sogar der Zeiger auf die Rücksprungadresse...
Wie gesagt, das mit dem Dateinamen war nur der eine Fall, der mir aufgefallen ist, kann sein, dass da noch mehr SPeicherprobleme drin sind.
Am besten baust Du den Quellcode auf "richtiges" C++ um, also mit std::string, dann kann so was nicht mehr passieren.
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Borland C++ Builder ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: