Eigentlich ganz simpel
Die Deklaration
P: ^PixArray;
macht aus deinem P erstmal einen Pointer. Nichts weiter.
Das Property ScanLine liefert einen Pointer zurück - also paßt das prima zusammen.
Erst, wenn du beginnst, im Code dein P zu dereferenzieren, also z.B. bei
P^[1]:=0;
wird die Tatsache, das dein P ein Pointer auf ein PixArray ist, interessant. Denn erst hier muß der Compiler anfangen, Adressen im Speicher zu errechnen.
Bis dahin ist ein Pointer einfach nur ein Pointer.
HTH,
Olaf