Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Property Member (https://www.delphipraxis.net/116702-property-member.html)

Cyf 4. Jul 2008 16:28


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:
type
  TMyRecord = record
    A: Integer;
    B: Integer;
  end;

  TFoobar = class(TObject)
  privat
    FRecord: TMyRecord;
  public
    property Record: TMyRecord read FRecord write FRecord;
  end;
Damit ist nun über das Property Lese- und Shreibzugriff auf FRecord gegeben und ausschließlich Lesezugriff auf dessen
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:
Instanz.Record.A
und einmal unter
Delphi-Quellcode:
Instanz.A
auftauchen. Alternativ könnte ich auch eine
Delphi-Quellcode:
function A: Integer
anlegen, aber das ist noch sinnloser als die extra Propertys.
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.

Apollonius 4. Jul 2008 16:31

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).

Cyf 4. Jul 2008 16:41

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;

Dax 4. Jul 2008 16:50

Re: Property Member
 
Machs doch so oder ähnlich:
Delphi-Quellcode:
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;
.Record würde instanzlokal konstant sein, also kann man das ohne Probleme tun. Ganz sauber ist es aber leider auch nicht :(

Cyf 4. Jul 2008 19:10

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