Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jun 08, 2024 04:31

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 30 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Sa Okt 05, 2002 19:25 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 13, 2002 18:26
Beiträge: 42
Wohnort: Stuttgart
kann mir mal einer sagen wieso das bei mir nicht funktioniert? ich hab ne seperate unit mit folgenden funktionen:

Code:
  1.  
  2.  
  3. function SetPixelFormat(handle: HDC; PixelDepth: Shortint): Boolean;
  4.  
  5. function CreateRC(rc: HGLRC; handle: HDC): Boolean;
  6.  
  7. function SetFullscreenMode(Width, Height, PixelDepth: Integer): Boolean;
  8.  
  9.  


Code:
  1.  
  2.  
  3. function SetPixelFormat(handle: HDC; PixelDepth: Shortint): Boolean;
  4.  
  5. var
  6.  
  7.   PixelFormat: TGLuint;
  8.  
  9.   PFD: PixelFormatDescriptor;
  10.  
  11. begin
  12.  
  13.   with PFD do
  14.  
  15.   begin
  16.  
  17.     nSize:= SizeOf(PIXELFORMATDESCRIPTOR);
  18.  
  19.     nVersion:= 1;
  20.  
  21.     dwFlags:= PFD_DRAW_TO_WINDOW or FD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
  22.  
  23.     // Settings
  24.  
  25.     iPixelType:=PFD_TYPE_RGBA;
  26.  
  27.     cColorBits:=PixelDepth;
  28.  
  29.     cRedBits:=0;
  30.  
  31.                 [...]
  32.  
  33.     iLayerType:=PFD_MAIN_PLANE;
  34.  
  35.     bReserved:=0;
  36.  
  37.     dwLayerMask:=0;
  38.  
  39.     dwVisibleMask:=0;
  40.  
  41.     dwDamageMask:=0
  42.  
  43.     end;
  44.  
  45.   PixelFormat:=ChoosePixelFormat(handle, @pfd);
  46.  
  47.  
  48.  
  49.   if (PixelFormat=0) then
  50.  
  51.   begin
  52.  
  53.     MessageDlg('Es konnte kein passendes PixelFormat gefunden werden!', mtError, [mbOk], 0);
  54.  
  55.     result:=false;
  56.  
  57.   end;
  58.  
  59.   if (not Windows.SetPixelFormat(handle,PixelFormat,@pfd)) then
  60.  
  61.   begin
  62.  
  63.     MessageDlg('PixelFormat konnte nicht gesetzt werden!', mtError, [mbOk], 0);
  64.  
  65.     result:=false;
  66.  
  67.   end;
  68.  
  69. end;
  70.  
  71.  
  72.  
  73.  


Code:
  1.  
  2.  
  3. function CreateRC(rc: HGLRC; handle: HDC): Boolean;
  4.  
  5. begin
  6.  
  7.   result:=true;
  8.  
  9.   rc:=wglCreateContext(handle);
  10.  
  11.   if (RC=0) then
  12.  
  13.   begin
  14.  
  15.     MessageDlg('Rendering Context kann nicht erstellt werden!', mtError, [mbOk], 0);
  16.  
  17.     Halt(100);
  18.  
  19.     result:=false;
  20.  
  21.   end;
  22.  
  23.  
  24.  
  25.   if (not wglMakeCurrent(handle, RC)) then
  26.  
  27.   begin
  28.  
  29.     MessageDlg('Rendering Context kann nicht aktiviert werden!', mtError, [mbOk], 0);
  30.  
  31.     Halt(100);
  32.  
  33.     result:=false;
  34.  
  35.   end
  36.  
  37. end;
  38.  
  39.  


Code:
  1.  
  2.  
  3. function SetFullscreenMode(Width, Height, PixelDepth: Integer): Boolean;
  4.  
  5. var
  6.  
  7.   dmScreenSettings: DevMode;
  8.  
  9. begin
  10.  
  11.   result:=true;
  12.  
  13.   ZeroMemory(@dmScreenSettings, SizeOf(dmScreenSettings));
  14.  
  15.   with dmScreenSettings do begin
  16.  
  17.   dmSize       := SizeOf(dmScreenSettings);
  18.  
  19.   dmPelsWidth  := Width;
  20.  
  21.   dmPelsHeight := Height;
  22.  
  23.   dmBitsPerPel := PixelDepth;
  24.  
  25.   dmFields     := DM_PELSWIDTH or DM_PELSHEIGHT or DM_BITSPERPEL;
  26.  
  27.   end;
  28.  
  29.  
  30.  
  31.   if (ChangeDisplaySettings(dmScreenSettings, CDS_FULLSCREEN) = DISP_CHANGE_FAILED) then
  32.  
  33.   begin
  34.  
  35.     MessageBox(0, 'Konnte nicht in Vollbildmodus schalten!', 'Fehler', MB_OK or MB_ICONERROR);
  36.  
  37.     result:=false;
  38.  
  39.   end;
  40.  
  41. end;
  42.  
  43.  



wenn ich SetPixelFormat aufrufe kann kein passendes pixelformat gesetzt werden... ich frag mich nur wieso... wenn ich dieselbe funktion in dieselbe unit setzte wo ich das pixelformat initialisieren will, klappt es.. (??) oder bin ich dumm?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 05, 2002 21:22 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
ich habe so ein ähnliches prob: ich hab die komplette initialisierung in ner anderen Unit... und auch da gibt's Probleme...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 05, 2002 21:39 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mai 06, 2002 20:27
Beiträge: 479
Wohnort: Bremen
wenn wir source zum ausprobieren hätten, oder wenigstens die ganze unit könnte man das sicher schneller klären. Wie wär's wenn du die neue Upload-Funktion der Seite nutzt? ;)


-lith

_________________
Selber Denken macht klug!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 05, 2002 22:23 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
Zitat:
wenn wir source zum ausprobieren hätten, oder wenigstens die ganze unit könnte man das sicher schneller klären.



<a href='http://members.aol.com/bluetobydelphi/Code.txt' target='_blank'>http://members.aol.com/bluetobydelphi/Code.txt</a>


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 06, 2002 15:10 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 13, 2002 18:26
Beiträge: 42
Wohnort: Stuttgart
Hier meine unit die das pixelformat setzen soll und nen rendering context erstellen soll (dass die main unit übersichtlicher is..)... genaueres siehe 1. post.. ;)

Code:
  1.  
  2.  
  3. unit PixelFormat;
  4.  
  5.  
  6.  
  7. [...]
  8.  
  9.  &nbsp;function SetPixelFormat(handle: HDC; PixelDepth: Shortint): Boolean;
  10.  
  11.  &nbsp;function CreateRC(rc: HGLRC; handle: HDC): Boolean;
  12.  
  13.  &nbsp;function SetFullscreenMode(Width, Height, PixelDepth: Integer): Boolean;
  14.  
  15.  
  16.  
  17. implementation
  18.  
  19. [...]
  20.  
  21.  
  22.  
  23.  


und das meine hauptunit...

Code:
  1.  
  2.  
  3. unit uMain;
  4.  
  5.  
  6.  
  7. interface
  8.  
  9.  
  10.  
  11. uses ..., PixelFormat;
  12.  
  13.  
  14.  
  15. [...]
  16.  
  17.  
  18.  
  19. var
  20.  
  21.  &nbsp;rc: HGLRC;
  22.  
  23.  
  24.  
  25. implementation
  26.  
  27.  
  28.  
  29. [...]
  30.  
  31.  
  32.  
  33. procedure TMainForm.Show(...);
  34.  
  35. begin
  36.  
  37.  &nbsp;if not CreateRC(rc, canvas.handle) then halt;
  38.  
  39.  &nbsp;if not SetPixelFormat(canvas.handle, 16) then halt;
  40.  
  41.  &nbsp;[...]
  42.  
  43. end;
  44.  
  45.  
  46.  
  47. [...]
  48.  
  49.  



das problem is: ich kann kein pixelformat setzen :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 06, 2002 15:29 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Code:
  1.  
  2.  
  3. if not CreateRC(rc, canvas.handle) then halt;
  4.  
  5. if not SetPixelFormat(canvas.handle, 16) then halt;
  6.  
  7.  

muss man nicht das pixel format vor dem erstellen des rendering contextes aufrufen? das nur so nebenbei. Allerdings muss ich sagen, bei mir funzt es, das pixelformat auch aus anderen units heraus zu setzen...[/quote]


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 06, 2002 18:25 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 13, 2002 18:26
Beiträge: 42
Wohnort: Stuttgart
kannst du mir bitte den source posten? von der unit und von deiner haupt unit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 07, 2002 08:50 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
@BlueToby: Hab mir Deinen Source mal angeschaut. Sorry, aber so kann das nicht funktionieren. Hier die Änderungen, die Du vornehmen musst:

1. In der DPR (der 1.) Datei hast Du die folgenden Deklarationen:
Code:
  1.  
  2.  
  3.  
  4.  
  5. function gmWindowRun(WindowHeight, WindowWidth: Integer; WindowFullscreen: Boolean; WindowPixelDepth: Integer;hInstance : HINST; hPrevInstance : HINST;
  6.  
  7.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lpCmdLine : PChar; nCmdShow : Integer) : Integer;
  8.  
  9. procedure gmPrintFont(Text: PChar);
  10.  
  11.  


Diese Funktionen sind aber in der GIGAmetrie.pas implementiert. Also gehören die deklarationen der oberen beiden Funktionen in den Interface-Bereich der Giga-Metrie Unit, da der Compiler sonst meint, dass er momentan in der gmWindowRun-Funktion ist und nach einem korrekten Abschluß sucht. Es stimmt also im Source nichts mehr überein. Trag die beiden Zeilen im Interface-Bereich deiner GIGAmetrie.pas ein und entferne sie aus der DPR. Dann lässt sich das ganze auch wieder compilieren.

2. Beim füllen der Klassen-Info zu Deinem Fenster hast Du folgendes geschreiben:
Code:
  1.  
  2.  
  3.  &nbsp;with wndClass do &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
  4.  
  5.  &nbsp;begin
  6.  
  7.  &nbsp; &nbsp;style &nbsp; &nbsp; &nbsp; &nbsp; := CS_HREDRAW or
  8.  
  9.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CS_VREDRAW or &nbsp;
  10.  
  11.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CS_OWNDC; &nbsp; &nbsp; &nbsp; &nbsp;
  12.  
  13.  &nbsp; &nbsp;lpfnWndProc &nbsp; := @CreateWindow; &nbsp; &nbsp; &nbsp; &nbsp;// <- Fehler
  14.  
  15.  &nbsp; &nbsp;hInstance &nbsp; &nbsp; := h_Instance;
  16.  
  17.  &nbsp; &nbsp;hCursor &nbsp; &nbsp; &nbsp; := LoadCursor(0, IDC_ARROW);
  18.  
  19.  &nbsp; &nbsp;lpszClassName := 'OpenGL';
  20.  
  21.  &nbsp;end;
  22.  
  23.  


An der Stelle wo der Kommentar steht ist der eigentliche Fehler. An lpfnWndProc muss nicht CreateWindow übergeben werden (dies ist eine API-Funktion welche sich nicht um das Fenster-Handling kümmert sondern das Fenster erstellt), sondern Deine Nachrichten-Verarbeitungs-Funktion gmWindowMessages. Richtig wäre also:
Code:
  1.  
  2.  
  3.  &nbsp;lpfnWndProc := @gmWindowMessages;
  4.  
  5.  


3. Dann läuft das ganze aber immer noch nicht, denn bei der gmWindowMessages-Funktion, welche von der API aufgerufen wird, gelten zwei wichtige Regeln.
1. Sie darf NICHT in einem Objekt sein (was bei Dir zutrifft).
2. Sie muss als stdcall deklariert sein, da Windows die Parameter auf den Stack legt und nicht per Register übergibt. Die Register-Übergabe ist übrigens in Pascal und C/C++ verschieden! Auch deswegen stdcall.
Folgendermaßen hasst Du die Funktion deklariert:
Code:
  1.  
  2.  
  3. function gmWindowMessages(hWnd: HWND; Msg: UINT; &nbsp;wParam: WPARAM; &nbsp;lParam: LPARAM): LRESULT;
  4.  
  5.  

Füg einfach noch sdtcall hinten an. Also so:
Code:
  1.  
  2.  
  3. function gmWindowMessages(hWnd: HWND; Msg: UINT; &nbsp;wParam: WPARAM; &nbsp;lParam: LPARAM): LRESULT; stdcall; // <- Wichtig bei API-Callback Funktionen !!!
  4.  
  5.  


Nach den Änderungen lässt sich der Source kompilieren (getestet mit Delphi 5 & 7) und läuft auch ohne irgend eine Fehlermeldung oder gar Schutzverletzung!
Es lag also gar nicht an dem Pixel-Format.

_________________
Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 07, 2002 12:38 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
ich hab den thread ja auch nicht gestartet. Aber Danke für die Tipps.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 07, 2002 12:40 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
Stimmt. Du hast ihn nicht gestartet, aber Du hast deinen Source veröffentlicht und bisher noch keine Antwort bekommen ;) You're welcome!

_________________
Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 07, 2002 12:49 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
hi! hab grade den source ausprobiert und muss sagen:
1. Es funzt.
2. Man sieht keine OpenGL-Objekte, nur grau in grau
3. Wieso stürzen bei mir OpenGL-Anwendungen immer nach einer gewissen Zeit mit dem Bluescreen ab?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 07, 2002 13:40 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
@Nix Passiert: Ganz einfach. Schau Dir Deine gmDraw & gmProcessKeys Funktion mal an:
Code:
  1.  
  2.  
  3. procedure gmDraw;
  4.  
  5. begin
  6.  
  7.  // Nichts tun...
  8.  
  9. end;
  10.  
  11.  
  12.  
  13. procedure gmProcessKeys;
  14.  
  15. begin
  16.  
  17.  // Nichts tun
  18.  
  19. end;
  20.  
  21.  

Wundert Dich das?!? Du hast zwar nochmal eine gmDraw in der DPR-Datei, aber die wird nicht aufgerufen. Prozeduren und Funktionen von Delphi werden nur dann aufgerufen, wenn sie 1. in der gleichen Unit sind in welcher auch der Aufruf erfolgt oder wenn 2. die aufrufende Unit eine andere per uses aufnimmt, in welcher im Interface-Bereich die entsprechende Funktion deklariert und im implementation-Bereich implementiert ist.

Schmeiß Deine Funktionen (gmDraw und gmProcessKeys) aus der DPR-Datei raus und füg' sie in der GIGAmetrie.pas ein. Dann müsste auch was zu sehen sein.

@Abstütze: das kann ein Treiberproblem sein. Lad' Dir mal die aktuellsten Treiber aus dem Netz. Ich hatte das gleiche unter Direct3D. Jedoch kam kein Bluescreen sondern ein gnadenloser Aufhänger. Auser aus- und wieder einschalten war nichts anderes mehr möglich. Nach dem Treiberupdate ging alles wieder einwandfrei.

_________________
Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 07, 2002 13:57 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
Zitat:
Wundert Dich das?!? Du hast zwar nochmal eine gmDraw in der DPR-Datei, aber die wird nicht aufgerufen. Prozeduren und Funktionen von Delphi werden nur dann aufgerufen, wenn sie 1. in der gleichen Unit sind in welcher auch der Aufruf erfolgt oder wenn 2. die aufrufende Unit eine andere per uses aufnimmt, in welcher im Interface-Bereich die entsprechende Funktion deklariert und im implementation-Bereich implementiert ist.

Hihi, hatte ganz vergessen, dass ich da ja noch ne Lösung finden wollte. Kann ich denn die gmDraw irgendwie aus der empty.dpr in der gm-Unit laden? Oder irgendwie überschreiben... Wie bei OOP Parent and Children?
Aber ich will das doch wegen der Übersichtlichkeit gerade in der empty.dpr drin ham.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 07, 2002 14:10 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
Ne, geht leider nicht. Außer Du übergibt die Adresse der gmDraw mit Hilfe einer Funktion oder Variable an die GIGAmetire-Unit. Dann musste da die entsprechende Variable als Funktion aufrufen. Ist aber nicht unbeding die schönste Variante wenn man nicht gerade eine CallBack-Funktion verwenden muss. In DIE benötigt man CallBack-Funktionen und da wird das dann auch verwendet und ist keine Problem.

_________________
Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 07, 2002 14:30 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
wie war das mit den Callbackfunktionen?


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 30 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 26 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.011s | 14 Queries | GZIP : On ]