![]() |
AW: Property via AsString;AsInteger;AsBoolean;.. laden
Wir arbeiten hier seit Jahren mit dem Vorschlag von Thom (Variants).
Unsere Lösung ist so banal, das wir auf Typensicherheit, OOP, CleanCode usw. an der Stelle verzichten. Die Unit ist 186 Zeilen lang und implementiert einen bösen Singleton namens 'Setup'. Fertig. Wir verwenden die Eigenschaften 'AsInteger', 'AsString', 'AsBoolean', um komfortabler auf Daten zugreifen zu können (nötig ist das nicht):
Delphi-Quellcode:
Wir hatten bisher nie die Muße, über den Sinn zu diskutieren. Die Unit wurde in 30 min zusammengebaut und funktioniert.
ValueAsVariant := Setup['MySetting'];
ValueAsInteger := Setup.AsInteger['MyIntegerSetting']; ValueAsBoolean := Setup.AsBoolean['MyBooleanSetting']; ... Nein, und unsere Anwendungen haben keine 1000 Einstellungen. Höchstens 20. Wer mit Metadaten arbeitet (und hier haben wir welche), sollte sich mit den Variants vertraut machen. |
AW: Property via AsString;AsInteger;AsBoolean;.. laden
Zitat:
Bei mir werden es auch nicht mehr als 50 Werte werden. Ich finde diese Lösung eben einfach und alltagstauglich. Man muss nicht alles auf die Spitze treiben. @Shark: Ich habe doch einen Setter im Record..wo finde ich meinen Fehler? |
AW: Property via AsString;AsInteger;AsBoolean;.. laden
Zitat:
Zitat:
Folgendes Beispiel:
Delphi-Quellcode:
Davon losgelöst kann man eben auch bzgl. den Variants argumentieren, was ich schon habe. Wer aber die Variants-Lösung bevorzugt, dem sei gesagt, dass ich nichts dagegen habe. Ich beschreibe hier nur den Weg, den ich bevorzugen würde -- aus besagten Gründen :wink:
Port := Config.GetValue('port').AsInteger;
Port := Config.GetValue('Port').AsInteger; // Was von den beiden ist richtig? Klar, man könnte in der GetValue() // Methode noch auf Lower- oder UpperCase umwandeln, aber es kann // hier leicht knallen. // Wenn ich aber nun folgendes habe, erscheint in meinem Code eine // Auflistung aller optionen, die die Klasse Config anbietet. Grob // mal mit IntelliSense skizziert :) Port := Config.+----------------+ | MySQL | | Printer | | UserSpecific | +----------------+ // Klar, muss die Configuration-Klasse entsprechend angepasst werden, // sodass die Auswahl kommt. Aber so kann der Programmierer sich sehr // leicht "durchhangeln", bis er das hat, was er sucht: Port := Config.MySQL.Port; Zitat:
|
AW: Property via AsString;AsInteger;AsBoolean;.. laden
Zitat:
Delphi-Quellcode:
tippen, anstatt ein Record übergeben zu müssen.
...AsInteger := 4711
Zitat:
|
AW: Property via AsString;AsInteger;AsBoolean;.. laden
Wenn du den Implicit-Operator überladen würdest, solltest du deine Setter-Methode so belassen können, wie du es hast. Mal schnell aus dem Kopf heraus aufgeschrieben:
Delphi-Quellcode:
TBlub = class
private FRec : TMyRecord; procedure SetRec(Value: TMyRecord); public property Rec : TMyRecord read FRec write SetRec; end; procedure TBlub.SetRec(Value: TMyRecord); begin FRec := Value; end; TMyRecord = class private FValue : Integer; public operator Implicit(Value: Integer): TMyRecord; property Value : Integer read FVaule; end; TMyRecord.Implicit(Value: Integer): TMyRecord; begin Result.FValue := Value; end; |
AW: Property via AsString;AsInteger;AsBoolean;.. laden
Zitat:
Wir können das ganz einfach durch einen applikationsspezifischen Wrapper hinbekommen:
Delphi-Quellcode:
Dies lässt sich noch vereinfachen, indem die Konfigurationsnamen in einem konstanten Array vorgehalten werden und es pro Datentyp einen IndexGetter und -setter gibt, also z.B. so:
Type
TSpecificConfig = Class Public Property MyInteger : Integer Read GetMyInteger Write SetMyInteger; End; ... Function TSpecificConfig.GetMyInteger : Integer; Begin Result := VarToInt (Item['MyInteger']); End;
Delphi-Quellcode:
Der Zugriff erfolgt dann über eine Instanz der 'TSpecific'-Klasse.
Type
TSpecificConfig = Class Const Values : Array [0..xx] of String = ('MyInt', 'MyString'...); Public Property MyInt : Integer index 0 Read GetInteger Write SetInteger; Property MyString : String index 1 Read GetString Write SetString; End; ... Function TSpecificConfig.GeInteger (Index : Integer) : Integer; Begin Result := VarToInt (Item[Values[Index]]); End; Wie gesagt: Wer's toll findet, kann sich die Mühe machen. Mir reicht:
Delphi-Quellcode:
Setup['MyInt'] := 4711;
|
AW: Property via AsString;AsInteger;AsBoolean;.. laden
Zitat:
Die ist drin und sollte auch funktionieren...sollte. Ich debugge. Was passiert bei der jetzigen Konstellation:
Delphi-Quellcode:
und
type
RConfig2 = record private fKey: String; fValue: Variant; function GetAsString: String; function GetAsInteger: Integer; procedure SetAValue(aValue: Variant); public property Key: String read fKey write fKey; property Value: Variant read fValue write fValue; property AsString: String read GetAsString; property AsInteger: Integer read GetAsInteger; end;
Delphi-Quellcode:
Ich strebe an, über
property Item[aKey: String]: RConfig2 read GetVariantValue;
Code:
die Wertzuweisung zu machen.
.Value:= ?
Jedoch läuft er beim Aufruf von
Delphi-Quellcode:
immer in
myConfig.Item['dbconfig'].Value:= 2312
Delphi-Quellcode:
was mir auch logisch erscheint.
GetVariantValue
Nur wie bringe ich diesen Zugriff so hin, dass es nach meinem Wunsch funktioniert? |
AW: Property via AsString;AsInteger;AsBoolean;.. laden
Du willst doch, dass es einfach funktioniert. Warum nimmst du dann nicht einfach das was ich geschrieben habe? Das was ich geschrieben habe, funktioniert nicht mal, da dann die Variable Key nicht mit übernommen wird. Shit...
|
AW: Property via AsString;AsInteger;AsBoolean;.. laden
Zitat:
Und ich muss so ehrlich sein und sagen, dass mir die Einarbeitungszeit in Implicit für diese Miniklasse als zu hoch erscheint. Es sieht so aus, als ist meine Vorstellung in dieser Art auf meiner Codebasis doch nicht so ohne Weiteres umzusetzen... Ich bekomme einfach diese
Code:
Warnung nicht weg.
Inkompatible Typen
Vor allem frage ich mich, wie es funktionieren soll, wenn der Setter rein im Record deklariert ist.. |
AW: Property via AsString;AsInteger;AsBoolean;.. laden
Zitat:
Quick and Dirty könntest es so umbauen, dass du den folgenden Aufruf hast:
Delphi-Quellcode:
Schön ist aber was anders...
myConfig.Item['dbconfig'] := myConfig.Item['dbconfig'].SetValue(2312);
Würde dann eher vorschlagen, dass du der TConfig eine SetItemValue(Name: string; Value: Variant) Methode spendierst. Oder eine ganz andere Alternative wäre es einen Zeiger auf den Record zurückzugeben, also bei GetVariantValue eien PRConfig2. Aber ob das so toll wäre... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:06 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 by Thomas Breitkreuz