Announcement

Collapse
No announcement yet.

vartostr funktioniert falsch

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • vartostr funktioniert falsch

    Hallo liebe Delphianer,<br>
    habe in einer AccessXP-Datenbank tschechische Sonderzeichen, also hptsl. Buchstaben mit Hatscheks (dem umgekehrten Zirkumflex v). Wenn ich mit ADO darauf zugreife, werden sie mit dem Befehl<pre>Feldinhalt:=vartostr(adodataset1['Feld']);</pre>(Feldinhalt ist vom Typ String) leider in normale Buchstaben ohne Hatschek umgewandelt.
    Erst dachte ich, das liegt an ADO, aber dann änderte ich das in zwei Befehle:<pre>varFeldinhalt:=adodataset1['Feld'];<br>Feldinhalt:=vartostr(VarFeldinhalt);</pre>(varFeldinhalt ist vom Typ Variant)
    Jetzt Haltepunkt auf die zweite Zeile setzen und staunen:
    Fährt man mit der Maus auf die Variable varFeldinhalt, wird einem im Tooltip deren Wert angezeigt, UND ZWAR VÖLLIG KORREKT!!!<br><br>Es ist die vartostr-Funktion, die erst alles zerstört.<br><br><schimpf>Was nützt einem die vielgepriesene Unicode-Fähigkeit von Delphi 2005, wenn das zwar viele Komponenten können (auch ausm Internet besorgbar), aber elementare Funktionen nich, und einem so die Programmiermöglichkeiten nehmen?</schimpf><br><br>Weitere Operationen, die ich mit dem Feldinhalt durchführen muß, setzen nun mal eine Stringvariable voraus. Gibt es keine Funktion vartounicodestr()?
    Ich dachte, ich schreibe mir selbst eine, aber wie komme ich dazu an die Zeichen ran? Ich kann nichtmal die Byte-Werte ermitteln, es gibt immer einen Lfz-Fehler der Art: Variable kann nicht in Integer/Byte/Wasauchimmer umgewandelt werden.
    Warum gibts eigentlich keine vartohex, vartobyte, vartoirgendwaswomitmanwasanfangenkann-Funktion?<br><br>Gibt ja auch diese Unicode-Codierung '& #268;'. Die wäre schon hilfreich, denn letztlich soll alles sowieso ins Internet gestellt werden. Hab also einfach mal auf Verdacht folgendes versucht:<pre>varFeldinhalt:=adodataset1['Feld'];<br>if copy(varFeldinhalt,1,1)=' ' then Feldinhalt:='& #268;'+copy(varFeldinhalt,2,length(varFeldinhalt)-1);</pre>(das ist jetzt nur Pseudocode, ich bin komplizierter in einer Schleife alle Zeichen durchgegangen. Programm wird dadurch natürlich irre schnell)
    Das klappte sogar, aber ich bekam bei einem ganz normalen 'C' ebenfalls den Unicode-Ersatzstring. Wieso um Himmels Willen denn das jetzt wieder???
    Außerdem konnte kleines h nicht von großem H unterschieden werden... kurz: unbrauchbar.<br><br>Also:
    Was hat der Debugger-Tooltip, was ich nicht hab? Geht das nachzubauen?
    Hat jemand ne Lösung oder´n anderen Workaround?
    Kann einfach nicht glauben, daß Borland so schlampig arbeitet... (provozier)<br><br>Alex

  • #2
    Hallo Alex,

    von welchem Type ist Dein Feld in der AccessDB?

    MFG
    Andr&#233

    Comment


    • #3
      Hallo Alex,

      habe noch etwas gefunden. Die Funktion heist VarToWideStr und befindet sich in der Unit Variants. Vieleicht funktioniert es damit.

      MFG
      Andr&#233

      Comment


      • #4
        Und vor allem. Von welchem Typ ist "Feldinhalt".

        Ein Programm Unicode-Fähig zu machen ist nicht ganz trivial, aber es geht. Unser D6-Programm ist bis auf das Datei/Verzeichnisnamen-Handling 100%-Unicode-Enabled

        Comment


        • #5
          @ André
          In der Access-DB können Text und Memo Sonderzeichen haben<br><br>@Bernhard
          Feldinhalt ist wie gesagt vom Typ String<br><br>Die Funktion VarToWideStr ist mir merkwürdigerweise gar nicht untergekommen, dabei hatte ich die Unit Variants direkt mal durchgeguckt auf der Suche nach genau sowas.
          Vermutlich bin ich blind. Muß ich die Variable Feldinhalt dann auch als WideString deklarieren? Das probier ich die Tage mal aus, komme so bald leider nicht dazu.<br><br>danke jedenfalls fürs Augen öffnen<br><br>Ale

          Comment


          • #6
            > Feldinhalt ist wie gesagt vom Typ String

            Wenn du eine VCL.Win32-Anwendung schreibst ist String nur ein 8-Bit-String und damit nicht Unicode-Fähig. Du mußt schon einen WideString nehmen

            Comment


            • #7
              Jetzt hat es geklappt, wenn auch mit zwei Einschränkungen, für die ich aber jeweils einen Workaround fand:<br><br>Zunächst funktionierte es nur mit Textfeldern, nicht mit Memofeldern. Wenn ich aber "SELECT Left(Memofeld,64000)" in der Abfrage schreibe, funktioniert es wieder. Verrückt, was?<br><br>Wenn ich die Widestrings in eine Textdatei schreiben, erhalte ich wieder nur ein halbgares Ergebnis. Ich habe stattdessen den Ersatz "&#nnn;" geschrieben, das klappt einwandfrei.<br>Vermutlich darf ich nicht<pre>f:Text;</pre>deklarieren, sondern irgendwas in der Art<pre>f:File of Widestring;</pre>?<br>Hatte noch keine Zeit, das auch noch auszuprobieren.<br><br>Jedenfalls danke nochmal für den Tipp, mein Geschimpfe nehme ich kleinlaut zurück.<br><br>Ale

              Comment


              • #8
                > Zunächst funktionierte es nur mit Textfeldern, nicht mit Memofeldern. Wenn ich aber "SELECT Left(Memofeld,64000)" in der Abfrage schreibe, funktioniert es wieder. Verrückt, was?

                Evtl. ist da auch noch mein QC-Report (#8596) auch in D2005 vorhanden

                Comment

                Working...
                X