AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Property Member

Ein Thema von Cyf · begonnen am 4. Jul 2008 · letzter Beitrag vom 4. Jul 2008
Antwort Antwort
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#1

Property Member

  Alt 4. Jul 2008, 17:28
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 Instanz.Record.A und einmal unter Instanz.A auftauchen. Alternativ könnte ich auch eine 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.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Property Member

  Alt 4. Jul 2008, 17:31
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).
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#3

Re: Property Member

  Alt 4. Jul 2008, 17:41
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 ):

property Record.A: Integer read FRecord.A write FRecord.A;
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#4

Re: Property Member

  Alt 4. Jul 2008, 17:50
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
  Mit Zitat antworten Zitat
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#5

Re: Property Member

  Alt 4. Jul 2008, 20:10
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz