2010-11-21 14 views
16

Ich habe eine Anwendung von Delphi 2007 auf Delphi 2010 aktualisiert, alles gut ging, mit einer Ausnahme Aussage, dass fein kompilierte aber nicht funktioniert, das ist:CharInSet funktioniert nicht mit nicht englischen Buchstaben?

If Edit1.Text[1] in ['S','س'] then 
    ShowMessage('Found') 
else 
    ShowMessage('Not Found') 

Allerdings wusste ich, dass in werde nicht, also habe ich zu CharInSet

If CharinSet(Edit1.Text[1],['S','س']) then 
    ShowMessage('Found') 
else 
    ShowMessage('Not Found') 

aber es hat nie funktioniert, wenn die Zeichenfolge س ist, aber immer mit S arbeiten, auch ich warf die edt1.Text 1 mit AnsiChar es immer nicht arabische Buchstaben arbeiten.

Bin etwas falsch gemacht, oder es ist nicht die Art und Weise CharInSet funktioniert ?, oder das ist ein Fehler in CharinSet?

UPDATE:

mein großer Freund Issam Ali eine andere Lösung vorgeschlagen hat, die als es gut gearbeitet hat:

If CharinSet(AnsiString(edt1.Text)[1],['S','س']) then 
+0

Welche Art ist 'edt1'? – dan04

+0

@ dan04, es ist TEdit, ich habe den Code ändern, um es als edit anstelle von edt anzuzeigen –

+3

Der Compiler gibt die folgende Warnung mit Ihrem CharInSet-Code: [DCC-Warnung] Unit5.pas (30): W1061 Verengung gegeben WideChar konstant (# $ 0633) zu AnsiChar verlorene Informationen –

Antwort

17

CharInSet für die Zeichen über 255. In Ihrem Fall ist nutzlos Sie

case C of 
    'S','س' : ShowMessage('Found'); 
    end; 
+0

Hat gut funktioniert, danke, ich habe nicht darüber nachgedacht, weil ich dachte, dass es das gleiche Problem wie in haben wird. –

1

Haben Sie die Codierung der Quelldatei auf UTF-8 gesetzt (Rechtsklick die öffnen Kontextmenü)? (Der Standardwert ist ANSI iirc, die nicht funktionieren würde.)

+0

Ich habe, und das Projekt neu aufgebaut, funktioniert aber auch nicht. –

+0

Nur gefunden http: // stackoverflow.com/questions/3341754/Also ich denke, es ist nicht so einfach wie ich dachte – mjn

+0

Ich dachte darüber nach, aber ich fühlte nicht, dass das eine machbare Lösung ist, habe ich rund 13 Buchstaben zu vergleichen, mit Zahlenwerten wird schwieriger Debuggen sein , aber ich werde es benutzen, wenn ich keine andere Lösung habe: - /. –

3

Dies geschieht, weil set of char strukturierter Typ (begrenzt auf 256 Elemente verwenden sollten Maximum) unterstützt Unicode überhaupt nicht. Das heißt, dass alle Zeichen Ord(ch) > High(AnsiChar) im Set-Konstruktor gekürzt werden und die Warnung W1061 über die Verengung von WideChar auf AnsiChar ausgegeben wird. Sehen Sie sich folgenden Testfall an:

{ naturally, fails, emits CharInSet() suggestion } 
    Result := 'س' in ['S','س']; 

    { fails because second argument is set of AnsiChar } 
    Result := CharInSet(
    'س', 
    ['S','س'] 
); 

    { workaround for WideChar in AnsiCharSet, fails } 
    Result := WideStrUtils.InOpSet(
    'س', 
    ['S','س'] 
); 

    { a syntactical workaround, which finally works } 
    Result := WideStrUtils.InOpArray(
    'س', 
    ['S','س'] 
); 

    if Result then 
    ShowMessage('PASS') 
    else 
    ShowMessage('FAIL'); 
2

Zusätzlich.

Sätze sind auf Ordnungszahlen von 256 Elementen beschränkt. Also passt AnsiChar und (Unicode) Char passt nicht. Sie können CharInSet verwenden, um Vor-Unicode-Versionen von Delphi auf Unicode-Versionen zu portieren. Aufgrund der eingestellten Limitierung sind Sets mit Chars nicht mehr sehr nützlich.

Der Grund dafür ist, dass Sets als Bitmasken implementiert sind. Sie können Ihre eigene Version eines Sets frei implementieren. Zum Beispiel:

type 
    TSet<T> = class 
    public 
    procedure Add(const AElem: T); 
    function InSet(const AElem: T): Boolean; 
    end; 
0

Verwenden TCharHelper.IsInArray wie folgt:

if Edit1.Text[1].IsInArray(['S','س']) then 
    ShowMessage('Found') 
else 
    ShowMessage('Not Found');