![]() |
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:
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?
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>; |
AW: Syntax für generischen Typ
Die meinen das damit
Delphi-Quellcode:
TLocalizeData<T> = class( TDictionary<TLanguageCode, T> )
end; |
AW: Syntax für generischen Typ
Zitat:
Danke Dir für die schnelle Hilfe :thumb: |
AW: Syntax für generischen Typ
Kann man auch noch anders machen, indem man das Dictionary Teil einer Klasse macht.
Delphi-Quellcode:
Verwenden kann man's dann zB so:
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;
Delphi-Quellcode:
Vorteil ist, dass man mehr in die Klasse packen kann, zB Funktionen um Controls zu übersetzen, speichern und laden des Dict usw.
var
L: TLocalize; begin L := TLocalize.Create; try L.Translate(Self); // ... ShowMessage(L['Hallo Welt']); finally FreeAndNil(L); end; end; 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>. |
AW: Syntax für generischen Typ
Zitat:
|
AW: Syntax für generischen Typ
Oh ok, danke. Selbst noch nicht gewusst. :stupid:
|
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 ...
|
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) |
AW: Syntax für generischen Typ
Zitat:
|
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 02:43 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