Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Mathias
Beiträge: 6915 Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz
Beitrag
von Mathias » Fr 17. Jan 2014, 18:26
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
theo
Beiträge: 10872 Registriert: Mo 11. Sep 2006, 19:01
Beitrag
von theo » Fr 17. Jan 2014, 18:41
Spielt in diesem Fall eigentlich keine Rolle, afaics.
Du kannst aber innerhalb der Klasse mit FSektoren arbeiten.
Tipp: KreisTabelleBerechn en
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:
Beitrag
von Socke » Fr 17. Jan 2014, 22:30
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
Beitrag
von Mathias » Sa 18. Jan 2014, 14:06
Welche Variable nimmt man üblicherweise ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
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:
Beitrag
von m.fuchs » Sa 18. Jan 2014, 19:43
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
Beitrag
von Mathias » Di 25. Feb 2014, 20:22
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 (17.75 KiB) 1295 mal betrachtet
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot