Klasse soll Ereignisse von TForm nutzen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Hartkern
Beiträge: 69
Registriert: Sa 5. Dez 2015, 20:03
OS, Lazarus, FPC: Win10 IDE 1.6
CPU-Target: 64Bit
Wohnort: Leipzig

Klasse soll Ereignisse von TForm nutzen

Beitrag von Hartkern »

ich versuche mich derzeit an einer Klasse, welche verschiedene Kamera Modis (First Person, 3rd Person etc) in OpenGl mir berechnet und die entsprechende Matrix übergibt.

Zur Vereinfachung meines Quelltextes versuch ich alles mögliche in Klassen und Units zu kapseln.
Ich such nach einer Lösung, in welcher ich meiner Klasse im Constructor lediglich ein Form sowie ein OpenGlContext übergeben kann und später auf diese zugreifen kann, im speziellen : wie kann ich die Ereignisse des Formulars abfragen in meiner Klasse...

Ich möchte vermeiden das ich ins Formular auf den der OGL Context sich befindet, auch nur irgendwas in die Ereignisse geschrieben wird, da ich relativ schnell die Übersicht verliere :(

Hauptsächlich geht es mir um die Events KeyDown, KeyUp, MouseMove...

Mein bisheriger Ansatz scheitert...vermutlich da meine Klasse nicht weis welches Form sie benutzen soll

Code: Alles auswählen

  interface
 
uses
  Classes, SysUtils, unit2, OpenGLContext,Dialogs, Forms;
 
type
 
  { tOglCam }
 
  tOglCam = Class
    fForm : tForm;
    private
      procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
      procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    public
      constructor create(KameraMatrix : tMat44; Form:TForm; OpenGLControl : TOpenGLControl;   Modus : Integer);
      destructor free;
  end;
 
implementation
 
{ tOglCam }
 
procedure tOglCam.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState
  );
begin
  if Key = 87 then showMessage('dfff');   //w Taste --->passiert nix
end;
 
procedure tOglCam.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
 
end;
 
constructor tOglCam.create(KameraMatrix : tMat44; Form:TForm; OpenGLControl : TOpenGLControl;   Modus : Integer);
begin
  //Modus 1 FPS Kamera Steuerung
  fForm := Form;
end;
 
destructor tOglCam.free;
begin
  //was auch immer da rein soll bis jetzt
end;
 
end.                                                                           

Mathias
Beiträge: 6207
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Klasse soll Ereignisse von TForm nutzen

Beitrag von Mathias »

Code: Alles auswählen

constructor create(KameraMatrix : tMat44; Form:TForm; OpenGLControl : TOpenGLControl;   Modus : Integer);


So was ähnliches habe ich auch gemacht.
Ich habe eine Classe TOpenGL, welche den OpenGLControl erzeugt und das ganze OpenGL-Zeugs iniziallisiert.
Anstelle von TForm habe ich TWinControl genommen, dann bist du nicht auf das Form beschränkt, sondern du kannst deine Animation zB. auch auf ein Panel rendern.
Dort werden auch die MouseEvents behandelt, welche dort manuell über OnMousexxx erzeugt werden.

Dann habe ich noch eine Camera-Classe, welche auch in TOpenGL eingebunden ist.
Für Kamera-Bewegungen werden Daten von TOpenGL in die Camera-Classe geschrieben.

Eine Classe für VAO habe ich auch, welche die Matrix aus der Camera-Classe ausliest und per Uniform an den Shader übergibt.
Schlussendlich ist das Ganze eine recht komplexe Sache, da steckt mehrere Monate lange Arbeit dahinter.

Dafür habe ich jetzt einen grossen Vorteil, im Haupt-Form, habe ich fast nichts mehr von OpenGL, es läuft fast alles im Hintergrund.

Für die Tastatur wird dies auf einem ähnlichen Weg gehen, aber dies habe ich nicht eingebaut, mir reicht die Maus dafür.

PS: So nebenbei hast du für die VAOs und VBOs auch schon Classen ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Hartkern
Beiträge: 69
Registriert: Sa 5. Dez 2015, 20:03
OS, Lazarus, FPC: Win10 IDE 1.6
CPU-Target: 64Bit
Wohnort: Leipzig

Re: Klasse soll Ereignisse von TForm nutzen

Beitrag von Hartkern »

wie bekomme ich Zugriff innerhalb der Klasse auf ein TWinControl oder in meinem Fall auf die Events des Forms?

Mathias
Beiträge: 6207
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Klasse soll Ereignisse von TForm nutzen

Beitrag von Mathias »

Reicht dir das als Demo ?

Eine Toolbar und ein Menu kann man einbauen, so das es mit den Tasten auch geht. Aber bei einem 2. Panel gehen die Tasten nicht mehr.
Dateianhänge
Event_Test.zip
(125.18 KiB) 66-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten