Integer;
ValidChars: AnsiString;
begin
ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&?*()-_';
Result := False;
for i := 1 to Length(ValidChars) do
begin
if Ord(ch) = Ord(ValidChars[i]) then
begin
Result := True;
Break;
end;
end;
end;
Передаю в неё символ:
IsValidChar('и');
Ругается: Error: Incompatible type for arg no. 1: Got "Constant String", expected "Char"
Если передаю латиницей, то все ок. Что не так делаю?
утф8чар и есть строка
ValidChars у тебя для однобайтных символов
Но в таком случае пусть я получаю всегда False. Но чем же не нравится входному параметру один символ?
Так просто нельзя: ord(aString)
если винда, можно попробовать сохранить исходник в ansi кодировке. тогда есть шанс насколько помню. если 'и' будет в 1251
Если тебе нужно просто просканировать строку UTF8 на валидные Ansi символы, то можешь сделать так: function IsValidString(const S: String; ValidChars: TAnsiCharSet): Boolean; var i: Integer; begin if S=EmptyStr then Exit(False); i:=0; Result:=True; while Result and (i<Length(S)) do begin if not (S[i+1] in ValidChars) then Result:=False; Inc(i); end; end;
Я так понимаю у него там надо или через переменную передавать параметр, или const дописать у параметра
Задумка такая, что я при вводе в поле "Пароль" буду проверять символы, доступны ли они из того списка, который указан в функции. И она при каждом вводе KeyPress будет это проверять.
если в списке только латиница и символы "байтовой" части uff8 то както так
Не понятно, зачем вы вообще ограничивается юзера в пароле
Lazarus
Вопрос хороший конечно. Но тогда переведем это в "Проверка логина". Там будет идентичная проверка и русские символы точно недопустимы
В fmx можно для Edit указать доступный набор символов) В противном случае, можно использовать for var Char in AllowedChars do if not text.Contains(Char) then ...
До FMX я пока не дорос ещё, к сожалению... Там с БД нужен API.
Про обезьянку я так понял он имел ввиду)
У меня на Сохранить проверяется, при этом юзеру пишется заранее, что проверяется
Типа подсказка под полес, что вводите такие то символы?
Заменить объявления на WideString и WideChar, убедиться, что модуль в кодировке utf8 и указана директива codepage utf8 в начале модуля.
Чуть не так описание бы)
Не понятно что вводить? Могу ятей понаставить
Ну просто взять второе предложение, оно противоречит первому. "Должна присутствовать хотя бы одна цифра" уже расширяет первое условие
Аа, цифра не символ))
Символ символ)
Иван, можешь мне мозг парить. Но заказчик удовлетворен и остальное пофиг)
Ну я так, за рюшечки) я без негатива)
```pascal function CheckASCII(const s: utf8String): Boolean; var i: Integer;
function IsOnlyASCII(const s: utf8String): Boolean; var i: Integer; begin Result:=False; for i:=1 to Length(s) do if not (Ord(s[i]) in [$21..$7f]) then Exit; Result:=True; end;
Буду дома и обязательно проверю. Спасибо!
но так-то всякие скобки в логине тоже не нужны, верно?
вероятно, достаточно набора [0-9A-Za-z_.]? if not (s[i] in ['0'..'9', 'A'..'Z', 'a'..'z', '_', '.']) then
Ну и ещё там несколько символов. !#%&_?
в логине? ну тогда добавьте в условие
function IsOnlyASCII(const s: utf8String): Boolean; var i: Integer; begin Result:=False; for i:=1 to Length(s) do if not (Ord(s[i]) in [$21..$7f]) then Exit; Result:=True; end; procedure TfrmUsAE.edtUserNameKeyPress(Sender: TObject; var Key: Char); begin if IsOnlyASCII(UTF8Encode(Key)) then begin ShowMessage('!'); end; end; Этот вариант вообще не работает, даже с цифрами)))
ну тут имя функции стоит поменять на что-то более точное, там же не "почти весь" ASCII теперь
Можно проще: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&?*()-_'; if Pos(ch, ValidChars) then Exit(True) else Exit(False); end; Правда не проверял)
Вот у меня практически один в один был код на Delphi, а на Лазаре не сработал и стал возиться с кодировками.
Опять if true then exit(true) else exit(false); :( Зачем? Result :=Pos(ch, ValidChars)<>0;
Но тут опять будет нюанс: если в ValidChars только верхняя половина ASCII, то можно бежать по строке побайтово. Но если захочется добавить символов вне этого диапазона, по проверяемой строке придется бежать с учётом длины мультибайтных символов, иначе в общем случае возможны ложные срабатывания
Pos умеет работать и с UnicodeString и WideString и AnsiString. Причем тип строки и символа могут отличаться
И? Ответ был не про Pos, а про исходную строку, из нее же берут по символу для проверки. Вот если внутри ValidChars... и далее по тексту выше
Обсуждают сегодня