AGB  ·  Datenschutz  ·  Impressum  







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

Attribute überschreiben

Ein Thema von Rainer Wolff · begonnen am 3. Aug 2015 · letzter Beitrag vom 5. Aug 2015
Antwort Antwort
Seite 1 von 2  1 2      
Rainer Wolff

Registriert seit: 25. Okt 2005
Ort: Bretten
321 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Attribute überschreiben

  Alt 3. Aug 2015, 15:56
Ausprobiert hab ich das anhand meiner Klassen schon, da kam aber was anderes bei raus, weil die Attribute auch etwas anders sitzen:

Code:
TBaseClass = class(TControl)
published
  [Checkbox('Ich bin die Beschriftung',10,10)]
  property Eigenschaft1: Boolean read ... write...;
end

TChildclass = class(TBaseClass)
published
  [Checkbox('Now i am an english caption at different position',20,20)]
  property Eigenschaft1: Boolean;
  [Checkbox('I have a second property',30,30]
  property Eigenschaft2: Boolean read... write...;
end;

procedure ErstelleTForm();
var
  Liste: TList<TControl>;
  element: TControl;
begin
  // so in etwa
  Liste.Add(TBaseClass.Create);
  Liste.Add(TChildclass.Create);
  for element in liste do
  begin
    für alle Propertys in Klasse // mit RTTI
    wenn Attribut(Checkbox)
      Erstelle TCheckbox in Formular an PosX, PosY mit Caption (und mach gleich ein Databinding zwischen Checkbox und property)
  end;
end
und da taucht halt dann bei Eigenschaft1 das Attribut aus der Basisklasse auf, das ich gerne ersetzt hätte.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#2

AW: Attribute überschreiben

  Alt 3. Aug 2015, 16:37
Grundsätzlich ist es kein gutes OOP, eine Eigenschaft mit einer konkreten Bedeutung in einer Kindklasse zu überschreiben und ihm dabei eine andere Bedeutung zu geben ('Liskov Prinzip', das 'L' in SOLID).

Vielleicht solltest Du eine Basisklasse ohne Attribute einführen und die Attribute erst in den unterschiedlichen Ableitungen setzen.
  Mit Zitat antworten Zitat
Rainer Wolff

Registriert seit: 25. Okt 2005
Ort: Bretten
321 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Attribute überschreiben

  Alt 4. Aug 2015, 06:55
Grundsätzlich ist es ja auch nicht mein Willen, einer Eigenschaft eine andere Bedeutung zu geben. Es geht ja nur darum, dem Feld eine andere (englische) Beschriftung und eine andere Position zu geben.

Die Basisklasse funktioniert natürlich, da ich die Klasse in verschiedenen Projekten aber leider schon so verbaut habe, wollte ich mir die Änderungen am liebsten sparen.

Geändert von Rainer Wolff ( 4. Aug 2015 um 06:57 Uhr)
  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
 
#4

AW: Attribute überschreiben

  Alt 4. Aug 2015, 07:47
Willst du wirklich für jede Sprache eine eigene Klasse erstellen?

Nimm doch einfach eine Klasse mit den Attributen und beim Auslesen der Attribute holst du dir die Werte, die zu der aktuellen Sprache hinterlegt sind.

Findest du keinen Wert, dann wird eben der Wert genommen, der dort hinterlegt ist.
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 BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#5

AW: Attribute überschreiben

  Alt 4. Aug 2015, 08:19
Nimm doch einfach eine Klasse mit den Attributen und beim Auslesen der Attribute holst du dir die Werte, die zu der aktuellen Sprache hinterlegt sind.
Wie es halt die üblichen Verdächtigen so machen ...

Per Hand im Code die Position der GUI-Elemente zu bestimmen finde ich auch etwas gruselig.
  Mit Zitat antworten Zitat
Benutzerbild von frankyboy1974
frankyboy1974

Registriert seit: 7. Apr 2015
Ort: SH
169 Beiträge
 
Delphi XE7 Professional
 
#6

AW: Attribute überschreiben

  Alt 4. Aug 2015, 10:15
Hallo,

du möchtest also einen String in dem steht "Ich bin der Martin" und dann überschreibst du diesen String und nun steht da drin "Nee ich heisse doch Detlev". Verstehe ich dass richtig???? Also in C++ kannst du auch Operatoren überladen.

mfg

frank
Java ist auch eine Insel.
Ist Delphi von Oracle?
In meiner Buchstabensuppen fehlt das C++!
  Mit Zitat antworten Zitat
Rainer Wolff

Registriert seit: 25. Okt 2005
Ort: Bretten
321 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Attribute überschreiben

  Alt 4. Aug 2015, 11:44
Hallo,

du möchtest also einen String in dem steht "Ich bin der Martin" und dann überschreibst du diesen String und nun steht da drin "Nee ich heisse doch Detlev". Verstehe ich dass richtig???? Also in C++ kannst du auch Operatoren überladen.

mfg

frank
Nein! Im Grund will ich dynamisch aus einer Businessklasse ein Edit-Formular erstellen. Diese Businessklasse kommt mit leichten Variationen (und gewissen Eigenschaften, die grundsätzlich immer vorhanden sind) in vielen verschiedenen Projekten zum Einsatz.

Ich will nur dieses Eingabeformular etwas individueller gestalten, konkret, weil ich jetzt die Variante englische Sprache brauche. Das Ding muss auch nicht mehrsprachig werden, die verschiedenen Versionen gehen halt an verschiedene Kunden in jeweils einer Landessprache.

Ich hatte auch nicht nach Möglichkeiten gesucht, das ganze anders zu programmieren, sondern wollte nur konkret wissen, ob ich diese Attribute variieren kann. Offensichtlich geht das nicht, dann werde ich wohl oder übel zu der Variante Basisklasse ohne Attribute und abgeleitete Klassen mit Attributen wechseln, was halt Änderungen an den bestehenden Projekten mitbringt, was ich eigentlich vermeiden wollte.

Danke für die Vorschläge
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#8

AW: Attribute überschreiben

  Alt 4. Aug 2015, 12:05
Verstehe ich dass richtig????
Guck dir doch das Codebeispiel an, es geht im Attribute von Eigenschaften.

Also in C++ kannst du auch Operatoren überladen.
Das ist nicht falsch, hilft hier aber wenig


Wenn es überhaupt funktioniert, dann steckt das Problem vermutlich irgendwo in für alle Propertys in Klasse // mit RTTI .
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.045 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

AW: Attribute überschreiben

  Alt 5. Aug 2015, 06:37
Grundsätzlich ist es kein gutes OOP, eine Eigenschaft mit einer konkreten Bedeutung in einer Kindklasse zu überschreiben und ihm dabei eine andere Bedeutung zu geben ('Liskov Prinzip', das 'L' in SOLID).
Das Ändern einer Caption oder einer Eigenschaft von 10 auf 30 verletzt wohl kaum das LSP.

Einfach merken, welche Eigenschaften man überschrieben hat:

Delphi-Quellcode:
program Project104;

{$APPTYPE CONSOLE}

uses
  Controls,
  Generics.Collections,
  Rtti,
  SysUtils;

type
  CheckboxAttribute = class(TCustomAttribute)
    constructor Create(const caption: string; X, Y: Integer);
  end;

constructor CheckboxAttribute.Create(const caption: string; X, Y: Integer);
begin
end;

type
  TBaseClass = class(TControl)
  private
    FEigenschaft1: Boolean;
  published
    [Checkbox('Ich bin die Beschriftung',10,10)]
    property Eigenschaft1: Boolean read FEigenschaft1 write FEigenschaft1;
  end;

  TChildclass = class(TBaseClass)
  private
    FEigenschaft2: Boolean;
  published
    [Checkbox('Now i am an english caption at different position',20,20)]
    property Eigenschaft1;
    [Checkbox('I have a second property',30,30)]
    property Eigenschaft2: Boolean read FEigenschaft2 write FEigenschaft2;
  end;

var
  props: TDictionary<string,Boolean>;
  ctx: TRttiContext;
  t: TRttiType;
  p: TRttiProperty;
  a: TCustomAttribute;
begin
  props := TDictionary<string,Boolean>.Create;
  t := ctx.GetType(TChildclass);
  for p in t.GetProperties do
  begin
    if props.ContainsKey(p.Name) then
      Continue
    else
      props.Add(p.Name,True);
    for a in p.GetAttributes do
      if a is CheckboxAttribute then
        Writeln(p.Parent.Name + ' ' + p.ToString);
  end;
  Readln;
end.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#10

AW: Attribute überschreiben

  Alt 5. Aug 2015, 07:22
Wieso nicht? Ich überschreibe/ändere das ursprüngliche Bedeutung. Ob dies nun zu einem veränderten Verhalten oder Darstellung (was ist daran kein Verhalten?) führt, ist -streng genommen- irrelevant.

Gefällt Dir das?
Delphi-Quellcode:
Type
  TBaseClass = class
    Function Foo : String; Virtual;
  end;

  TDerivedClass = class (TBaseClass)
    Function Foo : String; Override;
  end;

Function TBaseClass.Foo: String;
Begin
  Result := 'Foo';
End;

Function TDerivedClass.Foo : String;
Begin
  Inherited; // Ob mit oder ohne, wurscht.
  Result := 'Bar';
End;
Mir jedenfalls nicht. Ist aber Geschmackssache.
  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 21:38 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