Autor Beitrag
Grishnak
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 221

Windows XP Home
Delphi 7 PE, Delphi 2005 PE
BeitragVerfasst: So 12.03.06 00:53 
Gegeben sei folgende Definition:

ausblenden 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?

_________________
Mach' etwas idiotensicher und irgendjemand erfindet einen besseren Idioten!
Kroko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: So 12.03.06 06:12 
ausblenden 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;

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
Jakob Schöttl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Mi 03.01.07 00:12 
Ist das von Kroko wirklich die einzige Möglichkeit?

Ich will ebenfalls:
  • Einen Record in einer Klasse deklarieren
  • Dem Record als ganzes einen Wert zuweisen
  • Den Record-Feldern auch einzeln Werte zuweisen
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19335
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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.
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 03.01.07 08:38 
probier's mal so:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19335
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.