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

Aktuelle Zeit: Fr Jul 18, 2025 12:31

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Absturz bei Prog wegen ShowMessage
BeitragVerfasst: Di Jul 05, 2005 12:44 
Offline
DGL Member

Registriert: Mi Apr 27, 2005 19:24
Beiträge: 24
Warum stürzt das Programm immer ab mit einer EAccessViolation und wie kann man dies beheben?
Das Programm läuft super aber nur ohne die ShowMessage im create teil.
Ich benutze die dglOpenGL 1.9

Hier mal ein Ausschnitt aus dem Source:
Code:
  1. procedure TFormOpenGL.FormCreate(Sender: TObject);
  2. begin
  3.  
  4.  
  5.   ShowMessage('Nachricht');
  6.  
  7.  
  8.   dc:=GetDC(Integer(Handle));
  9.   rc:=CreateRenderingContext(dc,[opDoubleBuffered],32,24,8,0,0,0);
  10.   ActivateRenderingContext(dc,rc,false);
  11.   glClearColor(0.0, 0.0, 0.0, 0.0);
  12.   glShadeModel(GL_SMOOTH);
  13.   glClearDepth(1.0);
  14.   glEnable(GL_DEPTH_TEST);
  15.   glDepthFunc(GL_LESS);
  16.   glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  17.   glEnable(GL_TEXTURE_2D);
  18.   // InitRenderGL;
  19. end;
  20.  
  21. procedure TFormOpenGL.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
  22. begin
  23.   done := false;
  24.   glMatrixMode(GL_PROJECTION);
  25.   glLoadIdentity;                                  //   (-- Hier landet er noch der EAccessViolation bei break
  26.   gluPerspective(45, ClientWidth/ClientHeight, 0.05, 100);
  27.   glViewPort(0, 0, ClientWidth, ClientHeight);
  28.   glMatrixMode(GL_MODELVIEW);
  29.   glLoadIdentity;
  30.   glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT);
  31.   glClearColor(0, 0, 0, 1);
  32.   RenderGL;
  33.   SwapBuffers(dc);
  34. end;
  35.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 05, 2005 13:02 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Kann ich dir sagen. Das ist einfacher als du denkst. OnIdle wird immer dann aufgerufen, wenn deine Anwendung nichts zu tun hat. Im ShowMessage wartet sie auf den Benutzer. Also hat sie nichts zu tun. Somit wird OnIdle aufgerufen. Da du aber noch kein OpenGL initialisiert hast wurde auch noch keine DLL geladen und kein RC angelegt. Dies wird erst geschehen, wenn du InitOpenGL oder CreateRenderContext aufrufst. Also kann er zu dem zeitpunkt noch keine Funktionspointer laden. Was dann zu einer AccessViolation führt, da er versucht eine nicht geladenen Methode aufrufen will.

Unterbinden kannst du das in dem du nach dem Initialisieren von OpenGL ein Boolean setzt und diesen in OnIdle abprüfst.

Code:
  1. procedure TFormOpenGL.FormCreate(Sender: TObject);
  2. begin
  3.   // Mach hier was
  4.   // OpenGL initialisieren
  5.   ...
  6.  fInitialized := True;
  7. end;
  8.  
  9. procedure TFormOpenGL.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
  10. begin
  11.   if fInitialized then begin
  12.     done := False;
  13.  
  14.     ...
  15.   end;
  16. end;


Das solltest du nach Möglichkeit immer machen. Denn sobald du in den Vollbildmodus umstellen willst passiert das gleiche Problem.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 05, 2005 13:05 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Die exception im FormCreate tritt auf, weil tief im Aufrufstack von ShowMessage auf die Variable 'Application' zugegriffen wird. Diese ist aber zu diesem Zeitpunkt noch nicht gültig.
Umgehen kannst Du dies. indem du die Message erst im FormShow anzeigst.
Wenn Du sie nur beim ersten mal anzeigen willst, musst Du Dir aber ein Hilfskonstrukt basteln:
in den Private-Abschnitt Deines Formulars die Variable bFirstShow: Boolean einfügen, im FormCreate setzt Du diese dann auf True. Im FormShow kannst du dann Prüfen, ob sie gesetzt ist. Wenn ja, zeigst du die Nachricht an und setzt die Variable auf False.


[edit]alles falsch :wink: kommt davon, wenn man antwortet, ohne es selber ausprobiert zu haben :wink: [/edit]

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 05, 2005 13:24 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Natürlich ist es falsch, denn wie soll man dann das hier erklären:
Code:
  1.  
  2.   Application.Initialize;
  3.   Application.Title := 'BallonKiller';
  4.   Application.CreateForm(TForm1, Form1); // <---
  5.   Application.Run;
  6.  

;)

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 05, 2005 14:59 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Fiel mir hiterher auch ein :oops:
Manchmal steht man wirklich so dermaßen auf dem Schlauch, dass man sagt: "Gibt's des?"

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 05, 2005 15:40 
Offline
DGL Member

Registriert: Mi Apr 27, 2005 19:24
Beiträge: 24
Vielen Dank !! Jetzt funktioniert es super! :D


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]