![]() |
Pos() oder AnsiPos()?
Hallo.
Ich bin mal wieder am Überarbeiten meiner Codes. Mir ist Letztens folgendes aufgefallen: Ich habe stets UpperCase(), LowerCase() oder z.B. Pos() verwendet. Es gibt aber zu all diesen Funktionen auch die Ansi-Varianten, wie z.B. AnsiPos(). Nun, der Vorteil an AnsiUpperCase() ist z.B. dass es MBCS (= Unicode?) unterstützt. Außerdem werden auch deutsche Umlaute wie z.B. das ä behandelt. Nun stellt sich die Frage: Wenn die Ansi-Varianten also "besser" sind, wieso sollte man die Nicht-Ansi-Varianten überhaupt noch verwenden? (Sehen wir mal von Inkompatibilitäten bezüglich groß- oder nicht-groß- geschriebenen äöü ab) Außerdem: 1. Wieso meldet Delphi z.B. das Symbol Pos() nicht als veraltet? 2. Wieso hat Delphi trotzdem noch Code für z.B. Pos() implementiert und leitet nicht auf AnsiPos() um?
Delphi-Quellcode:
Ist es legitim, alle Codes, die ich z.B. aus der CodeLib übernommen habe, innerhalb meines Projektes einfach Pos() -> AnsiPos() umzuwandeln, um bei einem eventuellen Delphi 2009 Umstieg möglichst Unicode-Ready zu sein?
function Pos(const Substr, S: string): Integer;
begin result := AnsiPos(Substr, S); end; Gruß blackdrake |
Re: Pos() oder AnsiPos()?
UpperCase und LowerCase nutzt man dann wenn man Geschwindigkeit braucht und nur den ASCII Zeichensatz verwendet.
AnsiPos und Pos arbeiten in Delphi 2009 gleich, nur das Pos schneller ist weil ein besserer Algorithmus verwendet wird. Ich habe AnsiPos noch nie verwendet, da ich nur für westliche Sprachen programmiere und diese keine MBCS nutzen und somit alle Char eindeutig sind. Mit Unicode ist das aber hinfällig, weil dort jeder Char auch für östliche Sprachen eindeutig ist. |
Re: Pos() oder AnsiPos()?
Bei Pos ist es so, das dort automatisch die passende Version für AnsiString oder WideString gewählt wird.
Wenn du deinen "String" als String definierst, wird dort Seit Delphi 2009 standardmäßig Unicode (WideString) verwendet ... in den früheren Delphi-Versionen ist es AnsiString. Ebenso ist es mit Char. (D09 = WideChar und davor AnsiChar) In der WinAPI ist es ebenso geregelt ... dort gibt es Ansi- (abcA), Unicode- (abcW) und die Standard-Versionen (abc), wobei Letztere wiederrum entsprechend der umgebung auf die Ansi- oder UnicodeVersionen umgeleitet werden. Also, mit den von dir "alt" genannten Versionen kann man ein Programm erstellen und dann erst später, beim Compilieren, entscheiden, ob es ein Ansi- oder Unicode-Programm werden soll. |
Re: Pos() oder AnsiPos()?
Heißt das, Pos() wird bei Delphi2009 einen WideString, also Unicode-String korrekt behandeln, AnsiPos() aber nicht? Dann wäre ja Pos() wieder die bessere Wahl, oder?
Und wie ist es bei AnsiUpperCase()? Mir scheint es, als ob das die "bessere" Variante wäre, weil äöü uppercas'ed wird im Gegensatz zu UpperCase(). |
Re: Pos() oder AnsiPos()?
hatte oben noch was zueditiert (wärend du schriebst)
Nja, eigentlich wäre es schönder, wenn Delphi standardmäßig (vor D09) an die "richtigen" Ansi-Versionen umleiten würde. Also Pos an AnsiPos ... leider macht es dieses nicht immer so :? Wenn du aus jeden Fall nur mit ANSI arbeiten willst, dann währe theoretisch AnsiPos und Co. wohl die bessere Wahl ... aber wenn du dann doch mal auf Unicode umstellen willst, dann mußt du dann alles auf Unicode umschreiben. Selber arbeite ich oft direct mit den Unicode-Versionen (außer Pos, denn dieses wird bei einem UnicodeString richtig an die UnicodeVersion weitergeleitet) ... arbeite schon seit Delphi 7 oftmals mit Unicode (siehe FileSplitter und Co.). Wenn es dir nicht auf den Speicher ankommt, wäre es dann wohl doch besser statt die Ansi-Versionen direkt zu verwenden die UnicodeVersionen zu verwenden (dort hat man dann volle Unterstützung für Unicode und keine Probleme mit CodePages und Co.) |
Re: Pos() oder AnsiPos()?
Aber String (ab D2009) = UnicodeString <> WideString
|
Re: Pos() oder AnsiPos()?
|
Re: Pos() oder AnsiPos()?
Zitat:
aber statt AnsiString in der Definition find ich was Anderes :shock:
Delphi-Quellcode:
function AnsiPos(const Substr, S: string): Integer;
|
Re: Pos() oder AnsiPos()?
Hallo.
jbg, danke für diese sehr ausführliche und Übersichtliche Auflistung. Ok, dann bleibe ich bei den Ansi* Varianten mit den Delphi-Strings (also dem Typ "String"). Damit bin ich bei Delphi 2009 Unicode-Ready und bei Delphi 2007- kompatibel bezüglich Umlauten. Schade, dass Delphi 2009 bei AnsiPos() und Pos() das selbe Verhalten hat, aber AnsiPos() langsamer ist. Aber das ist irgendwie nicht mein Problem, da Delphi 2009 ja die Funktion einfach als Alias umleiten könnte. Deswegen plage ich mich nicht extra mit Compilerschaltern rum. Es kommt bei meinen Pos-Aufrufen auch nicht auf jede Millisekunden an, da ich nicht mit großen Datenmengen arbeite. PS: Gibt es eine Erklärung, wieso Delphi 2009 bei Pos() und AnsiPos() scheinbar GLEICHE Funktionen, aber unterschiedlich schnelle Algorithmen verwendet? Ist das Verhalten vielleicht doch nicht identisch? Oder haben die den Alias der Funktion AnsiPos -> Pos wirklich vergessen? Gruß blackdrake |
Re: Pos() oder AnsiPos()?
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: Pos() oder AnsiPos()?
Zitat:
![]() edit: Ich wollte nur darauf hinweisen, dass die Funktionen UCS-2 anstatt UTF-16 implementieren. Egal. |
Re: Pos() oder AnsiPos()?
Zitat:
|
Re: Pos() oder AnsiPos()?
Zitat:
der Compiler wirft mir vor: doppeldeutiger überladener Aufruf von 'Pos'. Die Codezeile:
Delphi-Quellcode:
Ich fühle mich nicht schuldig.
Pos(WideText,ComboBox1.Items.Strings[i])
WideText ist deklariert als WideText = WideString('Hello World'), was mir in der IDE als string angegeben wird, Die ComboBox ist eine TTntComboBox, die auch echte Widestrings liefert(IDE: "Returns System.string"). Offensichtlich macht 2009 einen falschen Redirect (ein cast ist das ja nicht wirklich) auf string, denn
Delphi-Quellcode:
funktioniert
Pos(WideText,WideString(ComboBox1.Items.Strings[i]))
Wie ist denn der Umgang für D2009 korrekt? Kommt man da ohne Änderungen dran? Denn ich habe das in meinen Quellen oft verwendet. Grüße, Messie |
Re: Pos() oder AnsiPos()?
als was ist denn WideText definiert?
ist das eine Konstante? dann laß mal in D2009 das WideString() dort weg :gruebel: |
Re: Pos() oder AnsiPos()?
Zitat:
Delphi-Quellcode:
Als als typunabhängige Konstante. Und dabei scheint was schief zu gehen, denn
const
WideText = WideString('Hallo');
Delphi-Quellcode:
scheint zu klappen.
const
WideText : WideString = WideString('Hallo'); Grüße, Messie |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:07 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