class - read/write

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

class - read/write

Beitrag von Mathias »

Muss ich in KreisTabelleBerechen mit Sektoren oder mit FSektoren arbeiten ?

Code: Alles auswählen

 TKoerper = class(TObject)
  private
    Kreistab: array of record
      x, y: GLfloat;
    end;
    FSektoren: integer;
    procedure SektorenWrite(Sektoren: integer);
    procedure KreisTabelleBerechen;
  public
    constructor Create; virtual;
    destructor Destroy; override;
    property Sektoren: integer read FSektoren write SektorenWrite;
  end;         
 
procedure TKoerper.SektorenWrite(Sektoren: integer); inline;
begin
  FSektoren := Sektoren;
end;
 
procedure TKoerper.KreisTabelleBerechen;
var
  i: integer;
begin
  SetLength(Kreistab, Sektoren + 1);
  for i := 0 to Sektoren do begin
    with Kreistab[i] do begin
      x := Sin1(i * 360 / Sektoren);
      y := Cos1(i * 360 / Sektoren);
    end;
  end;
end;      
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: class - read/write

Beitrag von theo »

Spielt in diesem Fall eigentlich keine Rolle, afaics.
Du kannst aber innerhalb der Klasse mit FSektoren arbeiten.

Tipp: KreisTabelleBerechnen

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: class - read/write

Beitrag von Socke »

Mathias hat geschrieben:Muss ich in KreisTabelleBerechen mit Sektoren oder mit FSektoren arbeiten?
Da Sektoren direkt auf FSektoren geht, ergibt das technisch keinen Unterschied.

Erst wenn du anstatt direkt auf eine Variable zuzugreifen eine Funktion, die die Eigenschaft ermittelt, angibst, hast du einen Unterschied. Dann musst du dir die Frage stellen: Will ich den internen, unverfälschten Wert oder will ich den Wert, der ggf. von Außen sichtbar ist?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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

Re: class - read/write

Beitrag von Mathias »

Welche Variable nimmt man üblicherweise ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2809
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: class - read/write

Beitrag von m.fuchs »

Das kommt darauf an. Wenn die Property auf eine Prozedur zugreift, die auch gleichzeitig andere Dinge macht (Validierung, Statusänderung. o.Ä.) und man dies auch durchführen möchte, kann man auch die Proeprty benutzen. Oder die Prozedur direkt aufrufen.

In deinem Fall würde ich die private Variable FSektoren benutzen. Da deine Prozedur SektorenWrite aber sowieso nichts anderes als die Zuweisung macht, würde ich auch darauf verzichten:

Code: Alles auswählen

TKoerper = class(TObject)
  private
    Kreistab: array of record
      x, y: GLfloat;
    end;
    FSektoren: integer;
    procedure KreisTabelleBerechen;
  public
    constructor Create; virtual;
    destructor Destroy; override;
    property Sektoren: integer read FSektoren write FSektoren;
  end;         
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

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

Re: class - read/write

Beitrag von Mathias »

Ich habe eine kleine Demo geschrieben, welches die Property-Funtionen demonstriert.

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  SysUtils, Forms, StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    ButtonDurchmesser: TButton;
    ButtonRadius: TButton;
    ButtonUmfang: TButton;
    Edit1: TEdit;
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    LabelDurchmesser: TLabel;
    LabelUmfang: TLabel;
    LabelRadius: TLabel;
    procedure ButtonDurchmesserClick(Sender: TObject);
    procedure ButtonRadiusClick(Sender: TObject);
    procedure ButtonUmfangClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Ausgabe;
  private
    { private declarations }
  public
    { public declarations }
  end;
 
  { TProp }
 
  TProp = class
  private
    FDurchmesser: single;
    FRadius: single;
    FUmfang: single;
    procedure SetDurchmesser(AValue: single);
    procedure SetRadius(AValue: single);
    procedure SetUmfang(AValue: single);
  published
    property Durchmesser: single read FDurchmesser write SetDurchmesser;
    property Radius: single read FRadius write SetRadius;
    property Umfang: single read FUmfang write SetUmfang;
  end;
 
var
  Form1: TForm1;
  Prop: TProp;
 
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.ButtonDurchmesserClick(Sender: TObject);
begin
  try
    Prop.Durchmesser := StrToFloat(StringReplace(Edit1.Text, '.', ',', []));
  except
    Prop.Durchmesser := 1;
  end;
  Ausgabe;
end;
 
procedure TForm1.ButtonRadiusClick(Sender: TObject);
begin
  try
    Prop.Radius := StrToFloat(StringReplace(Edit1.Text, '.', ',', []));
  except
    Prop.Radius := 1;
  end;
  Ausgabe;
end;
 
procedure TForm1.ButtonUmfangClick(Sender: TObject);
begin
  try
    Prop.Umfang := StrToFloat(StringReplace(Edit1.Text, '.', ',', []));
  except
    Prop.Umfang := 1;
  end;
  Ausgabe;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Prop := TProp.Create;
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  Prop.Free;
end;
 
procedure TForm1.Ausgabe;
begin
  LabelDurchmesser.Caption := FloatToStr(Prop.Durchmesser);
  LabelRadius.Caption := FloatToStr(Prop.Radius);
  LabelUmfang.Caption := FloatToStr(Prop.Umfang);
end;
 
{ TProp }
 
procedure TProp.SetDurchmesser(AValue: single);
begin
  FDurchmesser := AValue;
  FRadius := FDurchmesser / 2;
  FUmfang := FDurchmesser * Pi;
end;
 
procedure TProp.SetRadius(AValue: single);
begin
  FRadius := AValue;
  FDurchmesser := FRadius * 2;
  FUmfang := FDurchmesser * Pi;
end;
 
procedure TProp.SetUmfang(AValue: single);
begin
  FUmfang := AValue;
  FDurchmesser := FUmfang / Pi;
  FRadius := FDurchmesser / 2;
end;
 
end.
Dateianhänge
Zwischenablage-2.png
Zwischenablage-2.png (17.75 KiB) 1294 mal betrachtet
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten