Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Dataset GetFieldNames setzt Stringlist Delimiter zurück (https://www.delphipraxis.net/202062-dataset-getfieldnames-setzt-stringlist-delimiter-zurueck.html)

Blackpit 24. Sep 2019 15:10

Dataset GetFieldNames setzt Stringlist Delimiter zurück
 
Hallo,
ist jemand dieser Fehler in Seattle bekannt?
Bei einem an Uwe's "Poor Man’s CSV Export" angelehnten Code wird mir der gesetzte Delimiter nach Aufruf von GetFieldNames default gesetzt.
wwClientDataSet1 ist ein TwwClientDataSet.
Delphi-Quellcode:
  writer := TStreamWriter.Create('DataSet.csv');
    try
      lst := TStringList.Create();
      try
        lst.QuoteChar := '"';
        lst.Delimiter := ';';
        lst.StrictDelimiter := true;
        wasActive := wwClientDataSet1.Active;
        try
          wwClientDataSet1.Active := true;
          wwClientDataSet1.GetFieldNames(lst); // <-- hier wird lst.Delimiter default
          writer.WriteLine(lst.DelimitedText);
          wwClientDataSet1.First;
Kennt das jemand?

hoika 24. Sep 2019 15:16

AW: Dataset GetFieldNames setzt Stringlist Delimiter zurück
 
Hallo,
wird wohl ein Bug der Komponente sein.
Musst also deinen Delimiter retten und nach GetField neu setzen.

Blackpit 24. Sep 2019 15:44

AW: Dataset GetFieldNames setzt Stringlist Delimiter zurück
 
Zitat:

Zitat von hoika (Beitrag 1447709)
...
Musst also deinen Delimiter retten und nach GetField neu setzen.

Wenn's so einfach wäre, zurückgesetzt wird vor der Rückgabe, damit hat die Headerzeile auch schon den default Delimiter.
Und ich müsste die dann explizit ersetzen.

hoika 24. Sep 2019 16:03

AW: Dataset GetFieldNames setzt Stringlist Delimiter zurück
 
Hallo,
ich kenne die Komponente nicht.
Laut Google gibt es TwwClientDataSet nicht ...
Ist denn der Quellcode vorhanden?

Oder setz doch gleich den Default-Delimiter auf den Wert, den Du haben willst.
Oder ich verstehe das Problem nicht ...

Frickler 24. Sep 2019 16:16

AW: Dataset GetFieldNames setzt Stringlist Delimiter zurück
 
Zitat:

Zitat von hoika (Beitrag 1447720)
Oder setz doch gleich den Default-Delimiter auf den Wert, den Du haben willst.
Oder ich verstehe das Problem nicht ...

Ich verstehe das so, dass er den Default-Delimiter setzt, und seine Komponente (ist übrigens aus dem InfoPower-Paket) setzt direkt vor dem Export den Delimiter auf einen anderen Wert. Eventuell mit nem Class Helper oder einer Interposer Class (type TwwClientDataSet = class(wwclient.TwwClientDataSet) ... ) nachhelfen...

Blackpit 24. Sep 2019 16:32

AW: Dataset GetFieldNames setzt Stringlist Delimiter zurück
 
So ist es, Komponente aus dem Info-PowerPaket.
Hhm, wenn ich die verwenden will komm ich scheinbar um einen Classhelper nicht rum.

Wie läuft das mit einer " Interposer Class "? Kenn ich noch nicht, würde mich interessieren.

Zitat:

An interposer class is a class with the same name of the class it wants to change (using inheritance). By adding its unit after the unit of its base class in a uses statement, a unit will use the modified version of the class rather than the original. Interposer classes are not a terribly neat technique, rather a hack.
Sollte ich nicht lieber einen Classhelper schreiben, wobei ich es bei Delphi nicht unbedingt als Hack sehe ;)

Blackpit 25. Sep 2019 15:54

AW: Dataset GetFieldNames setzt Stringlist Delimiter zurück
 
Hallo,
die pragmatischte lösung war, Delimter und QuotedChar vor dem Schreiben nachzusetzten.
Delphi-Quellcode:
...
  writer := TStreamWriter.Create('DataSet.csv', False, TEncoding.UTF8);
    try
      lst := TStringList.Create();
      try
        lst.QuoteChar := '"';
        lst.Delimiter := ';';
        lst.StrictDelimiter := true;
        wasActive := wwClientDataSet1.Active;
        try
          wwClientDataSet1.Active := true;
          wwClientDataSet1.GetFieldNames(lst); // <-- hier wird lst.Delimiter default
          lst.QuoteChar := '"';              //neu setzen
          lst.Delimiter := ';';
          writer.WriteLine(lst.DelimitedText);
          wwClientDataSet1.First;
...
Gruß

BP


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:08 Uhr.

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