Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2022, 21:03   #21
mr.stranger
Пользователь
 
Регистрация: 02.05.2022
Сообщений: 52
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
for i := low(Edit3) to high(Edit3) do if not Edit3[i] in ['0' .. '9'] then exit;
Выдает ошибку: Type mismatch
mr.stranger вне форума Ответить с цитированием
Старый 31.05.2022, 21:18   #22
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

А кто-то меня отговаривал здесь не использовать ord
Код:
for i := low(Edit3) to high(Edit3) do if not (Byte(ord(Edit3[i]) - ord('0')) > 9) then exit;
macomics вне форума Ответить с цитированием
Старый 31.05.2022, 21:26   #23
mr.stranger
Пользователь
 
Регистрация: 02.05.2022
Сообщений: 52
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
for i := low(Edit3) to high(Edit3) do if not (Byte(ord(Edit3[i]) - ord('0')) > 9) then exit;
Вообще ничего не происходит, ввод не проходит
mr.stranger вне форума Ответить с цитированием
Старый 31.05.2022, 21:46   #24
mr.stranger
Пользователь
 
Регистрация: 02.05.2022
Сообщений: 52
По умолчанию

Код:
for i := low(Edit3) to high(Edit3) do
if (Byte(ord(Edit3[i]) - ord('0')) > 9) then
begin
ShowMessage('Числа введите');
Exit;
end;
Так заработало
mr.stranger вне форума Ответить с цитированием
Старый 31.05.2022, 22:14   #25
mr.stranger
Пользователь
 
Регистрация: 02.05.2022
Сообщений: 52
По умолчанию

Осталось сделать проверку на дублированную запись
Это надо через массив делать? Или можно как-то попроще?
mr.stranger вне форума Ответить с цитированием
Старый 31.05.2022, 23:44   #26
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

С вашим подходом - однозначно через массивы или объект TStringList.
Для передачи в параметрах массива надо будет объявить новый тип данных иначе Pascal может не принять аргументы даже если они будут объявлены одинаково.
Или можно поступить хитрее - просто передать компонент StringGrid1 в качестве аргумента функции Prov
macomics вне форума Ответить с цитированием
Старый 31.05.2022, 23:59   #27
mr.stranger
Пользователь
 
Регистрация: 02.05.2022
Сообщений: 52
По умолчанию

Так, верно?

Код:
function Prov(Edit1, Edit2, Edit3:string; StringGrid1:TStringGrid): boolean;
var i,a,b1,b2,b3,b4:integer;  
begin
for a := 1 to StringGrid1.RowCount-1 do
if StringGrid1.Cells[1,a] = Trim(Edit1) then
b1 := 1;
for a := 1 to StringGrid1.RowCount-1 do
if StringGrid1.Cells[2,a] = Trim(Edit2) then
b2 := 1;
for a := 1 to StringGrid1.RowCount-1 do
if StringGrid1.Cells[3,a] = Trim(Edit3) then
b3 := 1;             
b4 := b1 + b2 + b3;
if b4 = 3 then
begin                
ShowMessage('Есть одинаковые элементы');
exit;
end;

Последний раз редактировалось mr.stranger; 01.06.2022 в 00:34.
mr.stranger вне форума Ответить с цитированием
Старый 01.06.2022, 01:04   #28
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

зачем вам переменная i и a? а зачем столько числовых значений?
Код:
function Prov(Edit1, Edit2, Edit3:string; StringGrid1:TStringGrid): boolean;
var i:integer;
begin
  Result := False;
  if (Edit1 = '') or (Edit2 = '') or (Edit3 = '') then begin
    ShowMessage('Вы не ввели одно из значений!');
    exit;
  end;
  for i := low(Edit3) to high(Edit3) do
    if Byte(ord(Edit3[i]) - ord('0')) > 9 then begin
      ShowMessage('В третьем поле надо вводить числа!');
      exit;
    end;
  with StringGrid1 do // Зачем писать 10 раз имя компонента
    for i := FixedRows to RowCount-1 do
      if (Cells[1,i] = Trim(Edit1)) and (Cells[2,i] = Trim(Edit2)) and (strtoint(Cells[3,i]) = strtoint(Edit3)) then begin
        ShowMessage('Есть одинаковые элементы!');
        exit;
      end;
  Result := True;
end;

Последний раз редактировалось macomics; 01.06.2022 в 01:35.
macomics вне форума Ответить с цитированием
Старый 01.06.2022, 01:26   #29
mr.stranger
Пользователь
 
Регистрация: 02.05.2022
Сообщений: 52
По умолчанию

понятно, спасибо вам большое
mr.stranger вне форума Ответить с цитированием
Старый 01.06.2022, 05:01   #30
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Вынес бы вызовы trim в начало функции из цикла:
Код:
Edit1 := Trim(Edit1);
Edit2 := Trim(Edit2);
Edit3 := Trim(Edit3);
И не делал бы strtoint, раз в Edit3 точно записано число (на момент прохода по гриду).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цикл проверки ввода данных Moonlite Windows Forms 4 10.06.2016 17:00
Ошибка проверки корректности ввода Valentina2011 Общие вопросы C/C++ 3 13.05.2012 20:40
функция проверки орфографии ЕленаШ Помощь студентам 0 27.03.2012 00:21
C#. Внешнее завершение метода методом проверки ввода killo C# (си шарп) 1 16.11.2010 12:53
Помогите написать скрипт для проверки правильности ввода числа в строке DiSpalL JavaScript, Ajax 6 19.06.2009 16:48