![]() |
Property Member
So, eine absolute Anfängerfrage, aber ich hatte tasächlich nie eine Situatin, wo es nötig war, gegeben sei folgende Klasse:
Delphi-Quellcode:
Damit ist nun über das Property Lese- und Shreibzugriff auf FRecord gegeben und ausschließlich Lesezugriff auf dessen
type
TMyRecord = record A: Integer; B: Integer; end; TFoobar = class(TObject) privat FRecord: TMyRecord; public property Record: TMyRecord read FRecord write FRecord; end; Member A und B. Ist es möglich auf einem halbwegs eleganten Weg, so auch Schreibzugriff darauf zu ermöglichen? Extra Propertys für A und B anzulegen, lässt die Sache wenig elegant aussehen, weil sie dann einmal unter
Delphi-Quellcode:
und einmal unter
Instanz.Record.A
Delphi-Quellcode:
auftauchen. Alternativ könnte ich auch eine
Instanz.A
Delphi-Quellcode:
anlegen, aber das ist noch sinnloser als die extra Propertys.
function A: Integer
Ansonten wäre noch eine Variante Propertys für A und B anzulegen und für FRecord keine, sondern lediglich eine Get und Set Methode, aber dann ist das ganze nicht mehr unter Record.A gegliedert, also auch nciht sehr elegant. Ich könnte das Ganze natürlich gleich Record nennen und public machen, aber das sollte ja möglichst vermieden werden. |
Re: Property Member
Kurz und schmerzlos: Es geht nicht. Dafür müsste TMyRecord eine Klasse sein oder ein Zeiger veröffentlicht werden (was letztlich auf das selbe hinausläuft).
|
Re: Property Member
Hmm dann bau ich die Orginalklasse am besten zu um, dass das Feld public wird, was in meinem Fall sogar geht, ich werd bloß fluchen, falls ich jemals beschließe, da eine Funktion zum Zugriff zu nehmen (wobei ich jetzt nicht wüsste warum... aber manchmal ergeben sich komische Sachen).
Danke für die schnelle Antwort. Dumm das sowas nicht geht (sollte man in die Sprache einbauen :wink: ):
Delphi-Quellcode:
property Record.A: Integer read FRecord.A write FRecord.A;
|
Re: Property Member
Machs doch so oder ähnlich:
Delphi-Quellcode:
.Record würde instanzlokal konstant sein, also kann man das ohne Probleme tun. Ganz sauber ist es aber leider auch nicht :(
type
PMyRecord = ^TMyRecord; TMyRecord = record A: Integer; B: Integer; end; TFoobar = class(TObject) privat FRecord: TMyRecord; function GetRecord: PMyRecord; public property Record: PMyRecord read GetRecord; procedure SetRecord(rec: TMyRecord); end; function TFoobar.GetRecord; begin result := @FRecord; end; procedure TFoobar.SetRecord; begin FRecord := rec; end; |
Re: Property Member
Habs jetzt nach public umgebaut.
Das Problem, wenn ich einen Zeiger übergebe, liegt darin, dass zwar .Member dann klappt (dank auto-Dereferenzierung), ich aber, um auf den eigentlichen record zuzugreifen, manuell dereferenzieren muss. Außerdem weiß ich grad nicht, wie das dann mit der durchaus praktischen Autovervollständigung klappt. Scheint also, wenn man das hieraschich aufgebaut haben will, keinen anderen Weg zu geben. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:01 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