Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Doppeldeutiger überladener Aufruf nach Unicode-Umstellung (https://www.delphipraxis.net/139213-doppeldeutiger-ueberladener-aufruf-nach-unicode-umstellung.html)

messie 25. Aug 2009 17:27


Doppeldeutiger überladener Aufruf nach Unicode-Umstellung
 
Moin,

ich habe mal wieder ein Problem mit dem Umstieg von Tnt-Unicode auf RAD2009.

Meine TTntComboBox ist jetzt so deklariert:

Delphi-Quellcode:
TTntComboBox = class(TComboBox);
Nun bekomme ich beim Aufruf
Delphi-Quellcode:
const
  s = WideString('irgendwas');
if pos(s,ComboBox1.Items.Strings[0]) then
  begin
    //machwas
  end;
den beschriebenen Fehler vom Compiler.

Wenn ich Pos() durch AnsiPos() ersetze, tritt der Fehler nicht mehr auf. Das ist aber inhaltlich nicht richtig, da ich durchaus auch mal kyrillisch in der ComboBox stehen habe.
Ich peil' es nicht: durch die Umleitung auf TComboBox müsste doch Unicode in den Items enthalten sein. Oder ist darin anderes Unicode als in meiner Konstante s?

Grüße, Messie

shmia 25. Aug 2009 17:50

Re: Doppeldeutiger überladener Aufruf nach Unicode-Umstellun
 
Versuch mal eine typisierte Konstante: (ich armer D5 Anwender kann's nicht testen)
Delphi-Quellcode:
const
  s : WideString = 'irgendwas';
if pos(s,ComboBox1.Items.Strings[0]) <> 0 then
  begin
    //machwas
  end;
Dein Codeschnipsel hat übrigens einen Fehler in der If-Bedingung.

mkinzler 25. Aug 2009 18:03

Re: Doppeldeutiger überladener Aufruf nach Unicode-Umstellun
 
Dabei musst du aber beachten, dass AnsiPos() eine Unicode-Funktion und kein Ansi-Funktion ist, auch wenn der namen etwas anderes suggeriert.

jaenicke 25. Aug 2009 18:06

Re: Doppeldeutiger überladener Aufruf nach Unicode-Umstellun
 
Der Unterschied ist, dass die TntControls und deine Variable WideStrings nutzen bzw. sind. Diese sind vom System bereitgestellte Unicodezeichenketten.

Delphi 2009 wiederum benutzt UnicodeString, welches eine delphiinterne Zeichenkette wie auch AnsiStrings sind (inkl. Referenzzähler usw.).

Deshalb muss ein WideString implizit konvertiert werden und da gibt es vermutlich verschiedene Varianten von Pos, die da in Frage kommen.

messie 25. Aug 2009 18:20

Re: Doppeldeutiger überladener Aufruf nach Unicode-Umstellun
 
Zitat:

Zitat von jaenicke
Der Unterschied ist, dass die TntControls (...) WideStrings nutzen bzw. sind.

Nee, die eben jetzt nicht mehr, wohl aber meine Konstante. Das hat mich ja so verwirrt. Durch die Versionsdirektive wird ja das TntControl auf ein Delphi-Control zurückgeleitet. Somit sind in dem Control auch Delphi-Strings drin. Die sind zwar jetzt Unicode aber nicht WideString. Ich habe mal den Cast für WideString('irgendwas') weggelassen, geht dann auch.
Wenn die Beschreibung von mkinzler zutrifft, wird die Funktion AnsiPos für mich die richtige sein. Ich werde die Varianten mal testen.

Die Haptik des Unicode-Handlings in 2009 finde ich aber ehrlich gesagt katastrophal.

Grüße, Messie


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:56 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