Ограничение ввода

Как седлать чтобы в если в эдите есть русские символы или : ? + то вылезало предупреждение.

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;
1 лайк

Можно и множества использовать

Flag:=ch in ['?','+','а'..'я','А'..'Я','ё','Ё'];
1 лайк

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. А русские буквы лежат гораздо дальше.

1 лайк

Кстати, множество можно заменить на строку и принадлежность проверять функцией ansiPos. То есть, как-то так это будет записано:

position:=ansiPos('ch', 'АБВГДЕЁ'); // если 0, то не найдено
1 лайк

Очень странная задача, обычно надо проверять на допустимые знаки.

Удобно для ‘+?ёЁ’

1 лайк

а смысл продолжать цикл, если уже найден недопустимый символ?

then begin Flag := true; Break end;

не совсем. есть такое CharInSet(), который и в старших версиях Delphi работает (поддерживает Unicode)

if   CharInSet(ch, ['+','?', 'а'..'я', 'А'..'Я', 'ё', 'Ё']) then 
1 лайк
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

image

Простите, а где Вы такой код увидели?!
Так писать нельзя - 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 ?

1 лайк

Embarcadero Rad Studio 10.3 Rio Architect 26.0.32429.4364

фаерманке

Компилируется без проблем, но не реагирует на запрещенные символы.

А вы возьмите и проверьте. Не работает, и работаь не будет! Первый параметр у вас будет юникод, а правый у вас будет каша потому, что вначале компилятор усечёт ваши юникод символы до 255 чтобы записать их в множество.
Правда CharSet потом сам усечёт юникодовые символ из первого параметра до 255.
Казалось что минус на минус должен дать плюс, но не тут то было. А дело в том, что английская “1”=49 совпадёт с русской “Б”=1071 mod 256 = 49
И ваш код будет ругаться на 1 которая записана в edite.

1 лайк

я уже проверила реакция такая будто на кнопке не задано событие

Негде проверить, если только 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;
1 лайк

@MARIA, а действительно, почему именно список запрещённых символов? обычно решается ровно обратная задача, когда есть список допустимых символов и всё, что не разрешено, всё запрещено.
а в вашем случае, легко написать текст вида
բարև Մարիա
или
হাই মারিয়া
и проверка пройдёт успешно, ведь тут нет ни одного запрещённого символа :dadparrot:

1 лайк

тоже вариант а как сделать?

сделать только если допустимые символы?
так точно так же:

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;

так робит