Was man alles mit Classen machen kann

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 6899
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Was man alles mit Classen machen kann

Beitrag von Mathias »

Heute habe ich etwas probiert, ganze Classen einer Procedure übergeben.
Somit kann man viel Code sparen.
Ich hätte nicht gedacht, das dies funktioniert.

TStandRohr, TStandRohrSchnitt, etc. sind alles Nachkommen von TKoerper.

Code: Alles auswählen

 
var
    StandRohr: TStandRohr;
    StandRohrSchnitt: TStandRohrSchnitt;
 
    Stutzen: TStutzen;
    StutzenSchnitt: TStutzenSchnitt;
    RohrFlansch: TRohrFlansch;   
 
.................
 
  procedure Draw(Koerper, Schnitt: TKoerper; var Matrix: TMatrix; Geschnitten: boolean);
  begin
    Koerper.Draw(Matrix);
    if Geschnitten then begin
      if Schnitt <> nil then begin
        Schnitt.Draw(Matrix);
      end;
    end else begin
      MatrixModif.SpiegelnX(Matrix);
      OpenGL.SwapFrontFace;
      Koerper.Draw(Matrix);
      OpenGL.SwapFrontFace;
    end;
  end;     
 
 
// StandRohr
 
  FlugelMatrix := AnzeigerPosMatrix;
  Draw(StandRohr, StandRohrSchnitt, FlugelMatrix, Geschnitten);
 
  // Stutzen unten
 
  FlugelMatrix := AnzeigerPosMatrix;
  Draw(Stutzen, StutzenSchnitt, flugelMatrix, Geschnitten);
 
  // Stutzen oben;
 
  FlugelMatrix := AnzeigerPosMatrix;
  MatrixModif.Translate(FlugelMatrix, 0.0, TUrAnzeiger.AnzeigerMasse.StandRohr.L, 0.0);
  Draw(Stutzen, StutzenSchnitt, FlugelMatrix, Geschnitten);
 
  // RohrFlansch
 
  FlugelMatrix := AnzeigerPosMatrix;
  Draw(RohrFlansch, nil, FlugelMatrix, Geschnitten);  
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

t-z
Beiträge: 49
Registriert: So 22. Nov 2009, 18:12
OS, Lazarus, FPC: Windows 7 Professional 64Bit / Kubuntu 10.04 (Lazarus 0.9.28.2 64 Bit FPC 2.2.4)
CPU-Target: Intel i5-760

Re: Was man alles mit Classen machen kann

Beitrag von t-z »

Die ist ein ganz normales Vorgehen. Wenn du dir z.B. die GUI-Programmierung mit der LCL ansiehst, wirst du feststellen, dass dies dort 1000de male passiert.

Wenn man es genau nimmt, besteht aber doch ein großer Unterschied: Anders wie bei den Grunddatentypen wird keine Kopie des Variablenwerts angelegt, sondern die Adresse, wo die Komplexe Variable gespeichert ist (Zeiger - Call by Reference).

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

Re: Was man alles mit Classen machen kann

Beitrag von Mathias »

Wenn du dir z.B. die GUI-Programmierung mit der LCL ansiehst, wirst du feststellen, dass dies dort 1000de male passiert.
Stimmt, dort steht überall : Sender: TObject. Nur weis ich nicht, was man mit dem Sender anfangen kann.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

t-z
Beiträge: 49
Registriert: So 22. Nov 2009, 18:12
OS, Lazarus, FPC: Windows 7 Professional 64Bit / Kubuntu 10.04 (Lazarus 0.9.28.2 64 Bit FPC 2.2.4)
CPU-Target: Intel i5-760

Re: Was man alles mit Classen machen kann

Beitrag von t-z »

Über den Parameter Sender: TObject hat man die Volle Kontrolle über das Objekt, dass das Event ausgelöst hat. Als kleinster gemeinsamer Teiler wird die Klasse TObject genutzt. Man kann diese aber auch auf den ursprünglichen Datentyp casten und somit die volle Kontrolle "wiedergewinnen". Ein Kleines Beispiel hier:

Code: Alles auswählen

 TButton(Sender).Caption:='Hallo Welt';
bzw. der Volle Quelltext:

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  TButton(Sender).Caption:='Hallo Welt';
end;
 
end.
 
Spätestens hier merkt man, dass es sich um einen Zeiger handelt, denn eine Variable des Typs TObject kennt keine Property "Caption".

t-z
Beiträge: 49
Registriert: So 22. Nov 2009, 18:12
OS, Lazarus, FPC: Windows 7 Professional 64Bit / Kubuntu 10.04 (Lazarus 0.9.28.2 64 Bit FPC 2.2.4)
CPU-Target: Intel i5-760

Re: Was man alles mit Classen machen kann

Beitrag von t-z »

und mir ist noch was hilfreiches eingefallen: Wird eine Instanz einer Visuellen Komponente eingefügt (egal ob zur Laufzeit durch deinen Code oder zur Designzeit im Fenster-Editor), dann wird sie auch im jeweiligen Eltern-Element (in der Regel das Fenster) unter Components[] eingetragen z.B.

Code: Alles auswählen

TForm1.Components[0]
Du kannst nun weiterhin auf alle Instanzen zugreifen auch wenn du folgendes machst:

Code: Alles auswählen

Button1:=TButton.Create()
Button1.Caption:=...
...
Button1:=TButton.Create()
Das ganze ist dann aber ein bischen tricky. Also besser gleich nen Array nehmen um mehrere Instanzen zur Laufzeit zu erzeugen. Das wird dann übersichtlicher.

Antworten