Delphi-PRAXiS :: Das Forum für Fragen zu Delphi
Das Experten Forum für Delphi Programmierer
Hilfe für CodeGear Delphi gibts es hier im Forum
Delphi Quelltexte und Source Codes
 
Delphi-PRAXiS :: Foren-ÜbersichtForen-Übersicht Delphi-PRAXiS Modul-ÜbersichtSite-Map Delphi-PRAXiS durchsuchenSuchen Delphi-PRAXiS Code-LibraryCode-Library Jetzt registrieren!Registrieren Login  
   
 
0
 
Delphi für Win32
DirectX9 initialisierungsproblem
Ein Delphi (Win32)-Thema von snoopy1602.

Vorheriges Thema anzeigen  |  Nächstes Thema anzeigen
Neuen Beitrag schreiben Auf Beitrag antworten
als PDF-Datei herunterladenThema ausdrucken
 
Delphi-PRAXiS Forum - Übersicht -> Multimedia
Seite 1 von 1   [ 5 Beiträge ]  
 
 Autor 
 Nachricht 
 
snoopy1602 #1|Beitrag #921412Verfasst am: 28.07.2008, 19:00      Titel: DirectX9 initialisierungsproblem Antworten mit Zitat
Mitglied
Alter: 29
Status: offline
Beiträge: 54
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
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, 06:45, insgesamt 4-mal bearbeitet.
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
turboPASCAL #2|Beitrag #921515Verfasst am: 29.07.2008, 06:19      Titel: Re: DirectX9 initialisierungsproblem Antworten mit Zitat
sehr aktives Mitglied
Alter: 41
Status: offline
Beiträge: 3.410
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.

Delphi-Quellcode: markieren
var
  Form1: TForm1;
  direct3d9_: IDirect3d9; // <--<<
  d3ddev9: idirect3ddevice9;



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, 07:09, insgesamt 1-mal bearbeitet.
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
snoopy1602 #3|Beitrag #921541Verfasst am: 29.07.2008, 09:58      Titel: Re: DirectX9 initialisierungsproblem Antworten mit Zitat
Mitglied
Alter: 29
Status: offline
Beiträge: 54
angemeldet: 17.03.2005
Wohnort: Lübeck
Turbo Delphi für Win32

Delphi-Quellcode: zusammenfalten | markieren
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, 09:59, insgesamt 1-mal bearbeitet.
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
turboPASCAL #4|Beitrag #921640Verfasst am: 29.07.2008, 14:04      Titel: Re: DirectX9 initialisierungsproblem Antworten mit Zitat
sehr aktives Mitglied
Alter: 41
Status: offline
Beiträge: 3.410
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
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
snoopy1602 #5|Beitrag #921753Verfasst am: 29.07.2008, 19:35      Titel: Re: DirectX9 initialisierungsproblem Antworten mit Zitat
Mitglied
Alter: 29
Status: offline
Beiträge: 54
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, 23:06, insgesamt 3-mal bearbeitet.
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
Anzeige-Optionen:    
 
Delphi-PRAXiS Forum - Übersicht -> Multimedia Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1   [ 5 Beiträge ]  
 
  Neuen Beitrag schreiben Auf Beitrag antworten
als PDF-Datei herunterladenThema ausdrucken
 
   
Gehe zu:  
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.


Impressum / Kontakt
Allgemeine Geschäftsbedingungen
Verhaltenskodex & FAQ

Delphi-PRAXiS :: Das Forum für Delphi-Programmierer
Das Experten Forum für Delphi ProgrammiererHilfe für Borland Delphi gibts es hier im ForumDelphi Quelltexte und Source CodesDelphi-PRAXiS :: Das Forum für DelphiWindows APIInternet und NetzwerkeVCL und Datenbanken
 

Delphi-PRAXiS V.2005 III
© 2002-2009 by Daniel R. Wolf
powered by phpBB © phpBB Group

Impressum / Kontakt Allgemeine Geschäftsbedingungen