AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Syntax für generischen Typ

Ein Thema von Codewalker · begonnen am 4. Nov 2012 · letzter Beitrag vom 5. Nov 2012
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Codewalker
Codewalker

Registriert seit: 18. Nov 2005
Ort: Ratingen
945 Beiträge
 
Delphi XE2 Professional
 
#1

Syntax für generischen Typ

  Alt 4. Nov 2012, 13:28
Delphi-Version: XE
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?
  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
 
#2

AW: Syntax für generischen Typ

  Alt 4. Nov 2012, 13:46
Die meinen das damit
Delphi-Quellcode:
TLocalizeData<T> = class( TDictionary<TLanguageCode, T> )
end;
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 Codewalker
Codewalker

Registriert seit: 18. Nov 2005
Ort: Ratingen
945 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Syntax für generischen Typ

  Alt 4. Nov 2012, 13:49
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
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Syntax für generischen Typ

  Alt 5. Nov 2012, 06:16
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>.

Geändert von nuclearping ( 5. Nov 2012 um 06:49 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
 
#5

AW: Syntax für generischen Typ

  Alt 5. Nov 2012, 07:52
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>.
öh, es gibt auch noch [OH]TPair<TKey,TValue>[/OH] das würde sich doch anbieten
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
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Syntax für generischen Typ

  Alt 5. Nov 2012, 09:22
Oh ok, danke. Selbst noch nicht gewusst.
  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
 
#7

AW: Syntax für generischen Typ

  Alt 5. Nov 2012, 09:41
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.
    MyDict : TDictionary<string,TMySubject>;
  • zwei Werte, dann nehme ich TPair<TKey,TValue>
    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>;
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 himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.098 Beiträge
 
Delphi 12 Athens
 
#8

AW: Syntax für generischen Typ

  Alt 5. Nov 2012, 09:49
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  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
 
#9

AW: Syntax für generischen Typ

  Alt 5. Nov 2012, 10:17
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
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 himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.098 Beiträge
 
Delphi 12 Athens
 
#10

AW: Syntax für generischen Typ

  Alt 5. Nov 2012, 10:25
OK, vielleicht hat Delphi, für TPair, sich schon irgendwo schon einen Standard-Comparer definiert?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 5. Nov 2012 um 10:28 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 13:28 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