|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Range check error и указатели
Хай всем. Помогите разобраться.
Пытаюсь воссоздать цветовые эффекты, которые описаны в статьеhttp://www.delphimaster.ru/articles/grad/index.html сам код Код:
procedure TForm1.FormPaint(sender:TObject); type TRGB=record b,g,r:byte; end; ARGB=array [0..1] of TRGB; PARGB=^ARGB; var b:TBitMap; p:PARGB; x,y:integer; begin b:=TBitMap.Create; b.pixelformat:=pf24bit; b.width:=Clientwidth; b.height:=Clientheight; for y:=0 to b.height-1 do begin p:=b.scanline[y]; for x:=0 to b.width-1 do begin p[x].r:=random(256); p[x].g:=random(256); p[x].b:=random(256); end; end; canvas.draw(0,0,b); b.free; end; И на строчке Код:
p[x].r:=random(256); Прошелся дебагером и определил что при x=0 и 1 все норм работает(как и должно быть, т.к. двумерный массив). Так вот вопрос, почему при x>1 возникает ошибка (хотя мне кажется что так и должно быть) и как мне сделать, чтобы код заработал. Заранее спасибо. p.s. среда delphi 2010 аналогичный код видел и на других форумах и он вроде как д.б. рабочим Последний раз редактировалось ildvild, 10.02.2013 в 20:12. |
#2
|
|||
|
|||
Потому что, когда копируешь исходники из интернета, надо быть внимательнее. Первая же ссылка в гугле по примеру использования scanline дает (http://edn.embarcadero.com/article/29173):
Код:
type TRGB32 = packed record B, G, R, A: Byte; end; TRGB32Array = packed array[0..MaxInt div SizeOf(TRGB32)-1] of TRGB32; PRGB32Array = ^TRGB32Array; Тут используется 32-битный пиксель (с прозрачностью), но это не принципиально. Смотри на описание типа массива. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
ildvild (10.02.2013)
|