Как седлать чтобы в если в эдите есть русские символы или : ? + то вылезало предупреждение.
var s:string;
ch:Char;
flag:boolean;
i:Integer;
begin
s:=Edit1.text;
flag:=False;
for i:=1 to Length(s) do
begin
ch:=s[i];
if (Ch='?') or (Ch='+') or
(('а'<=ch) and (ch<='я')) or
(('А'<=ch) and (ch<='Я')) or
(Ch='ё') or (Ch='Ё') then Flag:=True;
end;
if Flag then Application.MessageBox('Неправильные символы','Предуприждение');
end;
Можно и множества использовать
Flag:=ch in ['?','+','а'..'я','А'..'Я','ё','Ё'];
C:\Users\User\Documents\Embarcadero\Studio\Projects\тест\Unit1.pas(38,56): warning W1050: W1050 WideChar reduced to byte char in set expressions. Consider using ‘CharInSet’ function in ‘SysUtils’ unit.
Множества работают для букв до 256. А русские буквы лежат гораздо дальше.
Кстати, множество можно заменить на строку и принадлежность проверять функцией ansiPos. То есть, как-то так это будет записано:
position:=ansiPos('ch', 'АБВГДЕЁ'); // если 0, то не найдено
Очень странная задача, обычно надо проверять на допустимые знаки.
Удобно для ‘+?ёЁ’
а смысл продолжать цикл, если уже найден недопустимый символ?
then begin Flag := true; Break end;
не совсем. есть такое CharInSet(), который и в старших версиях Delphi работает (поддерживает Unicode)
if CharInSet(ch, ['+','?', 'а'..'я', 'А'..'Я', 'ё', 'Ё']) then
ch,ch1:Char;
i:Integer;
F:string;
begin
begin
ch:=edit1.Text[i];
ch1:=edit2.Text[i];
if (ch in ['?','+','а'..'я','А'..'Я','ё','Ё']) or (ch1 in ['?','+','а'..'я','А'..'Я','ё','Ё']) then
form2.Warning.Visible:=true
Простите, а где Вы такой код увидели?!
Так писать нельзя - i равно непонятно чему, поэтому запись edit1.Text[i] - это обращение в никуда (что и приводит к access violation)
попробуйте примерно так написать
var
flag:boolean;
i:Integer;
begin
flag:=False;
for i:=1 to Length(Edit1.Text) do
if CharInSet(Edit1.Text[i], ['+','?', 'а'..'я', 'А'..'Я', 'ё', 'Ё']) then
begin Flag := true; Break end;
if Not Flag then
for i:=1 to Length(Edit2.Text) do
if CharInSet(Edit2.Text[i], ['+','?', 'а'..'я', 'А'..'Я', 'ё', 'Ё']) then
begin Flag := true; Break end;
if Flag then form2.Warning.Visible:=true
end;
p.s. а какая у Вас версия Delphi ?
Embarcadero Rad Studio 10.3 Rio Architect 26.0.32429.4364
фаерманке
Компилируется без проблем, но не реагирует на запрещенные символы.
А вы возьмите и проверьте. Не работает, и работаь не будет! Первый параметр у вас будет юникод, а правый у вас будет каша потому, что вначале компилятор усечёт ваши юникод символы до 255 чтобы записать их в множество.
Правда CharSet потом сам усечёт юникодовые символ из первого параметра до 255.
Казалось что минус на минус должен дать плюс, но не тут то было. А дело в том, что английская “1”=49 совпадёт с русской “Б”=1071 mod 256 = 49
И ваш код будет ругаться на 1 которая записана в edite.
я уже проверила реакция такая будто на кнопке не задано событие
Негде проверить, если только Delphi 2008, там ещё нет Unicode
ок.
а так?
const BadSymb = '+?абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
var
flag:boolean;
i:Integer;
begin
flag:=False;
for i:=1 to Length(Edit1.Text) do
if Pos(Edit1.Text[i], BadSymb)>0 then begin Flag := true; Break end;
if Not Flag then
for i:=1 to Length(Edit2.Text) do
if Pos(Edit2.Text[i], BadSymb)>0 then begin Flag := true; Break end;
if Flag then form2.Warning.Visible:=true
end;
@MARIA, а действительно, почему именно список запрещённых символов? обычно решается ровно обратная задача, когда есть список допустимых символов и всё, что не разрешено, всё запрещено.
а в вашем случае, легко написать текст вида
բարև Մարիա
или
হাই মারিয়া
и проверка пройдёт успешно, ведь тут нет ни одного запрещённого символа
тоже вариант а как сделать?
сделать только если допустимые символы?
так точно так же:
const GoodSymb = '0123456789';
var
flag_all_is_good:boolean;
i:Integer;
begin
flag_all_is_good := True;
for i:=1 to Length(Edit1.Text) do
if Pos(Edit1.Text[i], GoodSymb)=0 then begin flag_all_is_good := false; Break end;
if flag_all_is_good then
for i:=1 to Length(Edit2.Text) do
if Pos(Edit2.Text[i], GoodSymb)=0 then begin flag_all_is_good := false; Break end;
Form2.Warning.Visible := Not flag_all_is_good
end;
так робит