Autor Beitrag
~~MAINFRAIME²~~
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16

WinXP 32/64bit
Delphi 2005
BeitragVerfasst: Di 21.08.07 15:53 
Immer wenn ich eine property so ändern will bekomme ich "left side cannot be assigned to".

ausblenden Delphi-Quelltext
1:
GE.GraphicObjects.Objects[0].Scale.XScale:= 1;					


Und hier der dazugehörige Code der Klasse
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
  protected
    var
      GraphicObj: Array of TMyGraphicObject;

    function GetObject(Index: integer): TMyGraphicObject;
    procedure SetObject(Index: integer; Value: TMyGraphicObject);

  public
    property Objects[Index: integer]: TMyGraphicObject read GetObject write SetObject;
    ...
  end;


Mit "write SetObject" müsste doch die procedure "SetObject" aufgerufen und die Änderungen in "GraphicObj[Index]" gespeichert werden aber Delphi will nicht.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 21.08.07 16:00 
Wie ist TMyGraphicObject definiert?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Di 21.08.07 16:05 
Wie ist der Setter deklariert?

_________________
Markus Kinzler.
~~MAINFRAIME²~~ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16

WinXP 32/64bit
Delphi 2005
BeitragVerfasst: Di 21.08.07 17:23 
Meine records habe ich in einer extra unit.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
  TMyBlendType          = (btNormal, btAdd, btSub);
  TMyGraphicObjectType  = (gotNormal, gotParticle);
  TMyDrawPosition       = (dpZero, dpMiddle);

  TMyGraphicObject = packed record
    DrawPosition:     TMyDrawPosition;

    XPos, YPos, ZPos: integer;
    Width:            integer;//X/S/U
    Height:           integer;//Y/T/V

    Scale:            TMyScale;

    BlendType:        TMyBlendType;
    ObjectType:       TMyGraphicObjectType;

    TextureID:        integer;//TMyTexture ID
      
  end;


Wenn mit "Setter" dies hier gemeint wahr
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TMyGraphicEngineObjects.SetObject(Index: integer; Value: TMyGraphicObject);
begin
  GraphicObj[Index]:= Value;
end;
Waldteufel
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 21.08.07 19:27 
Titel: Re: "left side cannot be assigned to" mit property in eigene
Hallo.

Ich fürchte, der Setter wird gar nicht aufgerufen. Der ist doch nur für Fälle wie GE.GraphicObjects.Objects[0] := Blup; zuständig und nicht für GE.GraphicObjects.Objects[0].Scale.XScale:= 1; - da wird imho der Getter aufgerufen.

Zeig vielleicht auch noch mal den Code von GetObject.

Gruß,
Waldteufel
~~MAINFRAIME²~~ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16

WinXP 32/64bit
Delphi 2005
BeitragVerfasst: Mi 22.08.07 11:49 
Aber warum sollte der Getter aufgerufen werden ich habe doch ein "TMyGraphicObject" definiert und das bekomme ich doch auch mit dem Getter wenn ich nun einen Wert verändere müsste doch der ganze record an den Setter übergeben werden und an die richtige stelle in meinem Array gespeichert werden.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
function TMyGraphicEngineObjects.GetObject(Index: integer): TMyGraphicObject;
begin
  result:= GraphicObj[Index];
end;
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 22.08.07 12:56 
Hallo!

Das Problem dürfte sein, dass Records keine Referenzdatentypen sind.

Hierbei wird die Funktion GetObject aufgerufen:
ausblenden Delphi-Quelltext
1:
GE.GraphicObjects.Objects[0]					

somit versuchst Du hier:
ausblenden Delphi-Quelltext
1:
GE.GraphicObjects.Objects[0].Scale.XScale:= 1;					

einem Funktionsergebnis einen Wert zuzuweisen. Bei Klassen funktioniert das, weil es Referenzdatentypen sind, bei Records geht das nicht.

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
~~MAINFRAIME²~~ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16

WinXP 32/64bit
Delphi 2005
BeitragVerfasst: Mi 22.08.07 14:34 
Wie wäre es dann mit Pointern damit müsste ich doch dieses Problem lösen können?

Also ich habe es mahl so probiert aber ich bekomme immer eine "EAccessViolation"
ausblenden Delphi-Quelltext
1:
PMyGraphicObject = ^TMyGraphicObject;					

Einen Pointer auf "TMyGraphicObject"

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function GetObject(Index: integer): PMyGraphicObject;

property Objects[Index: integer]: PMyGraphicObject read GetObject;

function TMyGraphicEngineObjects.GetObject(Index: integer): PMyGraphicObject;
begin
  result:= @GraphicObj[Index];
end;

"PMyGraphicObject" benutzen und mit "@GraphicObj[Index]" den Pointer übergeben.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
      GE.GraphicObjects.Objects[0]^.DrawPosition:= dpZero;
      GE.GraphicObjects.Objects[0]^.XPos:= x*TileSize;
      GE.GraphicObjects.Objects[0]^.YPos:= y*TileSize;
      GE.GraphicObjects.Objects[0]^.ZPos:= 1;
      GE.GraphicObjects.Objects[0]^.Width:= TileSize;
      GE.GraphicObjects.Objects[0]^.Height:= TileSize;
      GE.GraphicObjects.Objects[0]^.Scale.XScale:= 1;
      GE.GraphicObjects.Objects[0]^.Scale.YScale:= 1;
      GE.GraphicObjects.Objects[0]^.BlendType:= btNormal;
      GE.GraphicObjects.Objects[0]^.ObjectType:= gotNormal;
      GE.GraphicObjects.Objects[0]^.TextureID:= 0;

Ich müsste doch hier "GE.GraphicObjects.Objects[0]" meinen Pointer bekommen den ich mit "^" dereferenziere und dann ganz normal in meinen record schreiben kann aber wie gesagt bekomme ich schon bei "GE.GraphicObjects.Objects[0]^.DrawPosition:= dpZero;" eine "EAccessViolation"
Sidorion
ontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 63



BeitragVerfasst: Mi 22.08.07 14:52 
Ist die Property XScale von TMyScale überhaupt eine beschreibbare prop (oder vielleicht als const definiert)? Alle Properties vor dem letzten Punkt werden gelesen, um zum richtigen Zielobjekt/Record zu kommen. Das wäre bei Dir: GE.GraphicObjects.Objects[0].Scale. Bis hierhin müssen alle lesbar sein. Die eigentliche Wertzuweisung findet dann auf XScale statt, d.h. nur XScale von TMyScale muss beschreibbar sein (alle anderen können natürlich, spielt aber in diesem Beispiel keine Rolle).