Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Probleme mit TStrings.IndexOfName unter Vista (https://www.delphipraxis.net/89457-probleme-mit-tstrings-indexofname-unter-vista.html)

sh17 31. Mär 2007 12:15


Probleme mit TStrings.IndexOfName unter Vista
 
Folgender Sachverhalt:

ich habe eine Liste mit einer Reihe von Name= Wert Paaren:

blabla=1
dd=2
....
huebn=32
...
hübn=8763
...
usw=hjsd

Wenn ich unter Windows XP und früher liste.indexOfName('hübn')
aufrufe, erhalte ich wie erwartet den Index dieses Namens.

Mache ich das ganze unter Vista, bekommen ich den Index von 'huebn'

:shock:

Folgender Code zeigt die betreffenden Quellen von Delphi 6

Delphi-Quellcode:
function TStrings.CompareStrings(const S1, S2: string): Integer;
begin
  Result := AnsiCompareText(S1, S2);
end;

function AnsiCompareText(const S1, S2: string): Integer;
begin
{$IFDEF MSWINDOWS}
  Result := CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, PChar(S1),
    Length(S1), PChar(S2), Length(S2)) - 2;
{$ENDIF}
{$IFDEF LINUX}
  Result := WideCompareText(S1, S2);
{$ENDIF}
end;
Ich schätze mal CompareString mit LOCALE_USER_DEFAULT ist der Übeltäter.

Hat jemand so ein Verhalten schon einmal beobachtet? Was kann ich da machen? Sie der betreffende Quelltext von Delphi in späteren Versionen evtl. anders aus?

MSDN hat mich auch noch nicht weiter gebracht.

Gruber_Hans_12345 31. Mär 2007 13:13

Re: Probleme mit TStrings.IndexOfName unter Vista
 
uih, gut zu wissen, habs auch gleich mal getestet ... das kann ja wirklich böse folgen haben sowas ...

hab gerade mal in VCL von D2006 geguckt, die sieht ganz gleich aus

[edit] wharscheinlich haben die das feature eingebaut, damit man deutsche wörter besser sortieren kann, dann macht es sinn, das ae und ä gleichwertig sind ...

sh17 1. Apr 2007 19:39

Re: Probleme mit TStrings.IndexOfName unter Vista
 
Hm, schön für die Sortierung und dieses neue "Feature". Nur leider entgegen der bisherigen Funktionsweise.

Ich werd morgen mal die verschiedenen Parameter für CompareString prüfen. Vielleicht betrifft es ja nur AnsiSameText und mit AnsiSameStr funktioniert es. Würde heissen, TString geht so dann nicht mehr, TStringList müsste dann auf CaseSensitive = true gesetzt werden.

Mal gucken.

sh17 2. Apr 2007 12:54

Re: Probleme mit TStrings.IndexOfName unter Vista
 
Push :duck:

Ich weiß, dass das erst nach 24 Stunden erlaubt ist, aber bei der Brisanz des Themas musste ich mal.

Das rumprobieren mit den verschiedenen Flags von CompareString bringt gar nichts.

Folgendes unter Vista sollte eigentlich keine MessageBox bringen, bringt es aber

Delphi-Quellcode:
  if (CompareStringW(LOCALE_USER_DEFAULT, 0, 'HÜBNER', Length('HÜBNER'),
    'HUEBNER', Length('HUEBNER')) - 2) = 0 then
    ShowMessage('Fehler');
Selbst wenn es ein Problem der Funktionsparameter ist, wäre das ja echt grass. Dann müsste ich ja die Delphi-Quellen anpassen. :shock:

Hat jemand eine Idee, was man da tun sollte?

Luckie 2. Apr 2007 12:56

Re: Probleme mit TStrings.IndexOfName unter Vista
 
Wie sehen die Ländereinstellungen unter XP und Vista aus?

sh17 2. Apr 2007 12:57

Re: Probleme mit TStrings.IndexOfName unter Vista
 
Auf den ersten Blick gleich.

Bernhard Geyer 2. Apr 2007 13:57

Re: Probleme mit TStrings.IndexOfName unter Vista
 
Habs zwar noch nicht ganz verstanden was die im MSDN schreiben, aber dort stehen einige Hinweise auf Vista.

Bernhard Geyer 2. Apr 2007 14:07

Re: Probleme mit TStrings.IndexOfName unter Vista
 
Falls jemand das Plattform-SDK hat, könnte der mal die Werte von

Zitat:

LINGUISTIC_IGNORECASE
LINGUISTIC_IGNOREDIACRITIC
NORM_IGNORECASE
NORM_IGNOREKANATYPE
NORM_IGNORENONSPACE
NORM_IGNORESYMBOLS
NORM_IGNOREWIDTH
NORM_LINGUISTIC_CASING
SORT_STRINGSORT
nachschauen

sh17 2. Apr 2007 14:18

Re: Probleme mit TStrings.IndexOfName unter Vista
 
#define NORM_IGNORECASE 0x00000001 // ignore case
#define NORM_IGNORENONSPACE 0x00000002 // ignore nonspacing chars
#define NORM_IGNORESYMBOLS 0x00000004 // ignore symbols

#define LINGUISTIC_IGNORECASE 0x00000010 // linguistically appropriate 'ignore case'
#define LINGUISTIC_IGNOREDIACRITIC 0x00000020 // linguistically appropriate 'ignore nonspace'

#define NORM_IGNOREKANATYPE 0x00010000 // ignore kanatype
#define NORM_IGNOREWIDTH 0x00020000 // ignore width
#define NORM_LINGUISTIC_CASING 0x08000000 // use linguistic rules for casing


//Edit

die neuem Parameter als Flag bringen keine Besserung des Ergebnisses.

sh17 2. Apr 2007 14:46

Re: Probleme mit TStrings.IndexOfName unter Vista
 
Also aus meiner Sicht gäbe es nur folgende Lösungen.

1. Kein Vista benutzen bzw. die Einstellung finden, die den Mist verzapft

2. Einen API-Hook für CompareString,CompareStringA,CompareStringW schreiben und auf StrICompW, StrCompW umbiegen, die es in vielen Unicode-Bibliotheken gibt (JCL, Unicode.pas von Mike Lischke)
Ansi-Variante bietet Delphi mit SameText und SameStr


Wäre 2. sinnvoll? Ist das unter Vista mit Benutzerrechten möglich?

Vielleicht langt es ja schon, wie bei TNTs InstallTntSystemUpdates die Delphi-Functionen zu patchen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:25 Uhr.
Seite 1 von 5  1 23     Letzte »    

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