2010-11-21 8 views
16

I zostały zaktualizowane aplikacji z Delphi 2007 do Delphi 2010, wszystko poszło dobrze, z wyjątkiem jednego stwierdzenia, że ​​skompilowany w porządku, ale nie działa, który jest:CharInSet nie działa z literami innymi niż angielskie?

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

Jednak wiedziałem, że nie będzie, więc zmieniłem się CharInSet

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

ale nigdy nie pracował, gdy ciąg jest س, ale zawsze działa z S, nawet ja rzucić edt1.Text 1 z AnsiChar to nie zawsze działa litery arabskie.

Robię coś źle, czy to nie jest sposób w jaki działa CharInSet ?, lub jest to błąd w CharinSet?

UPDATE:

Mój wielki przyjaciel Issam Ali zaproponował inne rozwiązanie, które pracował w porządku, jak to:

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

Jakie jest 'edt1'? – dan04

+0

@ dan04, to TEdit, zmieniłem kod, aby pokazać, że jest edytowany zamiast edt –

+3

Kompilator wysyła następujące ostrzeżenie z kodem CharinSet: [Ostrzeżenie DCC] Unit5.pas (30): W1061 Zwężenie ze stałą WideChar (# 0633) do AnsiChar stracił informacje –

Odpowiedz

17

CharInSet jest bezużyteczny dla postaci powyżej 255. W twoim przypadku należy użyć

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

Pracowałem dobrze dziękuję, nie myślałem o tym, ponieważ myślałem, że będzie miał ten sam problem, co w. –

1

masz ustawione kodowanie pliku źródłowego do UTF-8 (prawy przycisk myszy, aby otworzyć menu kontekstowe)? (Domyślnie jest ANSI IIRC, który nie będzie działać).

+0

Zrobiłem i przebudowałem projekt, ale też nie działa. –

+0

Właśnie znalazłem http: // stackoverflow.com/questions/3341754/więc myślę, że to nie jest takie proste, jak myślałem – mjn

+0

Myślałem o tym, ale nie czułem, że to wykonalne rozwiązanie, mam około 13 liter do porównania, używanie wartości liczbowych będzie trudniejsze w debugowaniu , ale użyję go, jeśli nie mam innego rozwiązania: - /. –

3

Dzieje się tak dlatego set of char strukturze typu (ograniczona do 256 elementów maximum) w ogóle nie obsługuje Unicode. Oznacza to, że wszystkie znaki skracane w konstruktorze zestawów i ostrzeżenie W1061 o zwężeniu WideChar do AnsiChar są emitowane. Spójrz na następującą teczkę:

{ 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

Dodatkowo.

zestawy są ograniczone do wartości porządkowych 256 elementów. Więc AnsiChar pasuje i (Unicode) Char nie pasuje. Możesz użyć programu CharInSet do przeniesienia wersji Delphi w wersji unikodowej do wersji Unicode. Z powodu ustawionego ograniczenia zestawy nie są już zbyt użyteczne w przypadku znaków.

Powodem tego jest to, że zestawy są zaimplementowane jako maski bitowe. Możesz zaimplementować własną wersję zestawu. Na przykład:

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

Korzystanie TCharHelper.IsInArray następująco:

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