Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Syntax für generischen Typ (https://www.delphipraxis.net/171377-syntax-fuer-generischen-typ.html)

Codewalker 4. Nov 2012 13:28

Delphi-Version: XE

Syntax für generischen Typ
 
Hallo zusammen.

Ich versuche mir für ein Lokalisierungsproblem ein generisches Dictionary zu machen, das mir zu einem Sprachcode einen Wert zuordnet. Das ganze soll so aussehen:

Delphi-Quellcode:
  TLanguageCode = String[3];

  // Mal als Tests:
  TLocalizedStrings = TDictionary<TLanguageCode, String>;
  TLocalizedValues = TDictionary<TLanguageCode, Variant>;

  // es soll aber generisch sein, also so:
  TLocalizedData<T> = TDictionary<TLanguageCode, T>;
Leider bekomme ich bei der letzten Zeile (um die es mir ja eigentlich geht) als Fehler: "E2508 Typparameter sind bei diesem Typ nicht erlaubt". Die Hilfe sagt dazu "Generische Klassen dürfen nicht direkt mit Klassenreferenzen verwendet werden. Generics müssen mit einer Wrapper-Klasse verwendet werden". Kann mir das mal jemand übersetzen, was damit gemeint ist?

Sir Rufo 4. Nov 2012 13:46

AW: Syntax für generischen Typ
 
Die meinen das damit
Delphi-Quellcode:
TLocalizeData<T> = class( TDictionary<TLanguageCode, T> )
end;

Codewalker 4. Nov 2012 13:49

AW: Syntax für generischen Typ
 
Zitat:

Zitat von Sir Rufo (Beitrag 1189640)
Die meinen das damit
Delphi-Quellcode:
TLocalizeData<T> = class( TDictionary<TLanguageCode, T> )
end;

Ach so. Können die sich dann in der Hilfe nicht gescheit ausdrücken und das als Lösungsbeispiel geben.
Danke Dir für die schnelle Hilfe :thumb:

nuclearping 5. Nov 2012 06:16

AW: Syntax für generischen Typ
 
Kann man auch noch anders machen, indem man das Dictionary Teil einer Klasse macht.
Delphi-Quellcode:
unit ...;

interface

uses ..., Generics.Collections;

type
  TLocalize = class
  strict protected
    FDictionary: TDictionary<String,String>;
  public
    property GetText[AText: String]: String
      read GetLocalizedText; default;

    // Controls übersetzen
    procedure Translate(AForm: TForm); override;
    procedure Translate(AFrame: TFrame); override;
    procedure Translate(AControl: TWinControl); override;
  end;

implementation

function TLocalize.GetLocalizedText(AText: String): String;
begin
  Result := '';
  if Length(Trim(AText)) = 0 then
    Exit;

  if not FDict.TryGetValue(AText, Result) then
    begin
      FDict.Add(AText, AText);
      Result := AText;
    end;
end;
Verwenden kann man's dann zB so:
Delphi-Quellcode:
var
  L: TLocalize;

begin
  L := TLocalize.Create;
  try
    L.Translate(Self);
    // ...
    ShowMessage(L['Hallo Welt']);
  finally
    FreeAndNil(L);
  end;
end;
Vorteil ist, dass man mehr in die Klasse packen kann, zB Funktionen um Controls zu übersetzen, speichern und laden des Dict usw.

EDIT
Grad gesehen. Wenn du im gleichen Dict verschiedene Sprachen unterbringen willst, müsstest du in dem Fall entweder verschiedene Dicts verwenden (in getrennten Dateien speichern / laden) oder noch ein übergeordnetes Dict schaffen á la TDictionary<Language-String,TLocalize-Klasse>.

Sir Rufo 5. Nov 2012 07:52

AW: Syntax für generischen Typ
 
Zitat:

Zitat von nuclearping (Beitrag 1189732)
Grad gesehen. Wenn du im gleichen Dict verschiedene Sprachen unterbringen willst, müsstest du in dem Fall entweder verschiedene Dicts verwenden (in getrennten Dateien speichern / laden) oder noch ein übergeordnetes Dict schaffen á la TDictionary<Language-String,TLocalize-Klasse>.

:shock: öh, es gibt auch noch [OH]TPair<TKey,TValue>[/OH] das würde sich doch anbieten ;)

nuclearping 5. Nov 2012 09:22

AW: Syntax für generischen Typ
 
Oh ok, danke. Selbst noch nicht gewusst. :stupid:

Sir Rufo 5. Nov 2012 09:41

AW: Syntax für generischen Typ
 
Um einen Primary Key in einem TDictionary<TKey,TValue> abzubilden, kann man als TKey ja einen Typen seiner Wahl angeben.

Habe ich für diesen Primary Key ...
  • einen Wert, dann nehme ich genau den Datentyp dieses einen Wertes.
    Delphi-Quellcode:
    MyDict : TDictionary<string,TMySubject>;
  • zwei Werte, dann nehme ich TPair<TKey,TValue>
    Delphi-Quellcode:
    MyDict : TDictionary<TPair<string,Int64>,TMySubject>;
    oder alternativ auch
  • n Werte, dann erzeuge ich mir ein Record mit allen Werten
    Delphi-Quellcode:
    TFooPrimaryKey = record
      Value1 : string;
      Value2 : Int64;
      Value3 : Boolean;
      Value4 : string;
    end;

    MyDict : TDictionary<TFooPrimaryKey,TMySubject>;

himitsu 5. Nov 2012 09:49

AW: Syntax für generischen Typ
 
Wobei man bei den letzen 2 eventuell noch einen Comparer erstellen sollte, da TDictionary nicht von selbst diese Typen vergleichen kann.

Das kann nur Binär, bei solchen komplexen Typen, und da wird 'Text' nicht unbedingt gleich 'Text' sein. (wenn das unterschiedliche Variablen sind, da nur der Zeiger und nicht der Inhalt verglichen würde)

Sir Rufo 5. Nov 2012 10:17

AW: Syntax für generischen Typ
 
Zitat:

Zitat von himitsu (Beitrag 1189770)
Wobei man bei den letzen 2 eventuell noch einen Comparer erstellen sollte, da TDictionary nicht von selbst diese Typen vergleichen kann.

Nicht beim TPair ... bei dem normalen Record ja ;)

himitsu 5. Nov 2012 10:25

AW: Syntax für generischen Typ
 
OK, vielleicht hat Delphi, für TPair, sich schon irgendwo schon einen Standard-Comparer definiert? :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:54 Uhr.
Seite 1 von 2  1 2      

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