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

Aktuelle Zeit: Sa Jul 19, 2025 21:07

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



Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Exception bei Textausgabe
BeitragVerfasst: Do Okt 06, 2005 23:01 
Offline
DGL Member

Registriert: Di Mär 16, 2004 22:25
Beiträge: 17
Hi,

hab das Bombermantut als Basis fürn eigenes Spiel genommen. Jetzt hab ich folgendes Problem:

Im OnIdle wird mein Menü gezeichnet und es funktioniert alles gut, wenn ich aber denselben Code in ne Procedure meines GameObjects auslagere krieg ich ne Exception beim Zeichnen des Textes (texturemanager.Print2d bei FontTexture.Bind).
Im OnIdle steht sonst nichts oglmässiges drin.

Code:
  1.  
  2. glMatrixMode(GL_PROJECTION);
  3.   glLoadIdentity;
  4.   glOrtho(0,640,480,0,-2,2);
  5.   glMatrixMode(GL_MODELVIEW);
  6.   glLoadIdentity;
  7.   glEnable(GL_Texture_2d);
  8.   TextureManager.BindTexture('inevitable_1024.jpg');
  9.   glDisable(gl_Depth_test);
  10.   glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT);
  11.   glColor3f(1,1,1);
  12.   glBegin(GL_QUADS);
  13.    glTexCoord2f(0,1); glVertex3f(0, 0, 0);
  14.    glTexCoord2f(0,0); glVertex3f(0, 480, 0);
  15.    glTexCoord2f(1,0); glVertex3f(640, 480, 0);
  16.    glTexCoord2f(1,1); glVertex3f(640, 0, 0);
  17.   glEnd;
  18.   for i := Low(EntryName) to High(EntryName) do
  19.     if i = Game.MenueSelected then
  20.       TextureFont.Print2D(EntryName[i], [230,EntryPos[i],0],[1,0.3,0.3],1,1)
  21.     else
  22.       TextureFont.Print2D(EntryName[i], [230,EntryPos[i],0],[1,1,1],1,1);
  23.   swapBuffers(DC);
  24.  


Gruß Steffen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 06, 2005 23:16 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Hmmmm eventuell hast du einen anderen GL Header eingebunden. In deinem gesamten Quellcode muss überall der selbe Header verwendet werden. (z.B. kracht es wenn du in der Hauptdatei die DGLopenGL.pas benutzt und in ner anderen Datei dann die OpenGL.pas einbindest.)

Allerdings kann man aus dem Code net viel erkennen.... Ich jedenfalls net... ;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 06, 2005 23:33 
Offline
DGL Member

Registriert: Di Mär 16, 2004 22:25
Beiträge: 17
hab überall den gleichen header.
hab grad in meiner formularunit n testobject gemacht und den Code da reingepackt. Da gehts.
Nur nich wenn der Code in ner anderen unit steht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 07, 2005 07:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Kann mich Flash nur anschließen. Das was du an Code gepostet hast lässt nicht viel erkennen.
Mich würde aber auch mal interessieren was für eine Exception auftritt. Normal haben die auch nen Text und nen Exceptiontypen. Wenn du uns das sagen kannst, dann können wir schon viel mehr vermuten.

Außerdem kann ich deinen Ausführungen mit dem Manager und der Textur nicht ganz folgen. Zu mindest decken die sich überhaupt nicht mit dem Code den du gepostet hast. Wenn ich da mal was aufführen dürfte.
Code:
  1. texturemanager.Print2d
  2. TextureManager.BindTexture('inevitable_1024.jpg');
  3. FontTexture.Bind
  4. TextureFont.Print2D(EntryName[i], [230,EntryPos[i],0],[1,0.3,0.3],1,1)

Was gehört denn jetzt wohin? ;-)

Zitat:
hab überall den gleichen header.

Nur um sicher zu gehen. Benutzt du Fremdunits? Wenn ja müssen die natürlich auch den selben Header benutzen. Aber ob es an so etwas liegen würde könnte man anhand einer detailierten Fehlerbeschreibung schon erkennen. ;-)

Zitat:
Im OnIdle steht sonst nichts oglmässiges drin.

Exceptions können überall auftreten. Das hat nicht unbedingt was mit OpenGL zu tun. Normal liefert OpenGL nämlich keine Exceptions sondern man muss einen Fehlercode abfragen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 07, 2005 12:03 
Offline
DGL Member

Registriert: Di Mär 16, 2004 22:25
Beiträge: 17
Sorry für die etwas unpräzisen Angaben.

Ich benutz den Texturemanager aus dem Bombermantut für die "normalen" Texturen.
Und die Texturefonts aus demselben Tut fürs Textzeichnen.

Hab grad den texturemanager und alles andere überflüssige komplett entfernt.
hab jetzt nur noch die texturefonts aus dem tut drin. ändert trotzdem nichts.

Als Exception kommt:

Benachrichtigung über Debugger-Exception
Im Projekt EarthDefender.exe ist eine Exception der Klasse EAcessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 00490FA5 in Modul 'EarthDefender.exe'. Lesen von Adresse 00000008' aufgetreten.

Danach springt er zur Zeile "FontTexture.Bind" der "TTexFont.Print2d" aus "BombermanFont.pas"

Das merkwürdige ist ja, dass es funzt, wenn der zeichencode im mainform drinsteht, aber sobald er in ne andere unit ausgelagert wird gehts nimmer.

Wenns hilft hier der Code:

Mainform:
Code:
  1.  
  2. unit Main;
  3.  
  4. interface
  5.  
  6. uses
  7.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  8.   Dialogs,
  9.  
  10.   jpeg,
  11.   dglOpenGL,
  12.  
  13.   EDGame,
  14.   EDFonts,
  15.   StdCtrls;
  16.  
  17. type
  18.   TMainForm = class(TForm)
  19.     procedure FormResize(Sender: TObject);
  20.     procedure FormPaint(Sender: TObject);
  21.     procedure FormDestroy(Sender: TObject);
  22.     procedure ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
  23.     procedure FormCreate(Sender: TObject);
  24.   private
  25.     { Private-Deklarationen }
  26.   public
  27.     { Public-Deklarationen }
  28.     procedure GoToFullScreen(pWidth, pHeight, pBPP, pFrequency : Word);
  29.   end;
  30.  
  31. var
  32.   MainForm: TMainForm;
  33.  
  34. implementation
  35.  
  36. {$R *.dfm}
  37.  
  38.  
  39. // =============================================================================
  40. //  TMainForm.GoToFullScreen
  41. // =============================================================================
  42. //  Wechselt in den mit den Parametern angegebenen Vollbildmodus
  43. // =============================================================================
  44. procedure TMainForm.GoToFullScreen(pWidth, pHeight, pBPP, pFrequency : Word);
  45. var
  46.   dmScreenSettings : DevMode;
  47. begin
  48.   // Fenster vor Vollbild vorbereiten
  49.   WindowState := wsMaximized;
  50.   BorderStyle := bsNone;
  51.   ZeroMemory(@dmScreenSettings, SizeOf(dmScreenSettings));
  52.   with dmScreenSettings do begin
  53.     dmSize              := SizeOf(dmScreenSettings);
  54.     dmPelsWidth         := pWidth;                    // Breite
  55.     dmPelsHeight        := pHeight;                   // Höhe
  56.     dmBitsPerPel        := pBPP;                      // Farbtiefe
  57.     dmDisplayFrequency  := pFrequency;                // Bildwiederholfrequenz
  58.     dmFields            := DM_PELSWIDTH or DM_PELSHEIGHT or DM_BITSPERPEL or DM_DISPLAYFREQUENCY;
  59.   end;
  60.   if (ChangeDisplaySettings(dmScreenSettings, CDS_FULLSCREEN) = DISP_CHANGE_FAILED) then begin
  61.     MessageBox(0, 'Konnte Vollbildmodus nicht aktivieren!', 'Error', MB_OK or MB_ICONERROR);
  62.     exit
  63.   end;
  64. end;
  65.  
  66. // =============================================================================
  67. //  TMainForm.FormCreate
  68. // =============================================================================
  69. //  Initialisiert das Hauptfenster MainForm
  70. // =============================================================================
  71. procedure TMainForm.FormCreate(Sender: TObject);
  72. begin
  73.   ChDir(ExtractFilePath(Application.ExeName));
  74.   Game:=TedGame.Create;
  75.   //MainForm.BorderStyle := bsNone;
  76.   //MainForm.FormStyle := fsStayOnTop;
  77.   MainForm.Width   := 640;
  78.   MainForm.Height  := 480;
  79.   MainForm.Position:= poDesktopcenter;
  80.   Game.Firststart  :=true;
  81.   Game.CurrentState:=GSGameStart;
  82. end;
  83.  
  84. // =============================================================================
  85. //  TMainForm.FormPaint
  86. // =============================================================================
  87. //  Sobald das Fenster sichtbar ist => Splashscreen + weitere Initialisierung
  88. // =============================================================================
  89. procedure TMainForm.FormPaint(Sender: TObject);
  90. Var
  91.   jpg : TjpegImage;
  92. begin
  93.   If Game.firststart then Begin
  94.     jpg:=TJpegImage.Create;
  95.     jpg.LoadFromFile(ExtractFilePath(Application.ExeName)+'\Textures\Special\Splashscreen.jpg');
  96.     canvas.Draw(0,0,jpg);
  97.     jpg.Free;
  98.  
  99.     { Soundengine initialisieren }
  100.  
  101.     { Texturemanager erstellen }
  102.    // Texturemanager:=TTextureManager.create;
  103.  
  104.     // Wenn gewollt, dann hier in den Vollbildmodus wechseln
  105.     // Muss vorm Erstellen des Kontextes geschehen, da durch den Wechsel der
  106.     // Gerätekontext ungültig wird!
  107.     // GoToFullscreen(1600, 1200, 32, 75);
  108.     // OpenGL-Funtionen initialisieren
  109.     InitOpenGL;
  110.     // Gerätekontext holen
  111.     DC := GetDC(Handle);
  112.     // Renderkontext erstellen (32 Bit Farbtiefe, 24 Bit Tiefenpuffer, Doublebuffering)
  113.     RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  114.     // Erstellten Renderkontext aktivieren
  115.     ActivateRenderingContext(DC, RC);
  116.     // Tiefenpuffer aktivieren
  117.     glEnable(GL_DEPTH_TEST);
  118.     // Nur Fragmente mit niedrigerem Z-Wert (näher an Betrachter) "durchlassen"
  119.     glDepthFunc(GL_LESS);
  120.     // Löschfarbe für Farbpuffer setzen
  121.     glClearColor(0,0,0,0);
  122.     // Displayfont erstellen
  123.    // BuildFont('MS Sans Serif');
  124.     // Idleevent für Rendervorgang zuweisen
  125.     Application.OnIdle := ApplicationEventsIdle;
  126.     // Frequenz des Hochpräzisionstimers ermitteln
  127.     QueryPerformanceFrequency(PerfCounterFreq);
  128.     // ================================
  129.  
  130.     // texturen einlesen ( braucht ogl)
  131.   //  TextureManager.AddTexturesInDir(ExtractFilePath(Application.ExeName)+'\Textures','*');
  132.     TextureFont := TTexFont.Create(ExtractFilePath(Application.ExeName)+'\Textures\Special\Arial-256x256.bmp');
  133.  
  134.     with Game do begin
  135.       OwnerForm := @MainForm;
  136.       CurrentState:=GSMainMenue;
  137.       Firststart:=false;
  138.       OwnerForm^.windowState:=wsmaximized;
  139.     end;
  140.   End;
  141. end;
  142.  
  143. // =============================================================================
  144. //  TMainForm.FormDestroy
  145. // =============================================================================
  146. //  Alles wieder deactivieren + freigeben
  147. // =============================================================================
  148. procedure TMainForm.FormDestroy(Sender: TObject);
  149. begin
  150.   // TextureManager freeen
  151. //  Texturemanager.free;
  152.   Texturefont.free;
  153.   Game.free;
  154.   // Renderkontext deaktiveren
  155.   DeactivateRenderingContext;
  156.   // Renderkontext "befreien"
  157.   wglDeleteContext(RC);
  158.   // Erhaltenen Gerätekontext auch wieder freigeben
  159.   ReleaseDC(Handle, DC);
  160.   // Falls wir im Vollbild sind, Bildschirmmodus wieder zurücksetzen
  161.   ChangeDisplaySettings(devmode(nil^), 0);  
  162. end;
  163.  
  164. // =============================================================================
  165. //  TMainForm.resize
  166. // =============================================================================
  167. //  GL anneues Fenster anpassen
  168. // =============================================================================
  169. procedure TMainForm.FormResize(Sender: TObject);
  170. begin
  171.   If Game.CurrentState<>GSGameStart Then Begin
  172.     glViewport(0, 0, mainform.ClientWidth, Mainform.ClientHeight);
  173.     //Projektionsmatrix resetten
  174.     glMatrixMode(GL_PROJECTION);
  175.     glLoadIdentity();
  176.     //Perspektivische Darstellung
  177.     gluPerspective(45.0,ClientWidth/ClientHeight,NearClipping,FarClipping);// Calculate The Aspect Ratio Of The Window
  178.     glMatrixMode(GL_MODELVIEW);
  179.     glLoadIdentity;
  180.   End;
  181. end;
  182.  
  183. // =============================================================================
  184. //  TMainForm.ApplicationEventsIdle
  185. // =============================================================================
  186. //  Hier wird gerendert. Der Idle-Event wird bei Done=False permanent aufgerufen
  187. // =============================================================================
  188. procedure TMainForm.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
  189. Var
  190.   dt    : double;
  191.   twait : integer;
  192.  
  193. Const
  194.   EntryName : array[0..4] of String = ('Neues Spiel', 'Mitspielen', 'Readme', 'Credits', 'Spiel beenden');
  195.   EntryPos  : array[0..4] of Single = (160,190,220,250,320);
  196. Var
  197.   i                      : integer;
  198.  
  199. Begin
  200.   Queryperformancecounter(PerfCounterStart);
  201.   // Windows denken lassen, das wir noch nicht fertig wären
  202.   Done := False;
  203.   Case Game.CurrentState of
  204.     GSMainMenue: Begin
  205.        Game.DrawMainMenue;
  206.  
  207.  
  208. // Code fürs menüzeichnen (grad ohne hintergrund)
  209.   // In den orthognalen Modus wechseln und Menü zeichnen
  210.   glMatrixMode(GL_PROJECTION);
  211.   glLoadIdentity;
  212.   glOrtho(0,640,480,0,-2,2);
  213.   glMatrixMode(GL_MODELVIEW);
  214.   glLoadIdentity;
  215.   glEnable(GL_Texture_2d);
  216. //  TextureManager.BindTexture('inevitable_1024.jpg');
  217.   glDisable(gl_Depth_test);
  218.   glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT);
  219.   glColor3f(1,1,1);
  220.  { glBegin(GL_QUADS);
  221.    glTexCoord2f(0,1); glVertex3f(0, 0, 0);
  222.    glTexCoord2f(0,0); glVertex3f(0, 480, 0);
  223.    glTexCoord2f(1,0); glVertex3f(640, 480, 0);
  224.    glTexCoord2f(1,1); glVertex3f(640, 0, 0);
  225.   glEnd;}
  226.   for i := Low(EntryName) to High(EntryName) do
  227.     if i = Game.MenueSelected then
  228.       TextureFont.Print2D(EntryName[i], [230,EntryPos[i],0],[1,0.3,0.3],1,1)
  229.     else
  230.       TextureFont.Print2D(EntryName[i], [230,EntryPos[i],0],[1,1,1],1,1);
  231.   swapBuffers(DC);
  232.  
  233.  
  234.     End;
  235.     GSStartMenue: Begin
  236.       Game.DrawStartMenue
  237.     End;
  238.     GSJoinMenue: Begin
  239.       Game.DrawJoinMenue
  240.     End;
  241.     GSReadmeMenue: Begin
  242.       Game.DrawReadmeMenue
  243.     End;
  244.     GSCreditsMenue: Begin
  245.       Game.DrawCreditsMenue
  246.     End;
  247.     GSInGame: Begin
  248.    
  249.       //=== Grafik zeichnen ===
  250.       Game.DrawInGame
  251.     End;
  252.     GSEndGame: Begin
  253.       Game.DrawEndGame
  254.     End;
  255.   End;
  256.   Queryperformancecounter(PerfCounterEnd);
  257.   dt:=(PerfCounterEnd-PerfCounterstart)/PerfCounterFreq;
  258.   If dt<1/60 then Begin
  259.     twait:=trunc((1/60-dt)*1000);
  260.     sleep(twait);
  261.     QueryPerformanceCounter(PerfCounterEnd);
  262.   End;
  263.   Game.TimeFactor:=(PerfCounterEnd-PerfCounterstart)/PerfCounterFreq;
  264.   If Game.TimeFactor>0 Then FPS:=1/Game.TimeFactor;
  265. End;
  266.  
  267. end.
  268.  


und hier meine Gameunit mit der Alternativpos für den zeichencode:
Code:
  1.  
  2. unit EDGame;
  3.  
  4. interface
  5.  
  6. uses
  7.   Windows,
  8.   Classes,
  9.   IniFiles,
  10.   SysUtils,
  11.   Forms,
  12.   Math,
  13.  
  14.   dglOpenGL,
  15.   glBMP,
  16.   EDFonts;
  17.  
  18. Const GSGameStart   = 0;
  19.       GSMainMenue   = 1;
  20.       GSStartMenue  = 2;
  21.       GSJoinMenue   = 3;
  22.       GSReadmeMenue = 4;
  23.       GSCreditsMenue= 5;
  24.       GSInGame      = 6;
  25.       GSEndGame     = 7;
  26.       nearclipping  = 1;
  27.       farclipping   = 1e5;
  28.  
  29.  
  30. Type
  31.  
  32. //=== TEDGame ==================================================================
  33. TEDGame = class(Tobject)
  34.   Public
  35.     TimeFactor          : Single;              // Berechneter Zeitfaktor um Bewegungen geschwindigkeitsunabhängig zu machen
  36.     OwnerForm           : ^TForm;
  37.     CurrentState        : Word;                // Die Szene in der unsere Statemachine sich gerade befindet
  38.     Firststart          : boolean;
  39.     MenueSelected       :integer;
  40.     Procedure DrawMainMenue;
  41.     Procedure DrawStartMenue;
  42.     Procedure DrawJoinMenue;
  43.     Procedure DrawReadmeMenue;
  44.     Procedure DrawCreditsMenue;
  45.     Procedure DrawInGame;
  46.     procedure DrawEndGame;
  47. end;
  48.  
  49. //...
  50.  
  51.  
  52. var
  53.   Game                                    : TEDGame; // Unsere Spielinstanz
  54.   Player                                  : array of TPlayer;
  55.   KIPlayer                                : array of TKIPlayer;
  56.   NWPlayer                                : array of TNWPlayer;
  57.   PerfCounterFreq,PerfCounterStart,
  58.   PerfCounterEnd                          : Int64;   // Frequenz des Hochpräzisionstimers
  59.   RC                                      : HGLRC;   // Der OpenGL-Renderkontext
  60.   DC                                      : HDC;     // Der GeräteKontext dem der OpenGL-Renderkontext zugewiesen wird
  61.  // TextureManager                          : TTextureManager;
  62.   TextureFont                             : TTexFont;
  63.   FPS                                     : Single;
  64.  
  65. implementation
  66.  
  67.  
  68. // =============================================================================
  69. // =============================================================================
  70. //  TEDGame
  71. // =============================================================================
  72. // =============================================================================
  73.  
  74. // =============================================================================
  75. //  TEDGame.DrawMainMenue
  76. // =============================================================================
  77. Procedure TEDGame.DrawMainMenue;
  78.  
  79. Begin
  80.  
  81.  // ALTERNATIVPOSITION für den ZeichenCode
  82.  
  83.   If high(getasynckeystate(VK_up))=$128 then begin
  84.     dec(MenueSelected);
  85.     If (MenueSelected<=0) Then MenueSelected:=1;
  86.   End;
  87.   If High(getasynckeystate(VK_down))=$128 then begin
  88.     inc(MenueSelected);
  89.     If (MenueSelected>5) Then MenueSelected:=5;
  90.   End;
  91.   Game.OwnerForm^.Caption:='MainMenue '+FloatToStr(fps);
  92. End;
  93.  
  94.  
  95. //...
  96.  
  97. end.
  98.  
[/code]


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 07, 2005 12:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also der Fehler ist ein nicht initialisierter Pointer. Da wird versuchst auf etwas zu zugreifen was noch nicht initialisiert oder erstellt worden ist. Was das genau ist, kann ich jetzt so auf anhieb nicht finden. Du solltest deine Anwendung mal debuggen. Bzw stück für Stück durchgehen und dir mal anschauen ob die Klassen alle schön erstellt werden und wo genau der Fehler auftritt.

Ich gehe mal davon aus, dass der OpenGL Code der sich in OnIdle in dem Case befindet ist der den du in Game.DrawMainMenue; eingefügt hattest und dann kracht es? Wobei ich zusagen muss, dass ich da so jetzt nichts offensichtlich falsches gefunden habe. Einige gewöhnungsbedürftige Konstrukte aber das dürfte am Originalcode liegen.

Die glBMP ist bei dem TutorialCode dabei gewesen, oder? Und das zu ladende Bild existiert auch?

Sonst kann ich dir jetzt so spontan nur empfehlen mal zu versuchen den Code zu debuggen. Evtl findest du den übeltäter ja selber. Wenn das nicht der Fall sein sollte musst du wohl mal den kompletten Code rausrücken. Also dann per mail so, dass sich einer von uns mal den Code ansehen kann. Im Forum anhängen dürfte nicht, da es wohl zu groß ist. Wobei ich auch nicht weiß wie groß das Projekt insgesammt so ist.

Um noch etwas anderes was nicht zum Thema passt. Ich weiß nicht ob es so praktisch ist, wenn du große Teile aus dem Tutorial übernimmst. Klar es ist jetzt das einfachste. Aber ich glaube der Lerneffekt ist nicht sonderlich groß und das Bomberman ist mit Sicherheit auch nicht auf dein Programm zugeschnitten.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 07, 2005 13:53 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das Bomberman Tut wurde von Sascha ja hauptsächlich dazu geschrieben (jedenfalls denke ich das), damit Anfänger mal sehen, wie man ein größeres Projekt gliedern/strukturieren sollte. Es war nicht als CopyPaste Vorlage gedacht. Das würde auch gar nicht zu Sascha passen....der wollte eh lieber, dass man selber was probiert und weniger kopiert.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 08, 2005 10:10 
Offline
DGL Member

Registriert: Di Mär 16, 2004 22:25
Beiträge: 17
Au Mann!!!

hab die Variable meines TextureFont-Objekts 2mal in unterschiedlichen units deklariert.
Harrr...
aber wieso schluckt das delphi einfach so?

Gruß Steffen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 08, 2005 10:30 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Das ist halt so. Finde ich persönlcih auch nicht schlimm. Du kannst auch Klassen doppelt definieren. Dann musst du entsprechend nur angeben welche Klasse du haben willst. Also Windows.TBitmap oder Graphics.TBitmap.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 09, 2005 00:17 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Immer noch besser als das IFDEF gewurschtel unter C ;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 09, 2005 00:20 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Es kommt auch auf die Reihenfolge der Units bei der Uses Anweisung an. Es werden zuerst die Klassen in den zuletzt eingebundenen Units genommen.

Zitat:
Immer noch besser als das IFDEF gewurschtel unter C

In C ist das ja totales Gefrickel mit den Headern.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 09, 2005 00:24 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
LarsMiddendorf hat geschrieben:
Es kommt auch auf die Reihenfolge der Units bei der Uses Anweisung an. Es werden zuerst die Klassen in den zuletzt eingebundenen Units genommen.


Wobei sowas echt mies gelöst ist. Da sollte ein Compiler schon nen Fehler melden, oder zumindest ne Warnung "Klasse X in Unit Y überdeckt deklaration aus Unit Z".


LarsMiddendorf hat geschrieben:
In C ist das ja totales Gefrickel mit den Headern.


Wem sagst du das... wenn plötzlich der Compiler einen unbedarften Delphientwickler anschreit wegen einer "doppelt deklarierten" Konstante, und die Konstante existiert nur in einem Header, dann guckt man schon ganz schön in die Röhre... :wink:

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 09, 2005 02:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 24, 2005 22:44
Beiträge: 29
Zitat:
In C ist das ja totales Gefrickel mit den Headern.
Zitat:
Immer noch besser als das IFDEF gewurschtel unter C


Na na, denkt bloß nicht, dass ihr hier unbeobachtet seit. :lol:
Es soll auch User hier geben die sich für OpenGL interessieren aber C verwenden und nicht Delphi. :lol:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 09, 2005 08:47 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Sunny hat geschrieben:
Na na, denkt bloß nicht, dass ihr hier unbeobachtet seit. :lol:
Es soll auch User hier geben die sich für OpenGL interessieren aber C verwenden und nicht Delphi. :lol:

Wie? Sag bloß du benutzt C? Phob: Wir hätten hier mal nen Account der gesperrt werden müsste. ;-)
Kleiner Scherz. Es ist ja jedem selbst überlassen was er macht. Habe auch ne Zeit lang C/C++ programmiert finde Pascal was das angeht aber einfach logischer und schicker.

@Flash: Doppelte Klassen per Compilerfehler zu sperren halte für gar keine gute Idee. Klar ist es verwirrend und idiotisch, wenn man zwei Klassen hat aber stell dir mal vor du benutzt 2 externe Bibliotheken die du kompiliert (dcu) einbinden musst, weil die Quellen nicht offen sind. Wenn die rein zufällig gleich heißen hast du ein echtes Problem. Da kannste dann nix gegen tun. Und dann sind mir doppelte Klassen wesentlich lieber. ;-)


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 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.010s | 14 Queries | GZIP : On ]