[NET] Direct3D - Device Create

0

Witam, mam następujący problem..
Po udanej kompilacji i uruchomieniu programu wyskakuje znany błąd "object reference not set to an instance of an object" czyli typowy "access violation".
Próbuję sobie napisać jakiś prosty programik z wykorzystaniem DirectX, wykorzystując biblioteki Microsoftu wcześniej wgrane co VS2005 C#.
Program teraz piszę w Delphi 2005. (Mam tą wersję i w niej chcę pisać)

A teraz trochę kodu gdzie ten błąd występuje:

procedure TWinForm.InitDevice;
var
presentparams : array of PresentParameters;
begin

SetLength(presentparams,1);
presentparams[0] := PresentParameters.Create;
presentparams[0].Windowed := true;
presentparams[0].SwapEffect := SwapEffect.Discard;
device := Microsoft.DirectX.Direct3D.Device.Create(
    0,
    DeviceType.Hardware,
    WinForm.TWinForm.ActiveForm.Handle,
    CreateFlags.SoftwareVertexProcessing,
    presentparams);
presentparams[0].Free;
SetLength(presentparams,0);
end;

Dokładnie na linii tworzącej "device" czyli

device := Microsoft.DirectX.Direct3D.Device.Create( ... );

Od początku "device" jest widziany w debugerze jako "null reference" ('nawet po teoretycznym wykonaniu' się tej linii).

"device" jest deklarowany obecnie w klasie, ale był także globalnie, nic to nie zmienia.

Kod ten działa w c# napisany jako:

public void InitializeDevice()
 {
     PresentParameters presentParams = new PresentParameters();
     presentParams.Windowed = true;
     presentParams.SwapEffect = SwapEffect.Discard;
 
     device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
 }

Dodam, że google przeszukałem jak i to forum.

0

W C# presentParams jest typu PresentParameters, i taki obiekt przekazujesz do konstruktora.
W Delphi.NET z jakiegoś powodu tworzysz tablicę, ustawiasz jej rozmiar na 1, wypełniasz pierwszy element, a do konstruktora przekazujesz całą tablicę.
Nie znam API zarządzanego DirectX-a, więc nie wiem który wariant jest poprawny (może oba), ale jest to różnica między jednym kodem a drugim, która może powodować niedziałanie.

Dalej w C# podajesz this (czyli obiekt formy) a w Delphi.NET jakieś ActiveForm.Handle – które może być czymś zupełnie innym…

0

Tak, wiem, to co napisałeś wszystko było już zrobione, w kodzie jest zaznaczone tworzenie tablicy dla tego params.
Z ActiveForms też eksperymentowałem.
Problem rozwiazałem juz sam, okazał się on trywialny, wystarczyło zajrzeć do procedury wyżej.
Zamiast bawić się w ActiveForm, tam gdzie w C# jest "this", w tym przypadku, w Delphi trzeba po prostu wpisać "self" i trybi.

Pozdro

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