Autor Beitrag
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Sa 24.07.04 17:44 
Hallo,
ich habe eine variable die ist vom typ TGrafik
das sieht z.b. so aus:

ausblenden 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 user profile iconPeter Lustig: Topic aus VCL (Visual Component Library) verschoben am Sun 25.07.2004 um 13:44

_________________
MFG
Michael Springwald, "kann kein englisch...."
sourcehunter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 482

Win XP | Suse 10.1
Delphi 2005 Pers.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 25.07.04 03:33 
Yip. Geht eigentlich ganz einfach:

ausblenden 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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
type
    TOpenGLGrafik = class(TGrafik)
    public
        Procedure MachWas1(const Parameter); override;
    end;


ausblenden 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:

ausblenden Delphi-Quelltext
1:
2:
var
    Grafik: TGrafik


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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: So 25.07.04 09:17 
vieln dank, werde ich so mal gleich testen *G*

_________________
MFG
Michael Springwald, "kann kein englisch...."
mimi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: So 25.07.04 09:35 
ich habe jetzt zwei units angelegt eine names G
inhalt:
ausblenden 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:
ausblenden 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(8): Unbekannte Anweisung: 'virtual'

warum was habe ich falsch gemacht ?

_________________
MFG
Michael Springwald, "kann kein englisch...."
raziel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: So 25.07.04 09:44 
mimi hat folgendes geschrieben:
(...)
ausblenden Delphi-Quelltext
1:
2:
3:
{...}
  procedure DrawText(Text:String; x,y,Size:Integer; Color:TColor) virtual; abstract;
{...}


jetzt gibt der complier folgende meldung aus:
[Fehler] g.pas(8): Unbekannte Anweisung: 'virtual'

warum was habe ich falsch gemacht ?

Du hast das ";" nach der abschließenden Klammer vergessen:
ausblenden Delphi-Quelltext
1:
  procedure DrawText(Text:String; x,y,Size:Integer; Color:TColor); virtual; abstract;					

_________________
JSXGraph
mimi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: So 25.07.04 10:00 
vieln dank, es hat funktioniert !!! bis jetzt ohne Fehler *G*

_________________
MFG
Michael Springwald, "kann kein englisch...."
mimi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: So 25.07.04 10:58 
jetzt habe ich ein problem mit gleichnamigen funktions namen aberu unterschiedlichen parameter listen:

in der grafik klasse:
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: So 25.07.04 10:59 
Steht doch in der Fehlermeldung... :roll:
Du musst JEDE Version der überladenen Funktion mit overload deklarieren!

raziel

_________________
JSXGraph
mimi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: So 25.07.04 12:16 
habe ich gemacht:
in der dx unit:
ausblenden 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: So 25.07.04 12:17 
ok, gelöst ich habe einfach overload alls aller ersten genommen:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: 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:
ausblenden 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.


ausblenden volle Höhe 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:
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.DrawText('Test1',160,300,16,clRed,clBlack);
  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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 390



BeitragVerfasst: So 25.07.04 13:44 
Liegt warscheinlich an der Class TGL. Kannst du den Code von dieser Klasse mal posten?
mimi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: So 25.07.04 13:51 
kein problem
TGL

ausblenden 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
ausblenden 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
  // Ereignis was bei onTimer ausgelöst wird
  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



BeitragVerfasst: 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)