Autor Beitrag
Andreas Pfau
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: Do 10.07.03 19:23 
Hallo,

ich habe eine Klasse, die im PUBLIC-Abschnitt eine Array-eigenschaft hat:
ausblenden Delphi-Quelltext
1:
2:
3:
  public
  {...}
  property Nodes[Index: Integer]: TBezierManagerNode Read fGetNode Write fSetNode;

fGetNode() liefert den folgenden Typ:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
TBezierManagerNode = record
  PosX, PosY: Double;
  CtrlAngle, CtrlRadius: Single;
end;

Ich habe jetzt eine Instanz der Klasse. Ich rufe (nach dem Kontruktor) folgende Zeile auf:
ausblenden Delphi-Quelltext
1:
 BezierManager.Nodes[0].PosX := 0;					

Der Fehler:
Zitat:
Der linken Seite kann nichts zugewiesen werden.

Wenn ich aus dem Record ebenfalls eine Klasse mache, ist das kein Problem mehr. Nur, dann brauche ich wieder einen Konstruktor, einen Destruktor, und muss alle Variablen im PRIVATE-Abschitt ablegen. Gibt es denn keine andere Möglichkeit, auf die Items des Records zuzugreifen?

_________________
Life is a bad adventure, but the graphic is really good!
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Do 10.07.03 22:47 
Andreas Pfau hat folgendes geschrieben:
fGetNode
fSetNode;

Damit hast du mich gerade stark verwirrt. Ich dachte zu aller erst, es handle sich dabei um 2 Felder. Erst als ich die "()" sah, wurde mir klar, dass es sich hier um zwei Methoden und keine Felder handelt.
Das "F" wird übrigens laut Style Guide groß geschrieben und nur für Felder und nicht für Methoden, wo diese auch immer stehen sollten (private, protected, public, published) verwendet.


Zitat:
Nur, dann brauche ich wieder einen Konstruktor, einen Destruktor, und muss alle Variablen im PRIVATE-Abschitt ablegen.

Musst du nicht. Was du jedoch musst, ist den Konstruktor (wenn kein eigener vorhanden ist, wird TObject.Create automatisch aufgerufen) aufrufen und die Instanz mit Free wieder freigeben.

Zitat:
Gibt es denn keine andere Möglichkeit, auf die Items des Records zuzugreifen?

Liefere bei GetNodes einen Zeiger auf die Record-Variable zurück und spare dir die SetNodes Methode.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
property Nodes[Index: Integer]: PBezierManagerNode read GetNodes;

function TMyClass.GetNodes(Index: Integer): PBezierManagerNode;
begin
  Result := @NodesArray[Index];
end;

_________________
Ist Zeit wirklich Geld?
Andreas Pfau Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: Fr 11.07.03 13:23 
Hallo,

das "f" habe ich mir so angewöhnt, denn für Variaben nehme ich es eh, und wenn Methoden in PRIVATE und PUBLIC gleich heißen, nehme ich halt das "f".

Klar, ich brauche keine kon-(destruktor, aber ich muss ichn aufrufen, das ist das doofe.

Das mit dem Pointer werde ich mal versuchen.

_________________
Life is a bad adventure, but the graphic is really good!
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Fr 11.07.03 16:21 
Andreas Pfau hat folgendes geschrieben:
das "f" habe ich mir so angewöhnt

Das ist eine ganz schlechte Angewohnheit, da sie 90% aller Delphi-Programmierer aufs erste verwirrt. Für dich privat mag es egal sein, aber wenn du Code veröffentlichst, bereitet das Umdenken einige Schwierigkeiten.

_________________
Ist Zeit wirklich Geld?
Andreas Pfau Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: Fr 11.07.03 19:19 
Klar, aber es ist jetzt halt so. Ich werde das mal überarbeiten. War ja nie gedacht, dass ich das veröffentliche.

Übrigens gefällt mir das mit dem Pointer nicht. Ich will standardisieren, und unter "Standard" verstehe ich den Stil, den die Delphi-Programmierer vorgelegt haben. Und da gibt es keine Pointer. Na ja, wenn es aber keine andere Möglichkeit gibt, werde ich halt Klassen nehmen. Was solls, die werden ja selbst von einer Klasse gekapselt, also ist es nach außen hin gar kein Problem.

Trotzdem vielen Dank für deine Mitarbeit!

_________________
Life is a bad adventure, but the graphic is really good!