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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2012, 23:19   #1
apelsun
Пользователь
 
Регистрация: 03.05.2012
Сообщений: 24
По умолчанию StringGrid - рассчитывать суммы по столбцам и строкам вводимых чисел

Подскажите, в чем ошибка. Вроде я определила переменную Grid.

Использован компонент: StringGrid
Код:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids;
type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

const Num = 4;
cSize = 30;

{$R *.dfm}

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,  ARow: Integer; var CanSelect: Boolean);
var Select: Boolean;
begin
Caption := 'Выделена клетка (' + IntToStr(Acol) + ':' + IntToStr(Arow) + ') ';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
MyGrid.DefaultColWidth := cSize;
MyGrid.DefaultRowHeight := cSize;
MyGrid.ColCount := Num;
MyGrid.RowCount := Num;
MyGrid.Width := Num * (cSize + 1) + 3;
MyGrid.Height := Num * (cSize + 1) + 3;
MyGrid.Font.Size := cSize div 2;
end;
   end.

Последний раз редактировалось Stilet; 16.11.2012 в 00:01.
apelsun вне форума Ответить с цитированием
Старый 16.11.2012, 00:01   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Что компилятор говорит?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.11.2012, 00:03   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Наверно говорит, что MyGrid не известно что
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.11.2012, 00:14   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Если да то заменить его на StringGrid1
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.11.2012, 08:21   #5
apelsun
Пользователь
 
Регистрация: 03.05.2012
Сообщений: 24
По умолчанию

Заменила на StringGrid1 и ошибка исчезла, спасибо.
Программу написала, запускается, но не получается вызвать результат.

Цель работы - создать программу, рассчитывающую суммы по столбцам и строкам вводимых чисел. При запуске, я ввожу числа, но далее ничего не происходит.
Код:
unit Unit1;

interface

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

const Num = 4;
cSize = 30;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);  //Отоброжает выделенную строку в заголовке
begin
Caption:= 'Выделенная ячейка (' + IntToStr(Acol) + ':' + IntToStr(Arow) + ') ';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.DefaultColWidth:= cSize;
StringGrid1.DefaultRowHeight:= cSize;
StringGrid1.ColCount:= Num;
StringGrid1.RowCount:= Num;
StringGrid1.Width:= Num*(cSize+1)+3;
StringGrid1.Height:= Num*(cSize+1)+3;
StringGrid1.Font.Size:=cSize div 2;
end;

Function ColSum(n:integer): integer; //сумма по колонке
var
i: integer;
begin
Result:=0;
for i:=1 to Num-1 do Result:=Result+StrToInt(Form1.StringGrid1.Cells[n, i]);
end;

function RowSum(n: integer): integer;  //сумма по столбцу
var
i: integer;
begin
Result:=0;
for i:= 1 to Num-1 do Result:=Result+StrToInt(Form1.StringGrid1.Cells[i, n]);
end;

procedure Calculate;  
var i:integer;
begin
for i:=1 to Num-1 do
begin
Form1.StringGrid1.Cells[i, 0]:=IntToStr(ColSum(i));
Form1.StringGrid1.Cells[0, i]:=IntToStr(RowSum(i));
end;
end;

function StrToVal(s:string):integer;  //вывод ошибки, если введена буква
begin
if s='' then Result:=0 else
try
Result:= StrToInt(s);
except
Result:=0;
Form1.Caption:= 'вводить надо числа';
end;
end;

end.

Последний раз редактировалось apelsun; 16.11.2012 в 08:24.
apelsun вне форума Ответить с цитированием
Старый 16.11.2012, 09:20   #6
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Цитата:
Сообщение от apelsun Посмотреть сообщение
При запуске, я ввожу числа, но далее ничего не происходит.
А ничего и не будет происходить, Вам надо _вызывать_ ваши процедуры/функции и как-то отображать их результат.
Например, кнопочку, в обработчике клика которой вызвать Calculate.
phomm вне форума Ответить с цитированием
Старый 16.11.2012, 09:38   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

согласен с phomm.

если грид заполняете программно, то метод нужно вызывать в момент заполнения грида.

А если пользователю разрешено редактирвоать данные в гриде, то можно повесить вызов расчёта на какое-нибуд событие. Например, на событие присвоения текста ячейки: OnSetEditText
в принципе, туда сразу передаются значения столбца и строки, в которых произошло изменение, можно (для оптимизации быстродействия) пересчитывать итоги только по той строке и по тому столбцу, куда входит изменяемая ячейка. Остальные столбцы и строки не трогать!


p.s. кстати, если очень надо, могу набросать примерчик
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.11.2012, 09:42   #8
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Код:
try
Result:= StrToInt(s);
except
Result:=0;
Form1.Caption:= 'вводить надо числа';
end;
не проще
Код:
//var K:integer;
if not TryStrToInt(s,k) then Form1.Caption:= 'вводить надо числа';
Result:=k;
хотя вы все равно функцию StrToVal нигде не используете
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 16.11.2012, 09:50   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ладно. несложно. набросал наипростейший пример на основе кода автора топика..

Исходник: StringGridSumItogo.rar

EXEшник (для примера): Project3_EXE.rar

ну и код:
Код:
unit Unit2;

interface

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

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    procedure StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer;
      const Value: string);
    procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
    procedure FormCreate(Sender: TObject);
    function ColSum(n:integer): integer; //сумма по колонке
    function RowSum(n: integer): integer;  //сумма по столбцу
    procedure Calculate;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

const Num = 4;
cSize = 30;

{$R *.dfm}

procedure TForm1.Calculate;
var i:integer;
begin
for i:=1 to Num-1 do
 begin
   StringGrid1.Cells[i, 0]:=IntToStr(ColSum(i));
   StringGrid1.Cells[0, i]:=IntToStr(RowSum(i));
  end;
end;


function TForm1.ColSum(n: integer): integer;
var
i: integer;
begin
Result:=0;
for i:=1 to Num-1
    do Result:=Result+StrToIntDef(StringGrid1.Cells[n, i],0);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.DefaultColWidth:= cSize;
StringGrid1.DefaultRowHeight:= cSize;
StringGrid1.ColCount:= Num;
StringGrid1.RowCount:= Num;
StringGrid1.Width:= Num*(cSize+1)+3;
StringGrid1.Height:= Num*(cSize+1)+3;
StringGrid1.Font.Size:=cSize div 2;
end;

function TForm1.RowSum(n: integer): integer;
var
i: integer;
begin
Result:=0;
  for i:= 1 to Num-1
     do Result:=Result+StrToIntDef(StringGrid1.Cells[i, n],0);
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
  var CanSelect: Boolean);
begin
  Caption:= 'Выделенная ячейка (' + IntToStr(Acol) + ':' + IntToStr(Arow) + ') ';
end;






procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer;
  const Value: string);
begin
  Calculate
end;

end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.11.2012, 20:39   #10
apelsun
Пользователь
 
Регистрация: 03.05.2012
Сообщений: 24
По умолчанию

А можно сделать так, что бы результат выводился, при нажатии на самый левый заблокированный (пустой) квадрат, На фотографии я точнее отметила. Или расчет можно реализовать, если только нажимать на всю форму сразу?
Изображения
Тип файла: png 125.png (20.9 Кб, 100 просмотров)
apelsun вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
в двумерном массиве подсчитать суммы по строкам\столбцам. Proskurina Помощь студентам 4 08.09.2012 11:09
в двумерном массиве подсчитать суммы по строкам\столбцам. Proskurina Паскаль, Turbo Pascal, PascalABC.NET 5 08.09.2012 07:13
поиск суммы последовательных чисел, вводимых с клавиатуры, предшествующих первому введённому нулю aicer Помощь студентам 1 02.03.2011 22:29
вычисление суммы вводимых чисел ronny137 Помощь студентам 0 07.12.2010 22:16
Массив чисел надо упорядочить по неубыванию по строкам и столбцам. alecsande426 Помощь студентам 0 07.11.2009 19:36