Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Textdatei mit D2 erstellen (https://www.delphipraxis.net/50524-textdatei-mit-d2-erstellen.html)

MPirnstill 27. Jul 2005 08:03


Textdatei mit D2 erstellen
 
Hi Leute!

Der Titel hört sich simpel an, aber ich bin schon fast am verzweifeln. :wall:
Ist vielleicht auch nur indirekt ein Delphi-Problem.

Folgende Situation:
Mein Delphi 2.0 Prog erstellt eine Serienbriefsteuerdatei für MS-Word. Früher hatten wir noch Word 97 im Einsatz und es funktionierte alles, doch jetzt haben wir Word 2003 im Einsatz. Und plötzlich will Word unter bestimmten Umständen (Umlaute oder Paragraphenzeichen) das der Anwender den Zeichensatz für die Steuerdatei bestätigt und schlägt irgend so einen japanischen Zeichensatz vor. Klickt man auf Windows (Standard) und OK, dann ist alles in Ordnung.

Jetzt ist mein Prog aber so konzipiert, daß es Word über OLE mit dem Serienbrief-Dokument und der entsprechenden Steuerdatei anschubst. Dabei fragt Word diese Bestätigung nicht mehr ab und druckt irgendwelche Schmierzeichen anstatt. Leider kann man Word anscheinend nicht sagen, daß es immer den Standard-Zeichensatz verwenden soll. :wiejetzt:

Der Fehler liegt aber auch nicht im Word-Dokument sondern in der Steuerdatei. Denn der 'Fehler' tritt auch dann schon auf, wenn ich einfach nur versuche die Steuerdatei mit Word zu öffnen.
Die Steuerdatei ist eine Textdatei mit Spaltenüberschriften in der ersten Zeile. Separiert mit Semikolon. Zeilenabschluß mit Enter (x'0D') und Zeilenschaltung (x'0A'). Und in den Folgezeile jeweils ein Wert zu jeder Überschrift. Die Überschriften stimmen auch mit der Anzahl der Werte überein. In meinem Prog habe ich den 'TextFile' mit AssignFile, Rewrite, Write, CloseFile erzeugt.

Also etwas vereinfacht. Habe ich Umlaute oder Paragraphen in meiner Steuerdatei kann Word den Zeichensatz nicht eindeutig ermitteln. Lasse ich diese Zeichen weg, öffnet Word die Datei problemlos, ohne Nachfrage.

Soweit zur Situation! :drunken:

Um das ganze etwas zu komplizieren! Ich erzeuge mit dem Prog natürlich Dutzende von Steuerdateien für Serienbriefe. Auch mit Umlauten und Paragraphenzeichen und die funktionieren anscheinend wunderbar.

Ich habe die Steuerdateien sogar schon mit einem HexEditor untersucht und die Umlaute sehen nicht nur gleich aus, sondern haben auch den gleichen Hexadezimal-Code. Es ist zum verrückt werden.

Ich kann keinen Unterschiede diesen einfachen Textdateien erkennen, der Word veranlassen könnte einmal so und einmal so zu reagieren. :gruebel:

Weiß einer von euch Hilfe oder überhaupt erstmal woran das liegt?. :?:
Oder gibt noch irgendwelche Merkmale/Eigenschaften die ich von den Steuerdateien vergleichen könnte? :?:

Gruß

Micha

MPirnstill 27. Jul 2005 12:53

Re: Textdatei mit D2 erstellen
 
Hi!

Ich bin's noch mal!

Mir scheint ich habe mal wieder ein Thema angeschnitten was keiner mag! ... Office! ... Ich meine MS-Office. :shock:
Ich ärgere mich immer wieder darüber wie schlau Word sein will und dann immer Ärger macht, aber leider muß ich damit arbeiten.

Ich wäre für jede Hilfe dankbar.

Gruß
Micha

Bernhard Geyer 27. Jul 2005 12:57

Re: Textdatei mit D2 erstellen
 
Für D2 wirds problematisch...

Kannst Du deine Textdatei entweder UTF8-Codiert (mit UTF-8 BOM) oder gleich Unicodisch erzeugen? Damit dürft auch Word wieder zahm sein, da es jetzt nicht versuchen muß irgendwelche Codepages zu erkennen.

shmia 27. Jul 2005 13:03

Re: Textdatei mit D2 erstellen
 
Zitat:

Zitat von MPirnstill
Der Fehler liegt aber auch nicht im Word-Dokument sondern in der Steuerdatei. Denn der 'Fehler' tritt auch dann schon auf, wenn ich einfach nur versuche die Steuerdatei mit Word zu öffnen.
Die Steuerdatei ist eine Textdatei mit Spaltenüberschriften in der ersten Zeile. Separiert mit Semikolon. Zeilenabschluß mit Enter (x'0D') und Zeilenschaltung (x'0A'). Und in den Folgezeile jeweils ein Wert zu jeder Überschrift. Die Überschriften stimmen auch mit der Anzahl der Werte überein. In meinem Prog habe ich den 'TextFile' mit AssignFile, Rewrite, Write, CloseFile erzeugt.

Hast du schon mal daran gedacht, die Steuerdatei im Unicode Zeichensatz zu schreiben?

MPirnstill 27. Jul 2005 13:04

Re: Textdatei mit D2 erstellen
 
Hi, Bernd!

Erstmal Danke, das du geantwortet hast.

Zitat:

Zitat von Bernhard Geyer
Kannst Du deine Textdatei entweder UTF8-Codiert (mit UTF-8 BOM) oder gleich Unicodisch erzeugen?

Wie erzeuge ich die Datei denn im Unicode? :gruebel:
Bislang habe ich mit AssignFile, Rewrite, Write und CloseFile gearbeitet, aber ich habe schon gesucht und leider nicht gefunden wie ich den Funktionen einen Zeichensatz mitteilen kann.

Kann man das über andere Funktionen evtl. besser realisieren? :?:

Gruß
Micha

Bernhard Geyer 27. Jul 2005 13:14

Re: Textdatei mit D2 erstellen
 
Unter Delphi >= 5 gibt es genügend Lösungen mit diversen Unicode-Komponenten (ElPack/TNTWare).

Unter Delphi2 wirst du hier mittels TFileStream die Daten selbst "Unicodisch" rausschreiben müssen.

MPirnstill 27. Jul 2005 14:45

Re: Textdatei mit D2 erstellen
 
Zitat:

Zitat von Bernhard Geyer
Unter Delphi2 wirst du hier mittels TFileStream die Daten selbst "Unicodisch" rausschreiben müssen.

Ich hab das gerade mal versucht, aber das scheint nicht ganz so einfach zu sein. ..in D2. :pale:
Meine neue Routine zum Schreiben der Datei läuft fehlerfrei durch, aber es steht nur Müll drin. Auch Word kriegt das nicht gelesen was ich da rausschreibe. Kannst du evtl. mal einen Blick auf meine Routine werfen, und mir sagen was ich da falsch mache.

Delphi-Quellcode:
function TSteuerdatei.Save: Boolean;
var
  fs: TFileStream;
  s: String;
  su: PWideChar;  
  ls: Cardinal;  //Länge von s auf Uni hochgerechnet. Richtig?
begin
  try
    //String erstellen und in Unicode umwandeln
    s := AufbereitenAusgabe;                            //Gibt aufbereiteten String zurück
    ls := length(s) * SizeOf(WideChar);                  //Länge errechnen
    su := allocMem(ls);                                  //Platz besorgen
    su := StringToWideChar(s, su, ls);                   //String in Unicode umwandeln
    //FileStream schreiben
    fs := TFileStream.Create(FPfadDateiName, fmCreate);
    fs.Write(su, ls);
    fs.Free;
    fs := nil;
    Result := True;
  except
    on E:Exception do
      Result := False;
  end;
end;
Da ich vom Handling mit Unicode keine Ahnung hab, habe ich mir dies aus der Hilfe und dem Forum so zusammengestoppelt.
Aber es funktioniert eben noch nicht. :roll: :cry:

Gruß
Micha

MPirnstill 27. Jul 2005 14:47

Re: Textdatei mit D2 erstellen
 
Zitat:

Zitat von shmia
Hast du schon mal daran gedacht, die Steuerdatei im Unicode Zeichensatz zu schreiben?

Ich möchte mich auch bei dir für die Antwort bedanken. Hatte die vorhin nur noch nicht gesehen als ich Bernhard geantwortet hab.

Gruß
Micha

shmia 27. Jul 2005 16:23

Re: Textdatei mit D2 erstellen
 
Delphi-Quellcode:
procedure SaveWideStringToFile(const filename:string; const ws:WideString);
var
   fs : TFileStream;
   data : WideStream;
begin
   data := ' '+ws;
   data[1] := Widechar($FEFF); // BOM = Byte Order Mark
   fs := TFileStream.Create(filename, fmCreate);
   try
      fs.WriteBuffer(data[1], Length(data)*sizeof(Widechar));
   finally
      fs.Free;
   end;
end;

MPirnstill 28. Jul 2005 07:06

Re: Textdatei mit D2 erstellen
 
Hey shmia,

danke für die Routine!

Zitat:

Zitat von shmia
Delphi-Quellcode:
procedure SaveWideStringToFile(const filename:string; const ws:WideString);
var
   fs : TFileStream;
   data : WideStream;
begin
   data := ' '+ws;
   data[1] := Widechar($FEFF); // BOM = Byte Order Mark
   fs := TFileStream.Create(filename, fmCreate);
   try
      fs.WriteBuffer(data[1], Length(data)*sizeof(Widechar));
   finally
      fs.Free;
   end;
end;

aber du übergibst da der Procedure einen WideString, kann ich den benutzen wie einen normalen String oder wie versorge ich den. Irgendwie kennt mein Delphi leider auch keinen Widestring und auch keinen WideStream. Könnte es sein das dies erst ab Delphi > 2.0 funktioniert. Ich hab zwar höhere Delphi-Versionen, aber dieses ganze Projekt ist eben in D2 und das hierfür umzustellen wäre zu aufwendig. :roteyes: :pale:

Hast du einen Tipp wie man das unter D2 realisieren kann? :?:

Gruß
Micha

P.S.: Mir ist schon übel von diesem Unicode-Kram. :kotz:
Kann MS-Word nicht mal einfach so blöd sein und tun was man will.

barf00s 28. Jul 2005 08:41

Re: Textdatei mit D2 erstellen
 
anstelle von widestring PWideChar

MPirnstill 28. Jul 2005 08:55

Re: Textdatei mit D2 erstellen
 
Zitat:

Zitat von barf00s
anstelle von widestring PWideChar

Und was nimmt man dann anstelle von WideStream ?

Gruß
Micha

barf00s 28. Jul 2005 08:59

Re: Textdatei mit D2 erstellen
 
auch nen PWideChar

widestream hab ich ja noch nie gehört

MPirnstill 28. Jul 2005 09:07

Re: Textdatei mit D2 erstellen
 
Zitat:

Zitat von barf00s
auch nen PWideChar

widestream hab ich ja noch nie gehört

Den Typ hatte shmia in der Routine verwendet, welche er mir hier gepostet hatte. Vielleicht ist das ja auch ein Tippfehler und es sollte WideString anstatt WideStream heißen.

Erstmal danke für den Tipp. :thumb: Werde es so bald als möglich ausprobieren.

shmia 28. Jul 2005 12:28

Re: Textdatei mit D2 erstellen
 
Zitat:

Zitat von MPirnstill
Den Typ hatte shmia in der Routine verwendet, welche er mir hier gepostet hatte. Vielleicht ist das ja auch ein Tippfehler und es sollte WideString anstatt WideStream heißen.

Jupp, war ein Tipppfuhler.
Jetzt nochmals den Code (incl. Variante, die den Datentyp WideString umgeht).

Delphi-Quellcode:
procedure SaveWideStringToFile(const filename:string; const ws:WideString);
var
   fs : TFileStream;
   data : WideString;
begin
   data := ' '+ws;
   data[1] := Widechar($FEFF); // BOM = Byte Order Mark
   fs := TFileStream.Create(filename, fmCreate);
   try
      fs.WriteBuffer(data[1], Length(data)*sizeof(Widechar));
   finally
      fs.Free;
   end;
end;


procedure SaveWideStringToFileD2(const filename:string; const data:String);
var
   fs : TFileStream;
   b, buffer : ^Word;
   size : Integer;

   i : Integer;
begin
   size := (Length(data)+1)*2;
   GetMem(buffer, size);

   try
      b := buffer;

      b^:= $FEFF; // BOM = Byte Order Mark
      Inc(b);

      // string kopieren
      for i := 1 to Length(data) do
      begin
         b^ := Ord(data[i]);
         Inc(b);
      end;

      fs := TFileStream.Create(filename, fmCreate);
      try
         fs.WriteBuffer(buffer^, size);
      finally
         fs.Free;
      end;
   finally
      FreeMem(buffer);
   end;
end;

MPirnstill 28. Jul 2005 13:59

Re: Textdatei mit D2 erstellen
 
WOW! :cheers:

Das Schreiben in Unicode klappt richtig super. Danke an euch für die Hilfe. :-D

Ich mußte leider feststellen, daß dies mein Ausgangsproblem dadurch leider nicht beseitigt ist, denn Word fragt immer noch nach, ob es den von ihm erkannten Unicode-Zeichensatz verwenden soll. Aber ich werde die Routine auf jedenfall gut aufheben, falls ich mal wieder mir Unicode hantieren muß. Auch wenn ich sie nicht ganz verstanden habe. Dies mit den Zeigern habe ich nie richtig kapiert.

Falls es interessiert, wie meine Erkenntnisse zum eigentlichen Ausgangsproblem sind:

Ich habe jetzt eine Überschriftzeile und ca. 20 Steuerdatensätze in eine Textdatei geschrieben.
:arrow: Die öffnet Wöööörd ohne nachzufragen. :wall:

Entferne ich manuell alle Datensätze bis auf die Überschriftszeile und den einen mit Umlauten.
:arrow: Wöööörd versucht wieder den Zeichensatz zu ermitteln und scheitert kläglich. :wall:

Ich bin sogar schon dahin gegangen und hab mit dem Window-Editor eine Textdatei erstellt und die Überschriftszeile und den einen Datensatz manuell eingetippt.
:arrow: Auch die kann Wöööörd nicht öffnen. :wall:

Das beweißt mir immerhin das es nicht an der von meimem Progi erstellten Steuerdatei liegen kann sondern an diesem gr##§$?! :evil: Wööööööörrrrd, was mal wieder so schlau sein will.

Okay, daß war nur noch mal um den Frust los zu werden.

Vielen Dank noch mal!

Micha


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz