dmFields := DM_PELSWIDTH or DM_PELSHEIGHT or DM_BITSPERPEL;
end;
if (ChangeDisplaySettings(dmScreenSettings, CDS_FULLSCREEN) = DISP_CHANGE_FAILED) then
begin
MessageBox(0, 'Konnte nicht in Vollbildmodus schalten!', 'Fehler', MB_OK or MB_ICONERROR);
result:=false;
end;
end;
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?
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?
Hier meine unit die das pixelformat setzen soll und nen rendering context erstellen soll (dass die main unit übersichtlicher is..)... genaueres siehe 1. post..
if not SetPixelFormat(canvas.handle, 16) then halt;
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]
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:
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:
lpfnWndProc := @gmWindowMessages;
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:
function gmWindowMessages(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
Füg einfach noch sdtcall hinten an. Also so:
Code:
function gmWindowMessages(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; // <- Wichtig bei API-Callback Funktionen !!!
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?
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?
@Nix Passiert: Ganz einfach. Schau Dir Deine gmDraw & gmProcessKeys Funktion mal an:
Code:
procedure gmDraw;
begin
// Nichts tun...
end;
procedure gmProcessKeys;
begin
// Nichts tun
end;
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?
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.
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?
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.