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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2015, 17:14   #1
VirJag
Новичок
Джуниор
 
Регистрация: 25.12.2015
Сообщений: 6
Печаль Проверка дипазона ячеек в строке StringGrid

Пытаюсь сделать проверку ячеек с 1 по 5 в строке(показал на скриншоте), делфи пишет ошибку. В procedure TForm2.Button1Click доходит до then и пишет ошибку. В чём проблема, что ни так? вот код. извиняюсь за дуратский вопрос, только начинаю программировать.
Код:
unit Unit2;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, Menus, StdCtrls, Printers, ComObj ;
 
type
 
  TForm2 = class(TForm)
    StringGrid1: TStringGrid;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    Button1: TButton;
    Button2: TButton;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    PrintDialog1: TPrintDialog;
    PrinterSetupDialog1: TPrinterSetupDialog;
    Button3: TButton;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
    procedure Button1Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure N6Click(Sender: TObject);
 
  private
    { Private declarations }
 
  public
    { Public declarations }
    procedure sms1;
    procedure sms2;
    procedure Vichislenia2;
  end;
 
var
  Form2: TForm2; f: Textfile; a, b, c, d, e, x: real; n, i, j: integer; q: byte;
 
implementation
 
{$R *.dfm}
 
procedure TForm2.sms1;
begin
Label1.caption:='Введите значения.';
Label1.Font.Color:=clBlack;
end;
 
procedure TForm2.sms2; //сообщение об ошибке
begin
Label1.caption:='Ошибка!'+#13#10+'Введите все значения.';
Label1.Font.Color:=clRed;
end;
 
procedure TForm2.Vichislenia2; //процедуры вычисления
begin
for i:=1 To StringGrid1.RowCount-1 Do
  begin
  a:=StrToFloat (StringGrid1.Cells [1,i]);  //P 1
  b:=StrToFloat (StringGrid1.Cells [2,i]);  // P2
  c:=StrToFloat (StringGrid1.Cells [3,i]);  // P ca1
  d:=StrToFloat (StringGrid1.Cells [4,i]);  // P ca2
  e:=StrToFloat (StringGrid1.Cells [5,i]);  // P
  if b>a then
   begin
    if d-c = 0 then
      begin
        Label1.caption:='Ошибка! Произошло деление на 0';
        Label1.Font.Color:=clRed;
      end
     else
     begin
      x := a+((b-a)/(d-c))*(e-a);
      StringGrid1.Cells [6,i]:=FloatToStr (x);
      Label1.caption:='Выполнено!';
      Label1.Font.Color:=clGreen;
     end;
    end;
  end;
end;
 
procedure TForm2.FormCreate(Sender: TObject);
begin
  sms1;
  n:=0;  
  with StringGrid1 do
  begin
   Cells[1,0]:=('P 1');
   Cells[2,0]:=('P 2');
   Cells[3,0]:=('P ca1');
   Cells[4,0]:=('P ca2');
   Cells[5,0]:=('P');
   Cells[6,0]:=('P ГЈГ°');
  end;
end;
 
procedure TForm2.StringGrid1KeyPress(Sender: TObject; var Key: Char); //проверка на вводимые символы
begin
j:=(sender as TStringGrid).Col;
i:=(sender as TStringGrid).Row; 
if Key = '.' then
  Key := DecimalSeparator;
if Key = '.' then
  Key := DecimalSeparator;
if not (Key in ['0'..'9','-',DecimalSeparator,#8,#13]) or ((Key = DecimalSeparator)
  and (POS (DecimalSeparator, (sender as TStringGrid).Cells[j,i])> 0))
  or((key='-')and(Pos('-',(sender as TStringGrid).Cells[j,i])>0))
  then
    begin
      Key := #0; 
      MessageBeep (MB_OK);
    end;
end;
 
procedure TForm2.Button2Click(Sender: TObject); //проверка ячеек в строках 
begin
  with StringGRid1 do
    for i:=1 to RowCount-1 do  
    for j:=1 to ColCount-1 do  
    Cells[j, i]:='';
    sms1;
end;
 
procedure TForm2.Button3Click(Sender: TObject);  //добавление строк
begin
n:=n+1;
with StringGrid1 do
  begin
    RowCount:=RowCount+1; 
    for q:=0 to 6 do
    Cells[0,n]:= IntToStr(n);
  end;
end;
 
procedure TForm2.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean); //запрет на выделение последней ячейки последнего столбца
begin
if (ACol=StringGrid1.ColCount-1) then
  CanSelect:=False;  
end;
 
procedure TForm2.Button1Click(Sender: TObject); //процедура проверки на заполненность ячеек в строке с последующим вычислением
begin
for i:=1 to n do
for j:=1 to 6 do
begin
if StringGrid1.Cells[i,j]:=''
then
  begin
    sms2;
    break
  end;
end;
  Vichislenia2;
end;
 
end.
Изображения
Тип файла: jpg Screenshot_2.jpg (49.0 Кб, 81 просмотров)

Последний раз редактировалось VirJag; 25.12.2015 в 17:20.
VirJag вне форума Ответить с цитированием
Старый 25.12.2015, 18:32   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
доходит до then и пишет ошибку.
текст ошибки читал?
там было написано, что оператор сравнения - это не ":=", а "="?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 25.12.2015, 21:40   #3
VirJag
Новичок
Джуниор
 
Регистрация: 25.12.2015
Сообщений: 6
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
текст ошибки читал?
там было написано, что оператор сравнения - это не ":=", а "="?
спасибо. переписал код, компилятор не ругается но программа кидает ошибку о том что в вычисления попадает пустая ячейка. не могу понять где нарушается логика. i - строка, j - столбец. начинается цикл 1 по первой строке, в нём второй цикл проверяет все столбцы с 1 по 5 цикл кончается. первый цикл переходит на вторую строку и проверяет столбцы и так n раз. или я что то путаю?
Код:
procedure TForm2.Button1Click(Sender: TObject); 
begin
for i:=1 to n do
for j:=1 to 5 do
  if StringGrid1.Cells[j,i]='' then
    begin
      sms2;
      exit;
    end; 
  Vichislenia2
end;
VirJag вне форума Ответить с цитированием
Старый 25.12.2015, 21:44   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

n чему равно?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 25.12.2015, 21:50   #5
VirJag
Новичок
Джуниор
 
Регистрация: 25.12.2015
Сообщений: 6
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
n чему равно?
при создании формы n=0 а потом оно может меняться в зависимости от того сколько строк создаст пользователь
VirJag вне форума Ответить с цитированием
Старый 25.12.2015, 21:55   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
при создании формы n=0 а потом оно может меняться в зависимости от того сколько строк создаст пользователь
выбрось эту переменную. Юзай RowCount.
выбрось вообще все глобальные переменные. иначе я тебя отшлёпаю, маленький извращенец!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 25.12.2015, 22:01   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

надо в отладчике посмотреть.
если n равно числу строки, может быть, надо цикл до n-1:
Код:
for i:=1 to n-1 do
for j:=1 to 5 do
  if StringGrid1.Cells[j,i]='' then
....
ну и ещё, а кто Вам мешает в процедуру Вывода ошибки передать i и j и вывести пользователю, какая именно ячейка (строка/столбец) у него не заполнена?


Цитата:
выбрось эту переменную. Юзай RowCount.
Это отличное решение! Согласен!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.12.2015, 22:12   #8
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Это отличное решение! Согласен!
не понял? а на счёт извращенца - не согласен, штоли??!!11
Ты посмотри, сколько глобальных переменных!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 25.12.2015, 22:16   #9
VirJag
Новичок
Джуниор
 
Регистрация: 25.12.2015
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
надо в отладчике посмотреть.
если n равно числу строки, может быть, надо цикл до n-1:
Код:
for i:=1 to n-1 do
for j:=1 to 5 do
  if StringGrid1.Cells[j,i]='' then
....
ну и ещё, а кто Вам мешает в процедуру Вывода ошибки передать i и j и вывести пользователю, какая именно ячейка (строка/столбец) у него не заполнена?



Это отличное решение! Согласен!
есть у меня другой вариант только он проверяет все колонки в строке, а как сделать что бы он проверял с 1 по 5 колонку только
Код:
var
  i, j: integer;
  ErrorFlag: boolean;
  tmpVal: double;
  CurFormatSet1, CurFormatSet2: TFormatSettings;
begin
    ErrorFlag := false;    
    for j := StringGrid1.FixedCols to StringGrid1.ColCount - 1 do 
    begin
      if not(TryStrToFloat(StringGrid1.Cells[j, i], tmpVal, CurFormatSet1) or  
        TryStrToFloat(StringGrid1.Cells[j, i], tmpVal, CurFormatSet2)) then
      begin
        ErrorFlag := true;
        break;
      end;
    end;
    if ErrorFlag then  
    begin
      ShowMessage(Format('Ошибка в столбце %d строке %d!', [j, i]));
      exit;
    end;
  end;
  ShowMessage('Данные введены правильно!');
end;
VirJag вне форума Ответить с цитированием
Старый 25.12.2015, 22:21   #10
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
а как сделать что бы он проверял с 1 по 5 колонку только
какой критерий проверки? что в ячейке является правильным содержимым?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка на заполнение ячеек в строке Uralmaster Microsoft Office Excel 3 10.02.2013 14:24
Проверка символов в строке Lauri Общие вопросы Delphi 2 17.03.2012 23:11
Проверка ячеек segail Microsoft Office Excel 4 06.12.2009 21:45
Объединение ячеек в строке slon_slon Microsoft Office Word 6 14.03.2009 23:08