AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Property -> Getter und Setter mit Parametern
Thema durchsuchen
Ansicht
Themen-Optionen

Property -> Getter und Setter mit Parametern

Ein Thema von bernau · begonnen am 28. Jan 2015 · letzter Beitrag vom 29. Jan 2015
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.268 Beiträge
 
Delphi 11 Alexandria
 
#1

Property -> Getter und Setter mit Parametern

  Alt 28. Jan 2015, 08:59
Ein Gedankengang zum Thema "wie spare ich Tipperei".

Ich habe ein CustomObject, welches Parameter speichert. Egal wo und wie. Und es gibt eine Ableitung in der ich einige Properties definiere, welche Properties des Parent verwendet. Der Zugriff wird in der Implementation geregelt.

Delphi-Quellcode:
interface

type
  TCustomSpeicherobjekt = class(TObject)
    private
      function GetEinStringWert(aIndex: string): string;
      procedure SetEinStringWert(aIndex: string; const Value: string);
    public
      property EinStringWert[aIndex:string]:string read GetEinStringWert write SetEinStringWert;
    end;


  TMeinSpeicherobjekt = class(TCustomSpeicherobjekt)
    private
      function GetWertA: string;
      function GetWertB: string;
      procedure SetWertA(const Value: string);
      procedure SetWertB(const Value: string);
    public
      property WertA:string read GetWertA write SetWertA;
      property WertB:string read GetWertB write SetWertB;
    end;


implementation

{ TMeinSpeicherobjekt }

function TCustomSpeicherobjekt.GetEinStringWert(aIndex: string): string;
begin
  // Hier steht Code zum Lesen
end;

procedure TCustomSpeicherobjekt.SetEinStringWert(aIndex: string; const Value: string);
begin
  // Hier steht Code zum Schreiben
end;


{ TMeinSpeicherobjekt }

function TMeinSpeicherobjekt.GetWertA: string;
begin
  Result:=EinStringWert['WertA'];
end;

function TMeinSpeicherobjekt.GetWertB: string;
begin
  Result:=EinStringWert['WertB'];
end;

procedure TMeinSpeicherobjekt.SetWertA(const Value: string);
begin
  EinStringWert['WertA']:=Value;
end;

procedure TMeinSpeicherobjekt.SetWertB(const Value: string);
begin
  EinStringWert['WertB']:=Value;
end;
Gibt es einge Möglichkeit den Code zu verkürzen. Ich denke an so etwas wie die direkte Funktionsübergabe mit Parameter. Dann könnte man sich die Implementation sparen.

Beispiel:

Delphi-Quellcode:
  TMeinSpeicherobjekt = class(TCustomSpeicherobjekt)
    private
    public
      // Entweder so
      property WertA:string read EinStringWert['WertA'] write EinStringWert['WertA'];
      // oder so
      property WertB:string read GetEinStringWert('WertB') write SetEinStringWert('WertB');
    end;
Oder gibt es andere Ansätze?
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.763 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Property -> Getter und Setter mit Parametern

  Alt 28. Jan 2015, 09:10
Eventuell hilft Dir index als Indexbezeichner. Schau Dir die Hilfe zu properties nochmal an.

http://docwiki.embarcadero.com/RADSt...dex_Specifiers

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.346 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Property -> Getter und Setter mit Parametern

  Alt 28. Jan 2015, 09:27
Ich würde dann aber die Stringindizes nicht nach außen geben, um Tippfehler zu minimieren und das z.B. so lösen (wenn die Stringindizes intern notwendig sind):
Delphi-Quellcode:
{$SCOPEDENUMS ON}

type
  TCustomSpeicherobjekt = class(TObject)
  private
    function GetEinStringWert(aIndex: string): string;
    procedure SetEinStringWert(aIndex: string; const Value: string);
  public
    property EinStringWert[aIndex: string]: string read GetEinStringWert write SetEinStringWert;
  end;

  TMeinSpeicherobjekt = class(TCustomSpeicherobjekt)
  public type
    TValueInfo = (ValueA, ValueB);
  private
    const
      cValueNames: array[TValueInfo] of string = ('WertA', 'WertB');
    function GetValue(ValueKind: TValueInfo): string;
    procedure SetValue(ValueKind: TValueInfo; const Value: string);
  public
    property Value[ValueKind: TValueInfo]: string read GetValue write SetValue;
  end;

implementation

{ TMeinSpeicherobjekt }

function TCustomSpeicherobjekt.GetEinStringWert(aIndex: string): string;
begin
  // Hier steht Code zum Lesen
end;

procedure TCustomSpeicherobjekt.SetEinStringWert(aIndex: string; const Value: string);
begin
  // Hier steht Code zum Schreiben
end;

{ TMeinSpeicherobjekt }

function TMeinSpeicherobjekt.GetValue(ValueKind: TValueInfo): string;
begin
  Result := EinStringWert[cValueNames[ValueKind]];
end;

procedure TMeinSpeicherobjekt.SetValue(ValueKind: TValueInfo; const Value: string);
begin
  EinStringWert[cValueNames[ValueKind]] := Value;
end;
Dann lässt sich das einfach so nutzen:
Delphi-Quellcode:
MyObject.Value[TValueKind.ValueA] := 'Test';
ShowMessage(MyObject.Value[TValueKind.ValueA]);
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.268 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Property -> Getter und Setter mit Parametern

  Alt 28. Jan 2015, 10:01
Eventuell hilft Dir index als Indexbezeichner. Schau Dir die Hilfe zu properties nochmal an.[/url]
Ne, das ist nicht wirklich optimal. Ein index ist nicht sprechend und zu fehleranfällig. Wenn der Index ein String sein könnte, dann wäre es eine Lösung

Ich suche eine Lösung, in der ich die Implementation übergehen kann.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.268 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Property -> Getter und Setter mit Parametern

  Alt 28. Jan 2015, 10:04
Dann lässt sich das einfach so nutzen:
Delphi-Quellcode:
MyObject.Value[TValueKind.ValueA] := 'Test';
ShowMessage(MyObject.Value[TValueKind.ValueA]);
Auch nicht wirklich eine alternative. Ich nutze gerne Codevervollständigung. Da möchte ich das Property direkt verwenden.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Property -> Getter und Setter mit Parametern

  Alt 28. Jan 2015, 10:24
Eventuell hilft Dir index als Indexbezeichner. Schau Dir die Hilfe zu properties nochmal an.[/url]
Ne, das ist nicht wirklich optimal. Ein index ist nicht sprechend und zu fehleranfällig. Wenn der Index ein String sein könnte, dann wäre es eine Lösung

Ich suche eine Lösung, in der ich die Implementation übergehen kann.
Dieser Index ist aber die einzige Moglichkeit um im Getter/Setter zu erfahren, welche Eigenschaft denn nun diesen aufgerufen hat. So einfach ist das.

Dieser Index kann ein Integer oder ein Enum sein.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.735 Beiträge
 
Delphi 2007 Professional
 
#7

AW: Property -> Getter und Setter mit Parametern

  Alt 28. Jan 2015, 10:36
Dieser Index kann ein Integer oder ein Enum sein.
... und er taucht im Anwender-Code ja gar nicht auf. (Was ja AFAICT bernaus Befürchtung ist.)
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.268 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Property -> Getter und Setter mit Parametern

  Alt 28. Jan 2015, 11:26
OK. Ich verbuche das einfach mal unter "geht nicht".
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#9

AW: Property -> Getter und Setter mit Parametern

  Alt 28. Jan 2015, 11:58
OK. Ich verbuche das einfach mal unter "geht nicht".
Vielleicht nicht genau so, wie du das gern hättest. Allerdings gibt es genügend Möglichkeiten, dir die Tipparbeit zu ersparen.

Eine davon ist der Einsatz des ModelMaker Code Explorer, den ich in solchen Fällen ja gern als sinnvolles Werkzeug in der IDE anführe. Hier bieten sich verschiedene Möglichkeiten an, um die Tipparbeit einzusparen. Die einfachste ist, man legt einmal ein solches Property "WertA" an und implementiert den Zugriff, wobei der IndexString exakt dem Property-Namen entspricht (wie im Beispiel gezeigt). Dann kopiert man das Property mit dem MMX und benutzt dessen Member-Inplace-Rename-Funktionalität, um das neue Property in "WertB" umzubenennen. Erfreulicherweise werden dabei auch die IndexStrings mit umbenannt.

Eine andere Alternative ist das Anlegen eines eigenen Getter/Setter-Templates, das dann bei einem neuen Property zum Einsatz kommt.

Aber es geht auch ohne MMX mit dem Vorschlag von jaenicke, wenn man ihn etwas abwandelt (das SCOPEDENUMS ist hier nicht unbedingt notwendig):

Delphi-Quellcode:
  TMeinSpeicherobjekt = class(TCustomSpeicherobjekt)
  private type
    {$SCOPEDENUMS ON}
    TValueInfo = (WertA, WertB);
    {$SCOPEDENUMS OFF}
  protected
    function GetValue(ValueKind: TValueInfo): string;
    procedure SetValue(ValueKind: TValueInfo; const Value: string);
  public
    property WertA: string index TValueInfo.WertA read GetValue write SetValue;
    property WertB: string index TValueInfo.WertB read GetValue write SetValue;
  end;

uses
  System.TypInfo;

function TMeinSpeicherobjekt.GetValue(ValueKind: TValueInfo): string;
begin
  result := EinStringWert[GetEnumName(TypeInfo(TValueInfo), Ord(ValueKind))];
end;

procedure TMeinSpeicherobjekt.SetValue(ValueKind: TValueInfo; const Value: string);
begin
  EinStringWert[GetEnumName(TypeInfo(TValueInfo), Ord(ValueKind))] := Value;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.268 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Property -> Getter und Setter mit Parametern

  Alt 28. Jan 2015, 13:27
@Uwe: Das ist ein Ansatz, der sehr interessant aussieht.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 19:02 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