![]() |
|
|
|
|
#1
|
||||
|
||||
|
При запуске выскакивает acces violation at adress .... at module
Вот код: Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Mas:array[0..19,0..19,0..1] of Integer;
zemlya:array[0..4] of TBitmap;
obekti:array[1..4] of TBitmap;
i,j,k : Integer;
Buf : TBitmap;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Randomize;
for i:=0 to 19 do
for j:=0 to 19 do
for k:=0 to 1 do
Mas[i,j,k]:=random(5);
for i:=0 to 4 do
begin
zemlya[i]:=TBitmap.Create;
zemlya[i].LoadFromFile('E:\MMM\image\zemlya\'+inttostr(i)+'.bmp');
end;
for i:=1 to 4 do
begin
obekti[i]:=TBitmap.Create;
obekti[i].Transparent:=true;
obekti[i].LoadFromFile('E:\MMM\image\obekti\'+inttostr(i)+'.bmp');
end;
for i:=0 to 4 do
begin
zemlya[i]:=TBitmap.Create;
zemlya[i].Width:=32;
zemlya[i].Height:=32;
zemlya[i].LoadFromFile('E:\MMM\image\zemlya\'+inttostr(i)+'.bmp');
end;
for i:=1 to 4 do
begin
obekti[i]:=TBitmap.Create;
obekti[i].Transparent:=true;
obekti[i].Width:=32;
obekti[i].Height:=32;
obekti[i].LoadFromFile('E:\MMM\image\obekti\'+inttostr(i)+'.bmp');
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
for i:=0 to 19 do
for j:=0 to 19 do
Buf.Canvas.Draw(i*32,j*32, zemlya[ Mas[I,j,0] ] );
for i:=0 to 19 do
for j:=0 to 19 do
Buf.Canvas.Draw(i*32,j*32, obekti[ Mas[I,j,1] ] );
Form1.Canvas.Draw(0,0,Buf);
end;
end. |
|
#2
|
||||
|
||||
|
У вас значение Mas генерится в диапазоне от 0 до 4, а границы массива obekti в диапазоне от 1 до 4. Вот и получается обращение к несуществующему элементу массива.
|
|
#3
|
||||
|
||||
|
исправил все 1 на 0.но та же ошибка!помогите пожалусто
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Buttons;
type
TForm1 = class(TForm)
Timer1: TTimer;
SpeedButton1: TSpeedButton;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Mas:array[0..19,0..19,0..1] of Integer;
zemlya:array[0..4] of TBitmap;
obekti:array[0..4] of TBitmap;
i,j,k : Integer;
Buf : TBitmap;
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
begin
for i:=0 to 19 do
for j:=0 to 19 do
Buf.Canvas.Draw(i*32,j*32, zemlya[ Mas[I,j,0] ] );
for i:=0 to 19 do
for j:=0 to 19 do
Buf.Canvas.Draw(i*32,j*32, obekti[ Mas[I,j,1] ] );
Form1.Canvas.Draw(0,0,Buf);
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
Randomize;
for i:=0 to 19 do
for j:=0 to 19 do
for k:=0 to 1 do
Mas[i,j,k]:=random(5);
for i:=0 to 4 do
begin
zemlya[i]:=TBitmap.Create;
zemlya[i].LoadFromFile('E:\MMM\image\zemlya\'+inttostr(i)+'.bmp');
end;
for i:=0 to 4 do
begin
obekti[i]:=TBitmap.Create;
obekti[i].Transparent:=true;
obekti[i].LoadFromFile('E:\MMM\image\obekti\'+inttostr(i)+'.bmp');
end;
for i:=0 to 4 do
begin
zemlya[i]:=TBitmap.Create;
zemlya[i].Width:=32;
zemlya[i].Height:=32;
zemlya[i].LoadFromFile('E:\MMM\image\zemlya\'+inttostr(i)+'.bmp');
end;
for i:=0 to 4 do
begin
obekti[i]:=TBitmap.Create;
obekti[i].Transparent:=true;
obekti[i].Width:=32;
obekti[i].Height:=32;
obekti[i].LoadFromFile('E:\MMM\image\obekti\'+inttostr(i)+'.bmp');
end;
end;
end. |
|
#4
|
||||
|
||||
|
Вы два раза массив obekti создаёте, уберите повторное TBitmap.Create
|
|
#5
|
||||
|
||||
|
исправил таймер(запуск по нажатию на клавишу) и убрал повторные заполнения,но та же ошибка
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Buttons;
type
TForm1 = class(TForm)
Timer1: TTimer;
SpeedButton1: TSpeedButton;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Mas:array[0..19,0..19,0..1] of Integer;
zemlya:array[0..4] of TBitmap;
obekti:array[0..4] of TBitmap;
i,j,k : Integer;
Buf : TBitmap;
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
begin
for i:=0 to 19 do
for j:=0 to 19 do
Buf.Canvas.Draw(i*32,j*32, zemlya[ Mas[I,j,0] ] );
for i:=0 to 19 do
for j:=0 to 19 do
Buf.Canvas.Draw(i*32,j*32, obekti[ Mas[I,j,1] ] );
Form1.Canvas.Draw(0,0,Buf);
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
Timer1.Enabled:=True;
Randomize;
for i:=0 to 19 do
for j:=0 to 19 do
for k:=0 to 1 do
Mas[i,j,k]:=random(5);
for i:=0 to 4 do
begin
zemlya[i]:=TBitmap.Create;
zemlya[i].Width:=32;
zemlya[i].Height:=32;
zemlya[i].LoadFromFile('E:\MMM\image\zemlya\'+inttostr(i)+'.bmp');
end;
for i:=0 to 4 do
begin
obekti[i]:=TBitmap.Create;
obekti[i].Width:=32;
obekti[i].Height:=32;
obekti[i].Transparent:=true;
obekti[i].LoadFromFile('E:\MMM\image\obekti\'+inttostr(i)+'.bmp');
end;
end;
end. |
|
#6
|
||||
|
||||
|
Заполнение вероятно должно быть таким
Код:
...
for i := 0 to 4 do
begin
zemlya[i]:=TBitmap.Create;
zemlya[i].Width:=32;
zemlya[i].Height:=32;
zemlya[i].LoadFromFile('E:\MMM\image\zemlya\'+inttostr(i)+'.bmp');
obekti[i]:=TBitmap.Create;
obekti[i].Transparent:=true;
obekti[i].Width:=32;
obekti[i].Height:=32;
obekti[i].LoadFromFile('E:\MMM\image\obekti\'+inttostr(i)+'.bmp');
end; |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
hsMapk (05.05.2014)
| ||
|
#7
|
||||
|
||||
|
Mas[i,j,k]:=random(5); здесь
|
|
#8
|
||||
|
||||
|
всмысле?можно поподробнее?
|
|
#9
|
||||
|
||||
|
А таймер вы когда запускаете? Прямо при старте программы?
|
|
#10
|
||||
|
||||
|
всё равно ошибка.чтож такое
|