| Autor |
Beitrag |
mimi
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Sa 24.07.04 17:44
Hallo,
ich habe eine variable die ist vom typ TGrafik
das sieht z.b. so aus:
Delphi-Quelltext 1: 2: 3: 4:
| TGrafik = class public procedure DrawText(Text:String;x,y,s:integer); end; |
so diese procedure rufe ich jetzt in meiner spiele klasse auf aber sie weiß jetzt nicht ob es die openGL oder DX komponenten samlung ist die ich verwende.....
also:
ich habe eine klasse namens Grafik von Tgrafik jetzt soll es noch eine GL und eine DX klasse geben, jedoch: weiß die spiele klasse nicht was jetzt dran ist: openGL oder DX
das lege ich woanders fest, und zurlauf zeit soll man auch entscheiden können zwischen openGL oder dx:
ps:
ich kann werder openGl noch dx ich verwende komponenten samlungen *G*
ich hoffe ihr habt das problem verstnaden eigetnlich möchte ich nur entscheiden ob openGL oder DX verwendet wird aber wie ???? Moderiert von Peter Lustig: Topic aus VCL (Visual Component Library) verschoben am Sun 25.07.2004 um 13:44
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
sourcehunter
      
Beiträge: 482
Win XP | Suse 10.1
Delphi 2005 Pers.
|
Verfasst: Sa 24.07.04 21:29
Da legst du eine globale Variable an, in der du speicherst, was für eine Komponentensammlung du benutzt. Und jedesmal, wenn er etwas zeichnen soll, dann machst du eine Abfrage, welchen Wert diese Variable hat und nimmst dann die entsprechende Prozedur zum malen.
_________________ Linux und OpenSource rulez!
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Sa 24.07.04 21:43
habe ich mir auch schon überlegt, geht das denn nicht irgenwie andres ???
ich habe irgenwas von intervase(oder wie das heißt) gehört bzw. irgenwas mit virtulle klasse oder sowas....
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 25.07.04 03:33
Yip. Geht eigentlich ganz einfach:
Delphi-Quelltext 1: 2: 3: 4: 5:
| type TGrafik = class public Procedure MachWas1(const Parameter); virtual; abstract; end; |
Und dann jeweils für OpenGL und DX:
Delphi-Quelltext 1: 2: 3: 4: 5:
| type TOpenGLGrafik = class(TGrafik) public Procedure MachWas1(const Parameter); override; end; |
Delphi-Quelltext 1: 2: 3: 4: 5:
| type TDirectXGrafik = class(TGrafik) public Procedure MachWas1(const Parameter); override; end; |
Achso: TGrafik braucht keine Implementation, weil MachWas1 abstract ist, geht dafür aber auch nicht zu instantiieren.
Zur Laufzeit dann einfach je nach zu benutzender Bibliothek TOpenGLGrafik oder TDirectXGrafik instantiieren und der Variable:
Delphi-Quelltext
zuweisen.
Dann brauchst du nur noch für TOpenGLGrafik und TDirectXGrafik die Implementation schreiben. Delphi weiß dann selber, welche Funktion es aufrufen muss.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: So 25.07.04 09:17
vieln dank, werde ich so mal gleich testen *G*
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: So 25.07.04 09:35
ich habe jetzt zwei units angelegt eine names G
inhalt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| unit g;
interface uses Graphics; type
TGrafik = class public procedure DrawText(Text:String; x,y,Size:Integer; Color:TColor) virtual; abstract; end;
implementation
end. |
eine namnes DX, inhalt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| unit DX; uses g;
interface TDX = class(TGrafik) public procedure DrawText(Text:String; x,y,Size:Integer; Color:TColor); override;
end; implementation
procedure TDX.DrawText(Text:String; x,y,Size:Integer; Color:TColor); override; begin end;
end. |
jetzt gibt der complier folgende meldung aus:
[Fehler] g.pas( : Unbekannte Anweisung: 'virtual'
warum was habe ich falsch gemacht ?
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
raziel
      
Beiträge: 2453
Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
|
Verfasst: So 25.07.04 09:44
_________________ JSXGraph
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: So 25.07.04 09:51
danke *G* daran hast gelegen, ist mir garnicht aufgefallen, mal sehen wo es jetzt hacken wird *G*
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: So 25.07.04 10:00
vieln dank, es hat funktioniert !!! bis jetzt ohne Fehler *G*
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: So 25.07.04 10:58
jetzt habe ich ein problem mit gleichnamigen funktions namen aberu unterschiedlichen parameter listen:
in der grafik klasse:
Delphi-Quelltext 1: 2:
| procedure DrawImage(ImageIndex, ImageP, x,y:Integer);virtual; abstract; procedure DrawImage(ImageIndex:String; ImageP, x,y:Integer);virtual; abstract;overload; |
in meiner DX klasse:
Delphi-Quelltext 1: 2:
| procedure DrawImage(ImageIndex, ImageP, x,y:Integer); override; procedure DrawImage(ImageIndex:String; ImageP, x,y:Integer);overload; |
und ich weiß einfach nicht warum...
es gibt immer die fehlermeldung:
| Zitat: | | [Fehler] g.pas(15): Die überladene Prozedur 'DrawImage' muss mit der Direktive 'overload' gekennzeichnet sein |
aus
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
raziel
      
Beiträge: 2453
Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
|
Verfasst: So 25.07.04 10:59
Steht doch in der Fehlermeldung...
Du musst JEDE Version der überladenen Funktion mit overload deklarieren!
raziel
_________________ JSXGraph
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: So 25.07.04 12:16
habe ich gemacht:
in der dx unit:
Delphi-Quelltext 1: 2:
| procedure DrawImage(ImageIndex, ImageP, x,y:Integer); overload; procedure DrawImage(ImageIndex:String; ImageP, x,y:Integer);overload; |
in der g unit:
Delphi-Quelltext 1: 2:
| procedure DrawImage(ImageIndex, ImageP, x,y:Integer);virtual; abstract; procedure DrawImage(ImageIndex:String; ImageP, x,y:Integer);virtual; abstract; |
die fehlermeldung kommt immer noch:
| Zitat: | | [Fehler] g.pas(15): Die überladene Prozedur 'DrawImage' muss mit der Direktive 'overload' gekennzeichnet sein |
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: So 25.07.04 12:17
ok, gelöst ich habe einfach overload alls aller ersten genommen:
Delphi-Quelltext 1: 2:
| procedure DrawImage(ImageIndex, ImageP, x,y:Integer);overload;virtual; abstract; procedure DrawImage(ImageIndex:String; ImageP, x,y:Integer);overload;virtual; abstract; |
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: So 25.07.04 12:22
jetzt bekomme ich einen laufzeit fehler:
| Zitat: | ---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt BreakOut.exe ist eine Exception der Klasse EAbstractError aufgetreten. Meldung: 'Abstrakter Fehler'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK Hilfe
--------------------------- |
und er wird ausgelöst sobalt ich Drawimage aufrufe warum ???
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: So 25.07.04 12:41
problem gelöst und behoben.
das ist ja richtig aufregen mit der OOP zu arbeiten *G*
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: So 25.07.04 13:00
Jetzt habe ich leider wider ein neues problem und zwar:
ich wollte den player in einer eigen klasse verpacken das habe ich auch gemacht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| unit player;
interface
uses b;
Type TPlayer = class(TBO) x,y:Integer; constructor Create; public procedure MovePlayer(NeuX: Integer);
private
end;
implementation
constructor TPlayer.Create; begin end;
procedure TPlayer.MovePlayer(NeuX:Integer); begin if (GetMapSize.MapX <= NeuX) then x:=NeuX; end;
end. |
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66:
| und die rufe ich so auf: unit b;
interface
uses g, dx, og,dialogs,Graphics,forms;
const MapX = 39; MapY = 23; MapS = 16;
type TMapSize = record MapX, MapY, MapS:Integer; end;
TBO = class constructor Create(GrafikL:Integer;F1:TForm); public GFL:TGrafik; function GetMapSize:TMapSize; private procedure Draw; end;
implementation
uses tools,player;
var Player:TPlayer;
function TBO.GetMapSize:TMapSize; begin result.MapX:=MapX; result.MapY:=MapY; result.MapS:=MapS; end;
constructor TBO.Create(GrafikL:Integer;F1:TForm); begin if (GrafikL <> 0 ) and (GrafikL <> 1 ) then begin Showmessage('Grafik Lib nicht angeben !'); Exit; end;
if GrafikL = 0 then GFL:=TDX.Create; if GrafikL = 1 then GFL:=TGL.Create; GFL.onDraw:=Draw; GFL.Init(F1,GetExeDir + 'image\images.txt'); player:=Player.Create; end;
procedure TBo.Draw; begin GFL.DrawImage('B',0,0,0); GFL.DrawImage('D',0,0,385);
GFL.DrawImage('P',0,player.x,player.y); end;
end. |
jetzt gibs folgende Fehlermeldung beim starten des programms:
| Zitat: | ---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt BreakOut.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 004035D9 in Modul 'BreakOut.exe'. Lesen von Adresse 00000000'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK Hilfe
--------------------------- |
und was ich auch noch gerne wissen wollte ist, warum erhalte ich folgende warnungen:
Delphi-Quelltext 1: 2: 3:
| [Warnung] b.pas(48): Instanz von 'TGL' mit der abstrakten Methode 'TGrafik.DrawImage' wird angelegt [Warnung] b.pas(48): Instanz von 'TGL' mit der abstrakten Methode 'TGrafik.DrawImage' wird angelegt [Warnung] b.pas(48): Instanz von 'TGL' mit der abstrakten Methode 'TGrafik.Init' wird angelegt |
was habe ich falsch gemacht ????
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
Phantom1
      
Beiträge: 390
|
Verfasst: So 25.07.04 13:44
Liegt warscheinlich an der Class TGL. Kannst du den Code von dieser Klasse mal posten?
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: So 25.07.04 13:51
kein problem
TGL
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| unit OG;
interface
uses dialogs,g,Graphics;
type TGL = class(TGrafik) public procedure DrawText(Text:String; x,y,Size:Integer; Color,color1:TColor); override;
end; implementation
procedure TGL.DrawText(Text:String; x,y,Size:Integer; Color,color1:TColor); begin ShowmEssage('OpenGL'); end;
end. |
diese klasse wollte ich später schreiben, sobalt alles funktionirt.... der fehler liegt ja beim installsieren vom TPlayer
TGrafik
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| unit g;
interface
uses Graphics,forms,SysUtils;
type TDraw = procedure of object;
TGrafik = class public onDraw:TDraw; procedure DrawText(Text:String; x,y,Size:Integer; Color,color1:TColor); virtual; abstract;
procedure DrawImage(ImageIndex, ImageP, x,y:Integer); overload; virtual; abstract; procedure DrawImage(ImageStr:String; ImageP, x,y:Integer); overload; virtual; abstract;
procedure Init(F1:TForm; FileName:TFileName);virtual; abstract; end;
implementation
end. |
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
obbschtkuche
Gast
Erhaltene Danke: 1
|
Verfasst: So 25.07.04 13:57
Du hast DrawImage nicht implementiert, also ist die Methode immernoch Abstrakt. Wenn du sie jetzt aufrufst bekommst du wieder einen abstrakten Fehler.
Und du hast Player nie erstellt. (Player := TPlayer.Create)
|
|
|