Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Problem mit Object


flowstar - So 25.01.04 16:40
Titel: Problem mit Object
Hallo
Ich habe folgendes Problem:
Ich erstelle ein Object:

Delphi-Quelltext
1:
2:
3:
4:
5:
type TGameButton = object
          X :0..1000;
          Y :0..1000;
          down : Boolean;
     end;


Un dann habe ich eine Variable von diesem Object:

Delphi-Quelltext
1:
Test : TGameButton                    


Nun will ich die Variable down ändern:

Delphi-Quelltext
1:
Test.Down := true;                    

Nun kommt aber immer die Fehlermeldung:
"Left side cannot be assigned to"

Ich weiß nicht wo das Problem ist. Bitte helft mir
Danke

PS: Ich benutze Delphi 6

Moderiert von user profile iconPeter Lustig: Topic Verschoben


MaxiTB - So 25.01.04 17:51

Soviel ich weiß, sind class members standardmäßig private. Mache es richtiger, dann schauts so aus (mit Verwendung von properties):


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
type TGameButton=object
 private:
  mX: integer; 
  mY: integer; 
  mDown: boolean; 

 public:
  
  property X: integer read mX write mX;
  property Y: integer read mY write mY;
  property Down: boolean read mDown write mDown;
end;


Besser ist natürlich noch, du verwendest eine Klasse (class) da objects eigentlich gar nicht mehr verwendet werden sollen (Rückwärtskompatiblität).

Das würde analog dann so aussehen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
type TGameButton=class
 private:
  mX: integer; 
  mY: integer; 
  mDown: boolean; 

 public:
  
  property X: integer read mX write mX;
  property Y: integer read mY write mY;
  property Down: boolean read mDown write mDown;
end;


Besser noch, du fügst einen constructor hinzu, wo default werde initialisiert werden:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
type TGameButton=class
 private:
  mX: integer; 
  mY: integer; 
  mDown: boolean; 

 public:
  
  constructor Create();

  property X: integer read mX write mX;
  property Y: integer read mY write mY;
  property Down: boolean read mDown write mDown;
end;

constructor TGameButton.Create();
begin
  mX:=0
  mY:=0
  mDown:=false; 
end;


Aber wie gesagt - der Fehler ist nur eine Zugriffsverletzung, weil standardmäßig members private sind.


MaxiTB - So 25.01.04 18:00

Moment ... alles nochmals zurück - ich hab schon wieder Pascal und C++ verwechselt. *g*

Nach ein bisserl nachstöbern würde ich schätzen, du mußt das object vorher explizit erstellen (Speicher reservieren). So oder so - ich empfehle dir meine Methode oben mit der Klasse trotzdem.

Aufruf dann:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var
 lButton: TGameButton;
begin
 lButton:=TGameButton.Create();
 lButton.Down:=true;
 FreeAndNil(lButton);
end;


flowstar - So 25.01.04 18:26

Ich dachte eigentlich, dass objects nicht erst erstellt werden müssen.
Aber daran liegts auch nicht.
Auch wenn ich vorher

Delphi-Quelltext
1:
Gamebutton := TGamebutton.Create;                    

aufrufe kommt immernoch der gleiche Fehler.


flowstar - So 25.01.04 18:36

ok
hab den fehler gefunden. So wie ichs oben beschieben hab funktionierts wunderbar.

Ich hatte den Button nur als Konstante statt Variable deklariert.


MaxiTB - So 25.01.04 18:36

objects haben keinen constructor soweit ich weiß !

Die müssen irgendwie mit new und dispose angelegt werden ... aber da bin ich nicht so fit in der Sache, weil wie gesagt eher schlecht ist, wenn man sich das angewöhnt :wink: ; mein Tip bleibt: Verwende lieber Klassen, sind moderner, können mehr und haben auch noch den Vorteil, daß Borland sie weiterhin noch unterstützt !

Edit:

*lol* Okay - das ist auch eine Sache mit dem const. Trotzdem solltest du objects nicht mehr verwenden :wink: .