Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Auf Teil eines Records in eine Klasse zugreifen


Grishnak - So 12.03.06 00:53
Titel: Auf Teil eines Records in eine Klasse zugreifen
Gegeben sei folgende Definition:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
type
  TMyRecord = record
    S: string;
    I: integer;
  end;

  TMyClass = class
  private
    FMyRecord: TMyRecord;
  public
    property MyRecord: TMyRecord read FMyRecord write FMyRecord;
  end;

[...]

var
  MyClass: TMyClass;

[...]

  MyClass:=TMyClass.Create;
  MyClass.MyRecord.S:='text'// <--- FEHLER: 'Left side cannot be assigned to'
  MyClass.MyRecord.I:=5;      // <--- FEHLER: 'Left side cannot be assigned to'


Gibt es eine Möglichkeit, den Rekord so direkt anzusprechen, oder muss ich aus ihm ebenfalls eine Klasse machen?


Kroko - So 12.03.06 06:12


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
type
  TMyRecord = record
    S: string;
    I: integer;
  end;

  TMyClass = class
  private
    FMyRecord: TMyRecord;
  public
    property R_S: String read FMyRecord.S write FMyRecord.S;
    property R_I: Integer read FMyRecord.I write FMyRecord.I;
  end;


Jakob Schöttl - Mi 03.01.07 00:12

Ist das von Kroko wirklich die einzige Möglichkeit?

Ich will ebenfalls:


jaenicke - Mi 03.01.07 00:46

Dann musst du eben statt record class benutzen, was den Nachteil hat, dass das ganze instantiiert werden muss. Wenn das im Objektinspektor benutzt werden soll, d.h. so aufklappbar sein soll wie bspw. HorzScrollBar, dann solltest du es von TPersistant ableiten statt von TObject.


jasocul - Mi 03.01.07 08:07

Setze doch einfach FMyRecord in den Public-Bereich. Widerspricht zwar ein wenig den OOP-Konventionen, müsste aber funktionieren.


Delete - Mi 03.01.07 08:38

probier's mal so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
type
  TMyRecord = record
    S: string;
    I: integer;
  end;

  TMyClass = class
  private
    FMyRecord: TMyRecord;
  public
    property MyRecord: TMyRecord read FMyRecord write FMyRecord;
  end;

[...]

var
  MyClass: TMyClass;

[...]

  fMyClass:=TMyClass.Create;
  fMyRecord.S:='text'
  fMyRecord.I:=5;


Jakob Schöttl - Mi 03.01.07 12:46

user profile iconjasocul hat folgendes geschrieben:
Setze doch einfach FMyRecord in den Public-Bereich. Widerspricht zwar ein wenig den OOP-Konventionen, müsste aber funktionieren.


Das wäre natürlich eine Möglichkeit, ich hab auch schon daran gedacht, aber dann kann man den Record hald nur zur Laufzeit ändern.

user profile iconGrenzgaenger hat folgendes geschrieben:
probier's mal so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
type
  TMyRecord = record
    S: string;
    I: integer;
  end;

  TMyClass = class
  private
    FMyRecord: TMyRecord;
  public
    property MyRecord: TMyRecord read FMyRecord write FMyRecord;
  end;

[...]

var
  MyClass: TMyClass;

[...]

  fMyClass:=TMyClass.Create;
  fMyRecord.S:='text'
  fMyRecord.I:=5;


Der Eigenschaft MyRecord kann ich zwar einen TMyRecord zuweisen, aber eben nicht den einzelnen Datenfeldern von der Eigenschaft MyRecord.
FMyRecord kann ich natürlich schon Werte zuweisen, auch den einzelnen Datenfeldern, aber nur innerhalb der Unit...

Naja, trotzdem danke für eure Antworten!


jaenicke - Mi 03.01.07 12:54

user profile iconJakob Schöttl hat folgendes geschrieben:
user profile iconjasocul hat folgendes geschrieben:
Setze doch einfach FMyRecord in den Public-Bereich. Widerspricht zwar ein wenig den OOP-Konventionen, müsste aber funktionieren.


Das wäre natürlich eine Möglichkeit, ich hab auch schon daran gedacht, aber dann kann man den Record hald nur zur Laufzeit ändern.

Du willst das also tatsächlich im Objektinspektor haben? Dann geht das nicht mit einem Record! Dann musst du es von TPersistant ableiten, wie es dafür gedacht ist...

Ach so: Du kannst natürlich einen Editierhandler definieren, mit dem du den Record als Ganzes auch im OI ändern kannst. Das geht... Und du kannst dann ein kleines Fenster anzeigen, in dem du die einzelnen Eigenschaften ändern kannst.
Aber damit kenne ich mich nicht gut genug aus, um jetzt genau sagen zu können, was du wie machen musst.