Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Fehler: Der linken Seite kann nicht zu gewiesen werden.

3 views
Skip to first unread message

Anja Gehrke

unread,
Jun 21, 2004, 2:19:45 PM6/21/04
to
Hallo NG!

Ich habe mir für ein kleines Programm einen Datentyp Tpoint definiert,den
ich dann im Objekt TOffsetData weiterverwende.
Das sieht gekürzt so aus:

type
TPoint = record
X: Double;
Y: Double;
end;

type
TOffsetData = class(TObject)
private
FDrehpunkt: Tpoint; //Drehpunkt der Maschine
.
.
.
public
constructor Create;
destructor Free;
property Drehpunkt: TPoint read FDrehpunkt write FDrehpunkt;
.
.
.
end;

Das ganze verwende ich dann so:

procedure Init;
var
MyOffsets: TOffsetData;
begin
MyOffsets := TOffsetData.Create;
try
MyOffsets.Drehpunkt.x := 10.0; <--- Hier bringt dann der Kompiler die
Fehlermeldung
...
finally
FreeAndNil(MyOffsets);
end; //try
end;

Wie kommt das zustande? Ich hab auch schon versucht,
den Punkt mit
MyOffsets.Drehpunkt:=(10.0,20.5);
zuzuweisen.
Etwas in dieser Richtung wäre mir sogar lieber.

Wer hat da ein paar Ratschläge für mich.

Ciao
Anja


Joachim Pimiskern

unread,
Jun 21, 2004, 2:48:34 PM6/21/04
to
Hi,

Anja Gehrke schrieb:


> property Drehpunkt: TPoint read FDrehpunkt write FDrehpunkt;

> [...]


> MyOffsets.Drehpunkt.x := 10.0; <--- Hier bringt dann der Kompiler die


var Drehpunkt: TPoint;
begin
...
Drehpunkt := MyOffsets.Drehpunkt;
Drehpunkt.x := 10.0;
...
end;

Grüße,
Joachim

Joachim Pimiskern

unread,
Jun 21, 2004, 2:55:26 PM6/21/04
to
This message was cancelled from within Mozilla.

Mike Lischke

unread,
Jun 21, 2004, 4:08:28 PM6/21/04
to
Anja Gehrke wrote

>Wie kommt das zustande? Ich hab auch schon versucht,
>den Punkt mit
>MyOffsets.Drehpunkt:=(10.0,20.5);
>zuzuweisen.
>Etwas in dieser Richtung wäre mir sogar lieber.

An einzelne Felder in einem published Record lässt dich der Compiler nicht ran. Als Ganzes kannst du den Record mit einem Setter setzen, wie mit jeder anderen Eigenschaft auch.

Mike
--
www.soft-gems.net

Heiko Nocon

unread,
Jun 21, 2004, 4:26:10 PM6/21/04
to
Anja Gehrke wrote:

>Wie kommt das zustande?

Es geht einfach nicht, bei einem Property, das einen Record darstellt,
Werte an die einzelnen Elemente des Records zuzuweisen. Dafür kann man
z.B. zusätzliche Properties basteln.

private
FDrehpunkt: TPoint;
function GetDrehpunktX: double;
function GetDrehpunktY: double;
procedure SetDrehpunktX(Value: double);
procedure SetDrehpunktY(Value: double);
public


property Drehpunkt: TPoint read FDrehpunkt write FDrehpunkt;

property DrehpunktX: double read GetDrehpunktX write SetDrehpunktX;
property DrehpunktY: double read GetDrehpunktY write SetDrehpunktY;

implementation

function TOffsetData.GetDrehpunktX: double;
begin
Result:=FDrehpunkt.X;
end;

function TOffsetData.GetDrehpunktY: double;
begin
Result:=FDrehpunkt.Y;
end;

procedure TOffsetData.SetDrehpunktX(Value: double);
begin
FDrehpunkt.X:=Value;
end;

procedure TOffsetData.SetDrehpunktY(Value: double);
begin
FDrehpunkt.Y:=Value;
end;


>Ich hab auch schon versucht,
>den Punkt mit
>MyOffsets.Drehpunkt:=(10.0,20.5);
>zuzuweisen.
>Etwas in dieser Richtung wäre mir sogar lieber.


Na dann schreib dir doch enfach eine kleine Hilfsfunktion:

Pt(X,Y: double): TPoint;
begin
Result.X:=X;
Result.Y:=Y;
end;

MyOffsets.Drehpunkt:=Pt(10.0,20.5);

--
Wer Komponenten ohne Quelltext oder richtig miese Komponenten
oder gute Komponenten mit Quelltext, ohne die Source zu verstehen, sich verschafft,
um sie in Form "eigener" Programme in Verkehr zu bringen,
der wird mit Gefängnis nicht unter 5 Jahren bestraft.

Thomas G. Liesner

unread,
Jun 21, 2004, 7:21:27 PM6/21/04
to
Anja Gehrke schrieb:

> Ich habe mir für ein kleines Programm einen Datentyp Tpoint definiert,den
> ich dann im Objekt TOffsetData weiterverwende.

Das Problem wurde ja schon geklärt, die einfachste Lösung lautet für
sowas:

> type
TPoint = Class
public


> X: Double;
> Y: Double;
> end;

Und im Create/Destroy von Toffsetdata dann das Erzeugen/Vernichten von
FDrehpunkt nicht vergessen! Zudem sollte man sich beim Property auf den
read-Teil beschränken oder muß bei Write eine Methode aufrufen, welche
die _Felder_ anhand des übergebenen Wertes setzt, um keine toten Pointer
übrig behalten zu können.

So long,
Thomas G. Liesner
--
Hamster beta V2.0.5.5 seit 01.06.2004 verfügbar
http://tglsoft.de/ bzw. http://hamster.arcornews.de/tgl/

Anja Gehrke

unread,
Jun 22, 2004, 6:40:24 PM6/22/04
to
Thomas G. Liesner wrote:
> Das Problem wurde ja schon geklärt, die einfachste Lösung lautet für
> sowas:
>
>> type
> TPoint = Class
> public
>> X: Double;
>> Y: Double;
>> end;
Hallo Thomas,
Danke für die Tips.
Ich bin noch Newbie in der OOP. Ich habe mal gelesen,
dass man besser die Daten hinter Properties "verbirgt" zwecks Kapselung,
oder hau ich da was durcheinander?

> Und im Create/Destroy von Toffsetdata dann das Erzeugen/Vernichten von
> FDrehpunkt nicht vergessen! Zudem sollte man sich beim Property auf
> den read-Teil beschränken oder muß bei Write eine Methode aufrufen,
> welche die _Felder_ anhand des übergebenen Wertes setzt, um keine
> toten Pointer übrig behalten zu können.

FDrehpunkt ist doch nur ein einfacher record. Den muß man doch nicht
erzeugen/vernichten, um ihn verwenden zu können?

> So long,
> Thomas G. Liesner

Ciao,
Anja


Anja Gehrke

unread,
Jun 22, 2004, 6:43:45 PM6/22/04
to
Heiko Nocon wrote:
> Na dann schreib dir doch enfach eine kleine Hilfsfunktion:
>
> Pt(X,Y: double): TPoint;
> begin
> Result.X:=X;
> Result.Y:=Y;
> end;
>
> MyOffsets.Drehpunkt:=Pt(10.0,20.5);

Hallo Heiko,
danke für die ausführliche Erklärung. Das bringt endlich Licht ins Dunkel
:-)
Da werd ich das wohl mit der Hilfsfunktion realisieren.
Ich wollte schon einen Punkt auch als solchen ändern können und nicht
koordinatenweise.

Ciao,
Anja


Joachim Pimiskern

unread,
Jun 23, 2004, 3:07:46 AM6/23/04
to
Morgen,

Anja Gehrke schrieb:


> Ich habe mal gelesen, dass man besser die Daten hinter
> Properties "verbirgt" zwecks Kapselung,
> oder hau ich da was durcheinander?

manche OOP-Theoretiker meine, man sollte auf die Membervariablen
nur über Funktionen zugreifen. Properties ermöglichen es,
Membervariablen mit sogenannten Setter- und Getterfunktionen
zu verknüpfen. Was damit gemeint ist, siehst Du z.B. in
Source\Vcl\stdctrls.pas, TCustomLabel, Property 'Transparent'.
Dort werden solche Funktionen verwendet. Der Sinn ist,
daß man MyLabel.Transparent := ... schreiben will statt
MyLabel.SetTransparent(...), also eine Frage der Schreibweise.
Auch haben Setter- und Getter-Funktionen den immensen Vorteil,
daß man einen Breadpoint für den Debugger setzen kann und
sich dann den Aufrufstack anschauen kann, also schauen kann,
wo die Zuweisung vorgenommen wird.

Deine Fehlermeldung bezieht sich wirklich darauf, daß Du
einem Funktionsergebnis was zuweisen wolltest. Den selben
Effekt kriegst Du so:

function test: integer;
begin
result := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
test := 1;
end;

Grüße,
Joachim

Joachim Pimiskern

unread,
Jun 23, 2004, 3:09:46 AM6/23/04
to
Joachim Pimiskern schrieb:

> Auch haben Setter- und Getter-Funktionen den immensen Vorteil,
> daß man einen Breadpoint [...]

Breakpoint - ich sollte was frühstücken.

Joachim

Michael Adler

unread,
Jun 23, 2004, 3:22:36 AM6/23/04
to
Joachim Pimiskern:

Gedanklich (Bread) warst du ja schon dort *g*

Sven Lanoster

unread,
Jun 23, 2004, 7:41:08 AM6/23/04
to
* Anja Gehrke schrieb:

> Thomas G. Liesner wrote:
> > Das Problem wurde ja schon geklärt, die einfachste Lösung lautet für
> > sowas:
> >
> >> type
> > TPoint = Class
> > public
> >> X: Double;
> >> Y: Double;
> >> end;

> > Und im Create/Destroy von Toffsetdata dann das Erzeugen/Vernichten


> > von FDrehpunkt nicht vergessen! Zudem sollte man sich beim Property
> > auf den read-Teil beschränken oder muß bei Write eine Methode

> > aufrufen, welche die Felder anhand des übergebenen Wertes setzt, um


> > keine toten Pointer übrig behalten zu können.
>
> FDrehpunkt ist doch nur ein einfacher record. Den muß man doch nicht
> erzeugen/vernichten, um ihn verwenden zu können?

Schau nochmal hin. Thomas hat aus Deinem Record eine Class gemacht.

MfG,
Sven.

Thomas G. Liesner

unread,
Jun 23, 2004, 4:41:57 AM6/23/04
to
Anja Gehrke schrieb:

> Ich bin noch Newbie in der OOP. Ich habe mal gelesen,
> dass man besser die Daten hinter Properties "verbirgt" zwecks Kapselung,
> oder hau ich da was durcheinander?

Nein. Ohne relevanten Performance-Verlust kannst du das einfach so
machen:

type
TPoint = Class
FX, FY: Double;
public
Property X: Double read FX write FX;
Property Y: Double read FY write FY;
end;

>> Und im Create/Destroy von Toffsetdata dann das Erzeugen/Vernichten von
>> FDrehpunkt nicht vergessen! Zudem sollte man sich beim Property auf
>> den read-Teil beschränken oder muß bei Write eine Methode aufrufen,
>> welche die _Felder_ anhand des übergebenen Wertes setzt, um keine
>> toten Pointer übrig behalten zu können.

> FDrehpunkt ist doch nur ein einfacher record.

Wenn du den Record wie vorgeschlagen durch ein Objekt ersetzt, gilt das
ja nicht mehr.

> Den muß man doch nicht
> erzeugen/vernichten, um ihn verwenden zu können?

Einen Record nicht, ein Objekt schon.

0 new messages