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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.09.2010, 18:08   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Вопрос Не работает цикл проверки на наличие неверных символов

Не работает почему-то цикл на проверку букв в столбце. Мне нужно: сделать цикл проверки столбца, в котором только цифры, на наличие вдруг в этом столбе букв. Делаю такой цикл:
Код:
procedure TForm1.Button10Click(Sender: TObject);
var
 j,k,c: integer;
begin
 for c:=1 to Form1.RzStringGrid2.RowCount - 1 do
 begin
  if Form1.RzStringGrid2.Cells[1,c] = 'a' then
  begin
   ShowMessage(' Обнаружен неверный символ! ');
  end;
 end;
end;
Этот цикл правильно работает для цифр. В связи с этим 2 вопроса:
1. Как сделать, чтобы проверка шла по столбцу и если будет обнаружена буква, русская или английская любая, то выдалось сообщение?
2. Будет ли сделанный цикл работать, если у меня в колонке содержится в ячейках по несколько цифр, например, 384а73? Если такое встречается, то должно выдаться соответствующее сообщение.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 14.09.2010, 18:17   #2
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

А может сделать так?
Код:
var i: integer;
try
i:= StrToInt(Form1.RzStringGrid2.Cells[1,c]);
except
 ShowMessage(' Это не число! ');
end;
_SERGEYX_ вне форума Ответить с цитированием
Старый 14.09.2010, 18:23   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Спасибо! . С этим разобрались. Можно ли сделать, чтобы ячейки в которых были найдены неверные символы как-то помечались цветом?
Сейчас получился такой код (если кому надо):
Код:
procedure TForm1.Button10Click(Sender: TObject);
var
 k,c: integer;
begin
 try
 for c:=1 to Form1.RzStringGrid2.RowCount - 1 do
  k:=StrToInt(Form1.RzStringGrid2.Cells[1,c]);
 except
  on EConvertError do
  begin
   ShowMessage(' Обнаружен неверный символ! ');
  end;
 end;
end;
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 14.09.2010, 18:54   #4
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Можно поместить код в обработчик прорисовки
Код:
procedure TForm1.RzStringGrid2DrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
var
 c, q: integer;
 k: double;
begin
  //для первого и непустого столбца
  if (ACol <> 1) or (RzStringGrid2.Cells[ACol, ARow] = '') then exit;
  val(RzStringGrid2.Cells[1, ARow], k, q);
  RzStringGrid2.canvas.brush.Color := clWhite;
  if q <> 0 then begin
    RzStringGrid2.Canvas.Brush.color := clRed;
    RzStringGrid2.canvas.fillRect(Rect);
    RzStringGrid2.canvas.TextOut(Rect.Left,Rect.Top,RzStringGrid2.Cells[ACol,ARow]);
  end
end;
eoln вне форума Ответить с цитированием
Старый 14.09.2010, 19:02   #5
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Спасибо! А можешь пояснить это:
Код:
val(RzStringGrid2.Cells[1, ARow], k, q);
и почему-то он у меня в первой колонке выделяет фиксированную ячейку. Как убрать? И тако вопрос: можно ли этот код поместить не в событие DrawCell, а например в ту же кнопку, где проходит проверка на буквы как в посте №3?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 14.09.2010, 19:08   #6
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Цитата:
if Form1.RzStringGrid2.Cells[1,c] = 'a' then
Это же не проверка есть ли в строке такой символ, а проверка равна ли заданной строке содержимое ячейки...
Проверка наличия символа будет так: "If Pos('a', Form1.RzStringGrid2.Cells[1, c])<>0 Then"...

Ну а так-то если только на ввод правильных чисел проверять, то пойдёт и try/except...

Цитата:
можно ли этот код поместить не в событие DrawCell, а например в ту же кнопку, где проходит проверка на буквы как в посте №3?
Для обычного StringGrid1 вроде никак... А возможностей RzStringGrid2 не знаю, не видел такого...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 14.09.2010, 19:18   #7
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

Вот этот код помещаеш в DrawCell:

Код:
procedure TForm1.RzStringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  with RzStringGrid2 do
  begin
    Canvas.Font.Color := clBlack;
    if Integer(Objects[ACol, ARow]) = 0 then
      Canvas.Brush.Color := clWindow;
    if Integer(Objects[ACol, ARow]) = 1 then
      Canvas.Brush.Color := clRed;
    Canvas.FillRect(Rect);
    Canvas.TextOut(Rect.Left + 5, Rect.Top + 5, Cells[ACol, ARow]);
  end;
end;
Потом можно написать так:

Код:
procedure TForm1.Button10Click(Sender: TObject);
var
 j,k,c: integer;
begin
 for c:=1 to RzStringGrid2.RowCount - 1 do
 begin
  if RzStringGrid2.Cells[1,c] = 'a' then
  begin
   ShowMessage(' Обнаружен неверный символ! ');
   RzStringGrid2.Objects[1, с] := TObject(1); // выделение ячейкм красным цветом
  end;
 end;
end;
А вообще в стринггриде столбцы и строки нумеруются начиная с 0, может поэтому цикл и не работает.

Попробуй так:

Код:
procedure TForm1.Button10Click(Sender: TObject);
var
  I: integer;
begin
  for I := 0 to RzStringGrid2.RowCount do
  begin
    if RzStringGrid2.Cells[1, I] = 'a' then
    begin
      ShowMessage(' Обнаружен неверный символ! ');
      RzStringGrid2.Objects[0, I] := TObject(1); // выделение ячейкм красным цветом
    end;
   end;
end;
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли
Marsel737 вне форума Ответить с цитированием
Старый 14.09.2010, 19:27   #8
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Да хотя ладно, не надо заморачиваться с вызовом процедуры, код работает нормально вроде после того, как в грид данные грузятся. Вы мне скажите где подправить в коде, чтобы фиксированная ячейка не закрашивалась? Я про этот код:
Цитата:
procedure TForm1.RzStringGrid2DrawCell(Sender : TObject; ACol,
ARow: Integer; Rect: TRect; State: TGridDrawState);
var
c, q: integer;
k: double;
begin
//для первого и непустого столбца
if (ACol <> 1) or (RzStringGrid2.Cells[ACol, ARow] = '') then exit;
val(RzStringGrid2.Cells[1, ARow], k, q);
RzStringGrid2.canvas.brush.Color := clWhite;
if q <> 0 then begin
RzStringGrid2.Canvas.Brush.color := clRed;
RzStringGrid2.canvas.fillRect(Rect) ;
RzStringGrid2.canvas.TextOut(Rect.L eft,Rect.Top,RzStringGrid2.Cells[ACol,ARow]);
end
end;
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 14.09.2010, 19:36   #9
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Код:
val(RzStringGrid2.Cells[1, ARow], k, q);
Это старая процедура ещё со времён паскаля, переводит из строки (1 параметр) в число (2 параметр), в случае невозможности перевода генерирует число отличное от нуля (3 параметр)

Чтобы нулевая строка не выделялась, надо чуть изменить условие
Код:
if (ACol <> 1) or (ARow < 1) or (RzStringGrid2.Cells[ACol, ARow] = '') then exit;
eoln вне форума Ответить с цитированием
Старый 14.09.2010, 19:52   #10
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Спасибо, что пояснили. А вот почему-то пытаюсь сделать тоже самое для второй колонки, что бы ошибочные ячейки выделялись зеленым цветом. Вроде заменил номер колонки, а закрашивания не происходит:
Код:
  if (ACol2 <> 1) or (ARow2 < 1) or (RzStringGrid2.Cells[ACol2, ARow2] = '') then exit;
  val(RzStringGrid2.Cells[2, ARow2], k2, q2);
  RzStringGrid2.canvas.brush.Color := clWhite;
  if q2 <> 0 then begin
    RzStringGrid2.Canvas.Brush.color := clGreen;
    RzStringGrid2.canvas.fillRect(Rect);
    RzStringGrid2.canvas.TextOut(Rect.Left,Rect.Top,RzStringGrid2.Cells[ACol2,ARow2]);
  end;
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа проверки вывода символов и цвета на принтер Absolut Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 13.09.2010 12:43
Проверить наличие eng символов? alco84 Microsoft Office Access 4 08.04.2010 11:08
программа нахождения и проверки символов/строк MixanMM Общие вопросы Delphi 14 09.07.2009 08:44
Не работает функция проверки подстроки в строке Cold_Night Помощь студентам 1 25.03.2009 01:30
Код проверки столкновений не работает. Манжосов Денис :) Общие вопросы Delphi 8 02.02.2009 10:31