IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

> TStringGrid, не пойму в чем ошибка
marwell
сообщение 24.02.2011 15:29
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

Репутация: -  1  +


доброго времени суток!
само задание звучит так: Указание: работу выполнить в Delphi, использовать элемент формы TStringGrid (панель Additional). Дана таблица целых чисел ai, bi. Заполнить третью и четвертую строки значениями НОД(ai, bi), НОК(ai, bi).
ai 1 3 4 8 …
bi 2 3 2 6 …
НОД(ai, bi) 1 3 2 2 …
НОК(ai, bi) 2 3 4 24 …

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
function NOD(A, B: longint): longint;
begin
  while (a <> 0) and (b <> 0) do
     if a >= b then
       a := a mod b
     else
       b := b mod a;
  NOD := a + b;
end;

function NOK(A, B: longint): longint;
begin
  NOK := a * b div NOD (a, b)
end;

procedure TForm1.Button1Click(Sender: TObject);
var i, j: Integer;
begin
  with StringGRid1 do
    for i:=0 to RowCount do   //Заголовки строк не трогаем
    for j:=1 to ColCount do   //Заголовки столбцов не трогаем
      Cells[j, i]:='';
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
with StringGrid1 do
begin
Cells[0,0]:='a[i]';
Cells[0,1]:='b[i]';
Cells[0,2]:='НОД(a[i],b[i])';
Cells[0,3]:='НОК(a[i],b[i])';
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i, j: Integer;
begin
with StringGrid1 do
begin
    j:=0;
    for i:=1 to ColCount do begin
    Cells[i,j+3]:=IntToStr(NOD(StrToInt(cells[i,j]),StrToInt(cells[i,j+1])));
    Cells[i,j+4]:=IntToStr(NOK(StrToInt(cells[i,j]),StrToInt(cells[i,j+1])));
end;
end;
end;

end.

после запуска, ввода значений и нажатия кнопки посчитать выдает ошибку "Project Projectl.exe raised exception class EConvertError with message'" Is not a valid integer value1. Process stopped. Use Step or Run to continue." Не пойму в чем дело.
и еще, не могли бы объяснить мне как сделать так чтобы количество столбцов в таблице можно было изменять во время работы


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 6)
TarasBer
сообщение 24.02.2011 16:00
Сообщение #2


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Ты пытаешься незаполненую (пустую) ячейку конвертировать в целое. А так нельзя.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 24.02.2011 16:02
Сообщение #3


Гость






Цитата
Не пойму в чем дело.

Цитата
    for i:=1 to ColCount do begin
Не понял, почему до ColCount, а не до ColCount - 1?

Цитата
не могли бы объяснить мне как сделать так чтобы количество столбцов в таблице можно было изменять во время работы
Положи на форму Edit, и ему на OnChange повесь:
procedure TForm1.Edit1Change(Sender: TObject);
begin
  StringGrid1.ColCount := StrToInt((Sender as TEdit).Text);
end;
(только, от греха, сразу же, как только положишь его на форму, измени ему Text, на 5, или сколько там у тебя столбцов в гриде в начале)
 К началу страницы 
+ Ответить 
marwell
сообщение 24.02.2011 16:12
Сообщение #4


Бывалый
***

Группа: Пользователи
Сообщений: 198
Пол: Мужской

Репутация: -  1  +


большое спасибо smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
sheka
сообщение 24.02.2011 16:24
Сообщение #5


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


В каких случаях в этой программе (Sender as TEdit).Text сделает то, чего Edit1.Text не сделает?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 24.02.2011 16:55
Сообщение #6


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> В каких случаях в этой программе (Sender as TEdit).Text сделает то, чего Edit1.Text не сделает?

Например, если ты другому полю ввода задашь тот же обработчик. Это очень удобно - задавать разным объектам, выполняющим одинаковую работу, одинаковый обработчик и узнавать через Sender, откуда пришло событие. Это освобождает от копирования однообразного кода.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
sheka
сообщение 24.02.2011 18:05
Сообщение #7


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


Точно! А я это всегда вручную делал..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 8.08.2025 3:40
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"