Objektorientierung Unendlich viele Objekte mit Atributen

Antworten
Aloxen
Beiträge: 58
Registriert: Di 31. Mai 2022, 17:40

Objektorientierung Unendlich viele Objekte mit Atributen

Beitrag von Aloxen »

Ich brauche mal wieder eure Hilfe.

Ich bin mitten in OpenGL, und möchte mehrere Würfel einfügen. Damit das auch später übersichtlich wird, möchte ich eine Block = class erstellen. Um die Koordinaten eines Würfels zu erhalten, braucht der Shader eine matrix ( T_obj ). Jedes Objekt von TBlock soll eine eigene Matrix speicher können.

Code: Alles auswählen

unit Block;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils,
  dglOpenGL,
  oglContext, oglShader, oglMatrix,oglVector;

type
  TBlock = class
    private
      FT_obj: TMatrix;
    public

      property T_obj:TMatrix write FT_Obj;
  end;

implementation

end.  
In Unit 1 habe ich jetzt einen dynamischen Array vom Typ TBlock erstellt:

Code: Alles auswählen

type
  ArrayforBLock = array of TBlock;
var
 ListBlock: ArrayforBlock;
Am Anfang vor einem Aufruf setzt ich die Länge:

Code: Alles auswählen

setlength(ListBlock,2);
Jetzt das Problem. Ich muss die Matrix von jedem Objekt verändern können. Dazu hat die Unit von OGL schon alles bereitgestellt. Normalerweise würde ich zum Bewegen T_obj.Translate(2.0,0.0,0.0) schreiben.

Da kommt ein Fehler: sigsegv.

Das heißt ja, dass kein Wert in Obj gespeichert ist. Aber auch wenn ich versuche Obj als einheitsmatrix zu schreiben kommt dieser Fehler. Ich glaube es ist etwas grundlegend Falsch an der Klasse.
Ich hoffe mir kann jemand erklären wie ich die Klasse strukturieren muss und warum. Ich fange gerade an mit Klassen und Objektorientierung. Bitte für dumme erklären ^^

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 170
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Objektorientierung Unendlich viele Objekte mit Atributen

Beitrag von Jorg3000 »

Hi!
Durch SetLength(ListBlock,2) wird dem Array nur eine Länge zugewiesen, aber darin noch keine Objekte erzeugt.

Code: Alles auswählen

SetLength(ListBlock,2);
for i:=0 to Length(ListBlock)-1 do  ListBlock[i]:=TBlock.Create;
Und wenn TMatrix eine Class ist, müsste mittels TBlock constructor Create auch ein TMatrix-Objekt erzeugt werden.
Des Weiteren fehlt für T_obj vielleicht property read in TBlock.
Grüße, Jörg

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 338
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Re: Objektorientierung Unendlich viele Objekte mit Atributen

Beitrag von Niesi »

Wie Joerg schon schrieb: Du musst jedes Objekt mit einem Constructor (normalerweise Create) erzeugen und ihm auch Werte mitgeben.
Du solltest überlegen, für Deine Objekte anstelle eines Arrays eine tObjectList zu verwenden, das ist n. m. M. einfacher, weil die genau dafür da ist ...
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Benutzeravatar
theo
Beiträge: 10499
Registriert: Mo 11. Sep 2006, 19:01

Re: Objektorientierung Unendlich viele Objekte mit Atributen

Beitrag von theo »

Niesi hat geschrieben:
Sa 8. Okt 2022, 01:57
Du solltest überlegen, für Deine Objekte anstelle eines Arrays eine tObjectList zu verwenden, das ist n. m. M. einfacher, weil die genau dafür da ist ...
Ich würde auch in diese Richtung gehen, aber gleich mit Generics, dann kann man sich später das Typecasting sparen.

Code: Alles auswählen

uses fgl;
..
type
   TBlock = class
    private
      FT_obj: TMatrix;
    public
      property T_obj:TMatrix read FT_Obj write FT_Obj;
  end;

  TBlockList = class(specialize TFPGObjectList<TBlock>)
  public
  end; 

....

procedure TForm1.Button1Click(Sender: TObject);
var ABlockList:TBlockList;
begin
  ABlockList:=TBlockList.Create(true);
  ABlockList.Add(TBlock.Create);
  ABlockList.Add(TBlock.Create);
  TuWasMit ABlocklist[0].FT_obj; //Kann im Ggs. zu TObjectList direkt ohne Typecasting zugegriffen werden.
  ABlockList.Free; //Hier werden die TBlock mit freigegeben, da im Konstruktor true für "FreeObjects" steht.
end; 

Aloxen
Beiträge: 58
Registriert: Di 31. Mai 2022, 17:40

Re: Objektorientierung Unendlich viele Objekte mit Atributen

Beitrag von Aloxen »

Niesi hat geschrieben:
Sa 8. Okt 2022, 01:57
Du solltest überlegen, für Deine Objekte anstelle eines Arrays eine tObjectList zu verwenden, das ist n. m. M. einfacher, weil die genau dafür da ist ...
Danach habe ich gesucht. Ich möchte das verwenden, aber wenn ich:

Code: Alles auswählen

 var
  BlockList: TObjectList; 
schreibe kommt ERror: Identifier not found "TObjectList". Das sind meine "Uses":

Code: Alles auswählen

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics,ComCtrls,
  Dialogs, ExtCtrls, StdCtrls, Menus,
  dglOpenGL,
  oglContext, oglShader, oglMatrix,oglVector,Block; 
Warum erkennt es die Klasse TObjectlist nicht?

Benutzeravatar
theo
Beiträge: 10499
Registriert: Mo 11. Sep 2006, 19:01

Re: Objektorientierung Unendlich viele Objekte mit Atributen

Beitrag von theo »

Aloxen hat geschrieben:
Sa 8. Okt 2022, 09:16
Warum erkennt es die Klasse TObjectlist nicht?
Weil sie in Unit Contnrs ist.

Mache auf der Fehlermeldung im Nachrichtenfenster einen Rechtsklick und im Popup-Menu "Suche Bezeichner".
So kannst du die Unit selber finden.

Schau dir aber auch mein fast komplettes Beispiel mit Generics an.
Ist am Ende einfacher und nicht so beängstigend wie es klingt. :wink:

Antworten