StretchDiBits i ScanLine

0

Witam, to mój pierwszy post na forum 4programmers, próbuję napisać własną klasę typu Canvas, tyle że na bazie dostępu do tablicy z pikselami w taki sposób jak do TBitmap za pomocą ScanLine.

procedure TForm1.Button1Click(Sender: TObject);
var
  bi: tagBITMAPINFO;
  a: array [0..200] of array [0..200] of LongWord;
  p: plongwordarray;
begin
  ZeroMemory(@bi, sizeof(tagBITMAPINFO));

  bi.bmiHeader.biSize := sizeof(tagBITMAPINFOHEADER);
  bi.bmiHeader.biWidth := 201;
  bi.bmiHeader.biHeight := -201;
  bi.bmiHeader.biPlanes := 1;
  bi.bmiHeader.biBitCount := 32;
  bi.bmiHeader.biCompression := BI_RGB;
  bi.bmiColors[0].rgbBlue := 255;
  bi.bmiColors[0].rgbGreen := 255;
  bi.bmiColors[0].rgbRed := 255;
  bi.bmiColors[0].rgbReserved := 255;

  ZeroMemory(@a,sizeof(a));

  a[100][100] := $00FFFFFF;

  InvalidateRect(Form1.Handle,nil,true);
  StretchDiBits(Form1.Canvas.Handle,0,0,200,200,0,0,200,200,
  @a,bi,DIB_RGB_COLORS,SRCCOPY);
  ValidateRect(Form1.Handle,nil);
end;

Nie wiem tylko jak zrobić dostęp do tj tablicy ( 'a' ) tak jak do TBitmap poprzez ScanLine, próbowałm już na kilka sposobów, ale żaden nie działał, np tak :

type
  tlongwordarray = array [0..65535] of longword;
  plongwordarray = ^tlongwordarray;

var
  p: plongwordarray;
  a: array [0..200] of array [0..200] of LongWord;

begin
  p := @a[100];
  p^[100] := $00FFFFFF;
end;

Proszę o pomoc, jak to zrobić, aby to działało tak jak ScanLine ??

0

Chyba sam znalazłem w czym tkwił mój błąd, zapomniałem najpierw dać :

New(p);

Ale skoro wątek jest już na forum to teraz mam trochę inne pytanie, a mianowicie,, kiedy użyję New(p) to program stworzy tablicę o tych rozmiarach co tablica na jaką wskazuje p, czy tylko stworzy wskażnik który będzie wskazywał na tą tablicę ?

Ogólnie chodzi mi o to czy to dobry sposób żeby tablicę do rzutowania deklarować od razu jako [0..65535] czy może zrobić tablicę dynamiczną i w trakcie działania programu ustawić ją na długość X elementów, czyli dokładnie tyle ile będziemy potrzebować, bo z tego co widziałem po różnych źródłach, to kiedy odwoływali się do elementów ScanLine'a to używali PByteArray zadeklarowaną w SysUtils na
[0..32767] of Byte

I dlaczego potem nie działa Dispose(p) ???

1 użytkowników online, w tym zalogowanych: 0, gości: 1