![]() |
Property mit Record als Typ in Klasse verwenden
Ich baue gerade eine Klasse mit Properties, Gettern und Settern auf.
Ein Property soll als Typ ein Record haben Dummy
Delphi-Quellcode:
An einer Stelle weiter unten versuche ich dann MyRecord.TotalWidth etwas zuzuweisen.
TMyRecord = Record
Changed : Boolean; TotalWidth : Integer; WidthCol1 : Integer; WidthCol2 : Integer; WidthCol3 : Integer; end; type TMyClass = record private FMyRecord: TMyRecord; public property MyRecord: TMyRecord read FMyRecord write FMyRecord; end; Es wird mit der Meldung abgebrochen "E2064 Der linken Seite kann nichts zugewiesen werden". Wie bekomme ich dieses Problem behoben? Mit Enums und Sets funktioniert das problemlos, nur mit einem Record als Typ nicht. |
AW: Property mit Record als Typ in Klasse verwenden
Zitat:
Classe oder Record.. auch wenn du es als TMyClass benennst ist es trotzdem ein Record und zwar beide. Du solltest dich also schon festlegen! ![]() Was spricht dagegen deinen Record als Class auszulegen? Zum besseren Verständnis mal umbenannt.
Delphi-Quellcode:
property MyRecord: TMyRecord read GetMyRecord write FMyRecord;
Da MyRecord ein property ist behandelt der Compiler das etwas anders, es wird zuerst read (GetMyRecord) ausgewertet. GetMyRecord erstellt eine lokale temporäre Copy von TMyRecord und diese ist nun mal nur lesbar. Du kannst das mit Getter/Setter im Rekord umgehen, nur dann kann man auch direkt ne Class verwenden. Und ja man kann auch in Records Setter und Getter verwenden D2010 und höher. gruss |
AW: Property mit Record als Typ in Klasse verwenden
Code:
TMyRecord = Record
Changed : boolean; TotalWidth : Integer; ColWidth : array[1..3] of Integer; end; TMyClass = record private FMyRecord: TMyRecord; function GetMyColWidth(const idx:integer):integer; procedure SetMyColWidth(const idx:integer;value:integer); public property MyRecord: TMyRecord read FMyRecord write FMyRecord; Property TotalWidth: integer read fMyRecord.TotalWidth write FMyRecord.TotalWidth; Property ColWidth1 : integer index 1 read GetMyColWidth write SetMyColWidth; Property ColWidth2 : integer index 2 read GetMyColWidth write SetMyColWidth; Property ColWidth3 : integer index 3 read GetMyColWidth write SetMyColWidth; end; So würde ich das ganze angehen :) die Property MyRecord schreibt und ließt den kompletten Record. die Property TotalWidth schreibt und ließt ein einzelnes Feld eines Records. die Properties ColWidth als Array angelegt und schon kannst du mit einem Getter/Setter und der zusätzlichen definition des Index bei der Property auf die einzelnen Werte zugreifen. Evtl. kannst du auch das Array weglassen und anhand des index bei der Property im Getter/Setter auf die einzelnen Felder verweisen (müsste das ausprobieren...aber momentant installiert er). |
AW: Property mit Record als Typ in Klasse verwenden
Du kannst genau so gut das alles..
Delphi-Quellcode:
in den Record kopieren.
Property TotalWidth: integer read fMyRecord.TotalWidth write FMyRecord.TotalWidth;
Property ColWidth1 : integer index 1 read GetMyColWidth write SetMyColWidth; Property ColWidth2 : integer index 2 read GetMyColWidth write SetMyColWidth; Property ColWidth3 : integer index 3 read GetMyColWidth write SetMyColWidth; Wie gesagt in diesen Fall würde ich auf den Record verzichten macht keinen Sinn. gruss |
AW: Property mit Record als Typ in Klasse verwenden
Das kann man so global nicht sagen. Es hängt auch davon ab, was noch damit gemacht wird. Rein auf das Beispiel bezogen, hast du natürlich recht.
Gibts aber z.B. eine zweite Klasse:
Code:
sieht es schon anders aus.
Type
TMyClassList = Class private flist : TList<TMyRecord> public : |
AW: Property mit Record als Typ in Klasse verwenden
Zitat:
Denn bei ihr sind es zwei records. simple sample..
Delphi-Quellcode:
Egal.. sie\er soll sich aussuchen was er will. ;)
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TMyRecord = record private FTotalWidth : integer; procedure SetTotalWidth(const Value: Integer); public property TotalWidth : Integer read FTotalWidth write SetTotalWidth; end; type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } FMyRecord : TMyRecord; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin FMyRecord.TotalWidth := 21; Label1.Caption := IntToStr(FMyRecord.TotalWidth); end; { TMyRecord } procedure TMyRecord.SetTotalWidth(const Value: Integer); begin FTotalWidth := Value; end; end. gruss |
AW: Property mit Record als Typ in Klasse verwenden
Ich habe das jetzt so gemacht
Delphi-Quellcode:
Für alle anderen einfachen Datentypen verwende ich weiterhin getter, setter, read, write, property und all das.
TMyRecord = Record
Changed : Boolean; TotalWidth : Integer; WidthCol1 : Integer; WidthCol2 : Integer; WidthCol3 : Integer; end; type TMyWasAuchImmer = record // ja ich weiß es ist keine Class und sollte es auch nicht so nennen. Daher nun "WasAuchImmer" private public MyRecord: TMyRecord; procedure Bla; end; procedure TMyWasAuchImmer.Blub; begin MyRecord.TotalWidth := 42; end; // von außen aufrufen showmessage(TMyWasAuchImmer.MyRecord.TotalWidth.ToString); |
AW: Property mit Record als Typ in Klasse verwenden
Zitat:
Die Lösung mit Getter und Setter hast du ja nun falls du dich entschließen solltest es doch noch einmal zu versuchen. gruss |
AW: Property mit Record als Typ in Klasse verwenden
Beitrag entfernt da Offtopic
|
AW: Property mit Record als Typ in Klasse verwenden
Zitat:
Eigentlich war das Thema für sie schon erledigt was nicht heißen soll das du hier nichts schreiben darfst. Trotzdem unverständlich. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz