Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.12.2011, 01:48
defend defend вне форума
Прохожий
 
Регистрация: 15.12.2011
Сообщения: 10
Репутация: 10
По умолчанию Решение проблемы с кодом

Помогите решить проблему, задача такая, нужно вводить количество строк, и столбцов с клавиатуры, и заполнить таблицу стринггрид тоже с клавиатуры и найти максимальный элемент...но проблема в том, что программа выдаёт ошибку raised exception class eaccessviolation и выделяет edt1.Text:=IntToStr(A[imax,jmax]); Помогите решить проблему.

Код:
unit Unit_masiv;

interface

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

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


var
  Form1: TForm1;
  A: array of array of integer;
  m, n: integer;
  imax, jmax: integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

Var
i, j: integer;

begin

imax:=0;
jmax:=0;
For i:=0 to High(A) do
For j:=0 to High(A) do
if A[i,j] > A[imax,jmax] then  begin
imax:=i;
jmax:=j;
end;
edt1.Text:=IntToStr(A[imax,jmax]);



end;

procedure TForm1.Button2Click(Sender: TObject);

Var
i, j: integer;

begin

if (Edit1.Text<>'') and (Edit2.Text<>'')
then
begin
n:=StrToInt(Edit1.Text);
m:=StrToInt(Edit2.Text);
for j:=0 to m do
for i:=0 to n do
if
Length(StringGrid1.Cells[i, j]) <>0
then
A[i,j]:=StrToInt(StringGrid1.Cells[i,j]);
StringGrid1.RowCount:=n;
StringGrid1.ColCount:=m;
end
else Showmessage('Ievadit masiva dimensiju.');


end;

end.
Ответить с цитированием
  #2  
Старый 15.12.2011, 01:59
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

А чего же ты хочешь? При пустом поле так и будет. Закрывай в:
Код:
try
except
end
Ээ, приврал. Недосмотрел, что не из StringGrid-а, а из неинициализированного массива.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 15.12.2011 в 02:30.
Ответить с цитированием
  #3  
Старый 15.12.2011, 02:14
defend defend вне форума
Прохожий
 
Регистрация: 15.12.2011
Сообщения: 10
Репутация: 10
По умолчанию

я плохо разбираюсь в этом...то есть мне нужно сделать так..
Код:
try
   edt1.Text:=IntToStr(A[imax,jmax]);
except
End; 

Последний раз редактировалось lmikle, 15.12.2011 в 02:38.
Ответить с цитированием
  #4  
Старый 15.12.2011, 02:21
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Код:
A: array of array of integer;
А где инициализация массива (SetLength)? Обращаешься неизвестно куда, вот и ошибка.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 15.12.2011 в 02:28.
Ответить с цитированием
  #5  
Старый 15.12.2011, 02:40
lmikle lmikle сейчас на форуме
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,050
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вот писал получение матрицы из StringGrid:
Код:
function TMainForm5.GetMatrix : Boolean;
var
  I, J : Integer;
begin
  Result := True;

  SetLength(A,sgMatrix.ColCount);
  For I := Low(A) To High(A) Do
    Begin
      SetLength(A[i],sgMatrix.RowCount);
      For J := Low(A[i]) To High(A[i]) Do
        If Not TryStrToInt(sgMatrix.Cells[I,J],A[I,J]) Then
          Begin
            ShowMessage(Format('Error: Can''t convert value in cell %d,%d to integer.',[I+1,J+1]));
            sgMatrix.SetFocus;
            Result := False;
            Exit;
          End;
    End;
end;

Переделаешь под себя, заместо сообщения и вылета можно, например, 0 подставлять.
Ответить с цитированием
  #6  
Старый 15.12.2011, 15:41
defend defend вне форума
Прохожий
 
Регистрация: 15.12.2011
Сообщения: 10
Репутация: 10
По умолчанию

Спасибо помогло!.
Ответить с цитированием
  #7  
Старый 15.12.2011, 16:39
defend defend вне форума
Прохожий
 
Регистрация: 15.12.2011
Сообщения: 10
Репутация: 10
По умолчанию

не подскажите что нужно изменить в данном коде, чтобы числа вводились не случайно а с клавиатуры?

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    StringGrid: TStringGrid;
    Button2: TButton;
    Edit3: TEdit;
    Edit4: TEdit;
    Label3: TLabel;
    Label4: TLabel;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  A: array of array of integer;
  m, n: integer;
  imax, jmax, imin, jmin: integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
Var
i, j: integer;
begin
if (Edit1.Text<>'') and (Edit2.Text<>'') then begin
Randomize;
n:=StrToInt(Edit1.Text);
m:=StrToInt(Edit2.Text);
SetLength(A,n,m);
for j:=0 to m-1 do
for i:=0 to n-1 do
begin
A[i,j]:=Round(Sin(Random(100))*100);
end;
StringGrid.RowCount:=n+1;
StringGrid.ColCount:=m+1;
with StringGrid do
begin
for i:=1 to RowCount do
begin
Cells[i,0]:=IntToStr(i);
end;
for j:=1 to ColCount do
begin
Cells[0,j]:=IntToStr(j);
end;
end;
with StringGrid do
begin
for i:=1 to n do
for j:=1 to m do
Cells[j,i]:=IntToStr(A[i-1,j-1]);
end;
end
else Showmessage('Введите размерность массива.');
end;

procedure TForm1.Button2Click(Sender: TObject);
Var
i, j: integer;
begin
imax:=0;
jmax:=0;
imin:=0;
jmin:=0;
For i:=0 to High(A) do
For j:=0 to High(A) do
if A[i,j] > A[imax,jmax] then begin
imax:=i;
jmax:=j;
end;
For i:=0 to High(A) do
For j:=0 to High(A) do
if A[i,j] < A[imin,jmin] then begin
imin:=i;
jmin:=j;
end;
Edit3.Text:=IntToStr(A[imax,jmax])+'  индексы  ['+IntToStr(imax+1)+','+IntToStr(jmax+1)+']';
Edit4.Text:=IntToStr(A[imin,jmin])+'  индексы  ['+IntToStr(imin+1)+','+IntToStr(jmin+1)+']';
end;

procedure TForm1.Button3Click(Sender: TObject);
Var
i, j, p: integer;
begin
p:=A[imax,jmax];
A[imax,jmax]:=A[imin,jmin];
A[imin,jmin]:=p;
with StringGrid do
begin
for i:=1 to n do
for j:=1 to m do
Cells[j,i]:=IntToStr(A[i-1,j-1]);
end;
end;

end.



Ответить с цитированием
  #8  
Старый 15.12.2011, 17:38
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Много чего надо изменить, но самое главное это включить для StringGrida опцию goEditing в True.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #9  
Старый 15.12.2011, 17:46
defend defend вне форума
Прохожий
 
Регистрация: 15.12.2011
Сообщения: 10
Репутация: 10
По умолчанию

я включил опцию goEditing, и изменил код....но теперь выдаёт ошибку EConvertError при нажатие на Button1

Код:
unit Unit_masiv;

interface

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

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

var
  Form1: TForm1;
  A : array of array of integer;
  m, n: integer;
  imax, jmax, imin, jmin: integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
Var
i, j: integer;
begin
SetLength(A,n,m);
for j:=0 to m-1 do
for i:=0 to n-1 do
begin
A[i,j]:=StrToInt(StringGrid1.Cells[j,i]);
end;

imax:=0;
jmax:=0;
For i:=0 to High(A) do
For j:=0 to High(A) do
if A[i,j] > A[imax,jmax] then begin
imax:=i;
jmax:=j;
end;

edt1.Text:='Skaitlis: '+IntToStr(A[imax,jmax])+'  Indeks:  ['+IntToStr(imax+1)+','+IntToStr(jmax+1)+']';

end;


procedure TForm1.Button2Click(Sender: TObject);
Var
i, j: integer;
begin
if (Edit1.Text<>'') and (Edit2.Text<>'') then
begin
n:=StrToInt(Edit1.Text);
m:=StrToInt(Edit2.Text);
StringGrid1.RowCount:=n+1;
StringGrid1.ColCount:=m+1;
with StringGrid1 do
begin
for i:=1 to RowCount do
begin
Cells[i,0]:=IntToStr(i);
end;
for j:=1 to ColCount do
begin
Cells[0,j]:=IntToStr(j);
end;
end;

end
else edt1.Text:='Error!!! Ievadit dimensiju!';

end;


end.
Ответить с цитированием
  #10  
Старый 15.12.2011, 18:18
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

У вас видимо ошибка преобразования текста в число, поэтому лучше использовать StrToIntDef вместо StrToInt
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #11  
Старый 15.12.2011, 18:29
defend defend вне форума
Прохожий
 
Регистрация: 15.12.2011
Сообщения: 10
Репутация: 10
По умолчанию

Не помогло пишет ошибку

[Error] Unit_masiv.pas(43): Not enough actual parameters
[Fatal Error] Project_masiv.dpr(5): Could not compile used unit 'Unit_masiv.pas'

и выделяет строчку

A[i,j]:=StrToIntDef(StringGrid1.Cells[i,j]);
Ответить с цитированием
  #12  
Старый 15.12.2011, 18:38
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Там предполагается вторым параметром значение по умолчанию, если произойдет ошибка преобразования:
Код:
A[i,j]:=StrToIntDef(StringGrid1.Cells[i,j], 0);
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #13  
Старый 15.12.2011, 18:48
defend defend вне форума
Прохожий
 
Регистрация: 15.12.2011
Сообщения: 10
Репутация: 10
По умолчанию

Спасибо огромное, помогло работает!!! :-)
Ответить с цитированием
  #14  
Старый 15.12.2011, 18:58
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Все-таки проблема была в этой строке A[i,j]:=StrToIntDef(StringGrid1.Cells[i,j]); там нужно написать A[i,j]:=StrToIntDef(StringGrid1.Cells[i+1,j+1]);
ведь в ячейке[0,0] пусто.
Вот я накатал пример (нечем заняться)
Вложения
Тип файла: rar primer.rar (196.4 Кбайт, 2 просмотров)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:02.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter