 |
| |
|
|
 |
Autor |
Nachricht |
 |
| |
| snoopy1602 |
#1| Verfasst am: 28.07.2008, 18:00 Titel: DirectX9 initialisierungsproblem |
 |
 |
 |
|
Mitglied Alter: 28 Status: offline Beiträge: 44 angemeldet: 17.03.2005 Wohnort: Lübeck Turbo Delphi für Win32

|
Sprache: Delphi (Win32) Hi Leute! Ich versuche mit Turbo Delphi Explorer das Buch DirectX9 mit Delphi durchzuarbeiten. Ich habe aber jetzt folgendes Problem:
Ich habe den Quelltext so eingegeben so wie er im Buch steht und natürlich auch die entsprechenden DirectX units mit eingebungen.
Delphi-Quellcode: | zusammenfalten | markieren | 1 · · · 5 · · · · 10 · · · · 15 · · · · 20 · · · · 25 · · · · 30 · · · · 35 · · · · 40 · · · · 45 · · · · 50 · · · · 55 · · · · 60 · · · · 65 · · · · 70 · · · · 75 · · · · 80 · · · · 85 · · · · 90 · · · · 95 · · · · 100 · · · · 105 · · · · 110 · · · · 115 · · · · 120 · · · · 125 · · · · 130 · · · · 135 · · · · 140 · · · · 145 · · · · 150 · · · · 155
| unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, direct3d9, d3dx9;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure OnIdle(Sender: Tobject; var done: boolean);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
direct3d9: IDirect3d9;
d3ddev9: idirect3ddevice9;
implementation
{$R *.dfm}
function dhinitdgfx(_handle: hwnd; _fullscreen: boolean;
_width, _height, _bits: longint;
_hal: boolean; out _idirect3d9: idirect3d9;
out _idirect3ddevice9: idirect3ddevice9): boolean;
var
d3dpp : td3dpresent_parameters;
d3ddm : td3ddisplaymode;
dtype : td3ddevtype;
d3dcaps9 : td3dcaps9;
hardwarevertexprocessing : boolean;
vertexprocessing : integer;
begin
result:= false;
_idirect3d9:= direct3dcreate9(d3d_sdk_version);
if (_idirect3d9 = nil) then exit;
fillchar(d3dpp, sizeof(d3dpp), 0);
with d3dpp do begin
windowed:= not _fullscreen;
swapeffect:= d3dswapeffect_discard;
if (_fullscreen) then
begin
backbufferwidth:= _width;
backbufferheight:= _height;
case _bits of
16: backbufferformat:= d3dfmt_r5g6b5;
32: backbufferformat:= d3dfmt_a8r8g8b8;
else exit;
end;
end else begin
if failed(_idirect3d9.GetAdapterDisplayMode(d3dadapter_default, d3ddm)) then
exit;
backbufferformat:= d3ddm.Format;
end;
end;
_idirect3d9.GetDeviceCaps(d3dadapter_default, d3ddevtype_hal, d3dcaps9);
hardwarevertexprocessing:= d3dcaps9.DevCaps and d3ddevcaps_hwtransformandlight <> 0;
if hardwarevertexprocessing then
vertexprocessing:= d3dcreate_hardware_vertexprocessing
else
vertexprocessing:= d3dcreate_software_vertexprocessing;
if _hal then
dtype:= d3ddevtype_hal
else
dtype:= d3ddevtype_ref;
result:= true;
end;
procedure dxgfx_init;
var
d3dpp: td3dpresent_parameters;
d3ddm: td3ddisplaymode;
begin
direct3d9:= direct3dcreate9(d3d_sdk_version);
if direct3d9 = nil then
begin
exit;
end;
if (not direct3d9.GetAdapterDisplayMode(d3dadapter_default, d3ddm)= d3d_ok) then
begin
application.terminate;
exit;
end;
fillchar(d3dpp, sizeof(d3dpp), 0);
d3dpp.windowed:= false;
d3dpp.BackBufferWidth:= d3ddm.Width;
d3dpp.BackBufferHeight:= d3ddm.Height;
d3dpp.BackBufferFormat:= d3ddm.Format;
d3dpp.SwapEffect:= d3dswapeffect_discard;
[b]direct3d9.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, form1.Handle, D3DCREATE_SOFTWARE_VERTEXPROCESSING, d3dpp, d3ddev9);[/b] // Diese Zeile wird bei mir als Fehler markiert//
end;
procedure dhclosedgfx(_idirect3d9: idirect3d9; _idirect3ddevice9: idirect3ddevice9);
begin
_idirect3ddevice9:= nil;
_idirect3d9:= nil;
end;
procedure render;
begin
d3ddev9.BeginScene;
d3ddev9.Clear(0, nil, d3dclear_target, d3dcolor_argb(0,0,0,0),1.0, 0);
d3ddev9.EndScene;
d3ddev9.Present(nil, nil, 0, nil);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
dhclosedgfx(direct3d9, d3ddev9);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
dhinitdgfx(handle, false, 0,0,0, true, direct3d9, d3ddev9);
application.OnIdle:= onidle;
end;
procedure tform1.OnIdle(Sender: TObject; var done: Boolean);
begin
done:= false;
render;
end;
end. |
|
Ich bin echt ratlos! Ich finde den Fehler einfach nicht!
Als Fehlermeldung wird mir folgendes beim compilieren ausgegeben:
[Pascal Fehler] main.pas(115): E2010 Inkompatible Typen: 'PD3DPresentParameters' und '_D3DPRESENT_PARAMETERS_'
Wie kann das sein?
[edit=Sharky]Delphi-Tags gesetzt. Zukünftig bitte selber machen. Danke. Mfg, Sharky[/edit] |
Zuletzt bearbeitet von Sharky am 29.07.2008, 05:45, insgesamt 4-mal bearbeitet. |
 |
|
|
|
| |
| turboPASCAL |
#2| Verfasst am: 29.07.2008, 05:19 Titel: Re: DirectX9 initialisierungsproblem |
 |
 |
 |
|
sehr aktives Mitglied Alter: 40 Status: offline Beiträge: 2.990 angemeldet: 08.05.2005 Wohnort: Sondershausen Delphi 6 Personal

|
Kannst du deinen Quelltext bitte mal in Delphi-Tags setzen ?
Erster Fehler:
Die gleichen Namen in der Uses-Klausel
| Code: | markieren | uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, direct3d9, d3dx9; |
|
und als Variable
| Code: | markieren | var
Form1: TForm1;
direct3d9: IDirect3d9;
d3ddev9: idirect3ddevice9; |
|
Lösung: Variable umbenennen.
Zweiter Fehler:
| Delphi-Quellcode: | markieren | direct3d9_.CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
Handle,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
@d3dpp, // <--<< sollte glaube ich ein Pointer sein
d3ddev9); |
| |
 Grüße vom Rüsselmops -Mops Mopser
Zuletzt bearbeitet von turboPASCAL am 29.07.2008, 06:09, insgesamt 1-mal bearbeitet. |
 |
|
|
|
| |
| snoopy1602 |
#3| Verfasst am: 29.07.2008, 08:58 Titel: Re: DirectX9 initialisierungsproblem |
 |
 |
 |
|
Mitglied Alter: 28 Status: offline Beiträge: 44 angemeldet: 17.03.2005 Wohnort: Lübeck Turbo Delphi für Win32

|
Delphi-Quellcode: | zusammenfalten | markieren | 1 · · · 5 · · · · 10 · · · · 15 · · · · 20 · · · · 25 · · · · 30 · · · · 35 · · · · 40 · · · · 45 · · · · 50 · · · · 55 · · · · 60 · · · · 65 · · · · 70 · · · · 75 · · · · 80 · · · · 85 · · · · 90 · · · · 95 · · · · 100 · · · · 105 · · · · 110 · · · · 115 · · · · 120 · · · · 125 · · · · 130 · · · · 135 · · · · 140 · · · · 145 · · · · 150 · 152
| unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, direct3d9, d3dx9;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure OnIdle(Sender: Tobject; var done: boolean);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
direct3d9_: IDirect3d9;
d3ddev9: idirect3ddevice9;
implementation
{$R *.dfm}
function dhinitdgfx(_handle: hwnd; _fullscreen: boolean;
_width, _height, _bits: longint;
_hal: boolean; out _idirect3d9: idirect3d9;
out _idirect3ddevice9: idirect3ddevice9): boolean;
var
d3dpp : td3dpresent_parameters;
d3ddm : td3ddisplaymode;
dtype : td3ddevtype;
d3dcaps9 : td3dcaps9;
hardwarevertexprocessing : boolean;
vertexprocessing : integer;
begin
result:= false;
direct3d9_:= direct3dcreate9(d3d_sdk_version);
if (direct3d9_ = nil) then exit;
fillchar(d3dpp, sizeof(d3dpp), 0);
with d3dpp do begin
windowed:= not _fullscreen;
swapeffect:= d3dswapeffect_discard;
if (_fullscreen) then
begin
backbufferwidth:= _width;
backbufferheight:= _height;
case _bits of
16: backbufferformat:= d3dfmt_r5g6b5;
32: backbufferformat:= d3dfmt_a8r8g8b8;
else exit;
end;
end else begin
if failed(_idirect3d9.GetAdapterDisplayMode(d3dadapter_default, d3ddm)) then
exit;
backbufferformat:= d3ddm.Format;
end;
end;
_idirect3d9.GetDeviceCaps(d3dadapter_default, d3ddevtype_hal, d3dcaps9);
hardwarevertexprocessing:= d3dcaps9.DevCaps and d3ddevcaps_hwtransformandlight <> 0;
if hardwarevertexprocessing then
vertexprocessing:= d3dcreate_hardware_vertexprocessing
else
vertexprocessing:= d3dcreate_software_vertexprocessing;
if _hal then
dtype:= d3ddevtype_hal
else
dtype:= d3ddevtype_ref;
result:= true;
end;
procedure dxgfx_init;
var
d3dpp: td3dpresent_parameters;
d3ddm: td3ddisplaymode;
begin
direct3d9.Direct3DCreate9(d3d_sdk_version);
if direct3d9.Direct3DCreate9(d3d_sdk_version) = nil then
begin
exit;
end;
if (not direct3d9_.getadapterdisplaymode(d3dadapter_default, d3ddm)= d3d_ok) then
begin
application.terminate;
exit;
end;
fillchar(d3dpp, sizeof(d3dpp), 0);
d3dpp.windowed:= false;
d3dpp.BackBufferWidth:= d3ddm.Width;
d3dpp.BackBufferHeight:= d3ddm.Height;
d3dpp.BackBufferFormat:= d3ddm.Format;
d3dpp.SwapEffect:= d3dswapeffect_discard;
if (not direct3d9_.CreateDevice(d3dadapter_default, d3ddevtype_hal, form1.Handle, d3dcreate_software_vertexprocessing, @d3dpp, d3ddev9)=d3d_ok) then
application.Terminate;
end;
procedure dhclosedgfx(_idirect3d9: idirect3d9; _idirect3ddevice9: idirect3ddevice9);
begin
_idirect3ddevice9:= nil;
_idirect3d9:= nil;
end;
procedure render;
begin
d3ddev9.BeginScene;
d3ddev9.Clear(0, nil, d3dclear_target, d3dcolor_argb(0,0,0,0),1.0, 0);
d3ddev9.EndScene;
d3ddev9.Present(nil, nil, 0, nil);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
dhclosedgfx(direct3d9_, d3ddev9);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
dhinitdgfx(handle, false, 0,0,0, true, direct3d9_, d3ddev9);
application.OnIdle:= onidle;
end;
procedure tform1.OnIdle(Sender: TObject; var done: Boolean);
begin
done:= false;
// render;
end;
end. |
|
Mein Quelltext sieht jetzt so aus. Sobald ich jedoch den Befehl render; reaktiviere stürzt das Programm mit folgender Fehlermeldung ab:
"Im Project1.exe ist eie Exception der Klasse EAccesViolation mit der Meldung 'Zugriffsverletzung bei Adresse 0045236A in Modul 'Project1.exe'. Lesen von Adresse 00000000' aufgetreten." |
Zuletzt bearbeitet von snoopy1602 am 29.07.2008, 08:59, insgesamt 1-mal bearbeitet. |
 |
|
|
|
| |
| turboPASCAL |
#4| Verfasst am: 29.07.2008, 13:04 Titel: Re: DirectX9 initialisierungsproblem |
 |
 |
 |
|
sehr aktives Mitglied Alter: 40 Status: offline Beiträge: 2.990 angemeldet: 08.05.2005 Wohnort: Sondershausen Delphi 6 Personal

|
Ja, weil die Initialisierung noch fehlt. die Procediure "dxgfx_init" wird nirgens wo aufgerufen.
( wenn ich mich nicht verguckt habe ) |
 Grüße vom Rüsselmops -Mops Mopser |
 |
|
|
|
| |
| snoopy1602 |
#5| Verfasst am: 29.07.2008, 18:35 Titel: Re: DirectX9 initialisierungsproblem |
 |
 |
 |
|
Mitglied Alter: 28 Status: offline Beiträge: 44 angemeldet: 17.03.2005 Wohnort: Lübeck Turbo Delphi für Win32

|
Danke das war der Fehler. Jetzt hängt das Programm zwar in Moment in einer Endlosschleife, aber ich habe zumindest endlich mal einen grauen Hintergrund.
Auch den Fehler habe ich gefunden. Ich hatte die beiden Zeilen vertauscht. Jetzt habe ich endlich einen schwarzen Bildschirm.
| Code: | markieren | dhinitdgfx(handle, false, 0,0,0, true, direct3d9, d3ddev9);
dxgfx_init; |
| |
Zuletzt bearbeitet von snoopy1602 am 29.07.2008, 22:06, insgesamt 3-mal bearbeitet. |
 |
|
|
|
 |
|
 |
| |
|
|
| |
 
|
|
| |
|
Du darfst keine Beiträge in dieses Forum schreiben. Du darfst auf Beiträge in diesem Forum nicht antworten. Du darfst Deine Beiträge in diesem Forum nicht bearbeiten. Du darfst Deine Beiträge in diesem Forum nicht löschen. Du darfst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum nicht posten. Du kannst Dateien in diesem Forum nicht herunterladen.
|
|
 |