AGB  ·  Datenschutz  ·  Impressum  







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

TDictionary als const

Ein Thema von wurzelzwerg · begonnen am 22. Jun 2017 · letzter Beitrag vom 22. Jun 2017
Antwort Antwort
wurzelzwerg

Registriert seit: 19. Jun 2011
Ort: Ilmenau
111 Beiträge
 
Delphi XE5 Enterprise
 
#1

TDictionary als const

  Alt 22. Jun 2017, 13:00
Moin,

wie deklariert man in Delphi ein TDictionary<string,string> als Konstante?
Das geht ja nicht:
Delphi-Quellcode:
const
  MD: TDictionary<string, string> = ( ('A', 'xxx'), ('B', 'yyy') );
// oder
// MD: TDictionary<string, string> = ( ('A': 'xxx'), ('B': 'yyy') );
danke
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#2

AW: TDictionary als const

  Alt 22. Jun 2017, 13:05
Das hier könnte weiterhelfen:

Zitat:
You cannot write a constant expression that is an instance of a class. So what you are attempting to do is not possible.
https://stackoverflow.com/questions/...-default-value

TDictionary ist hier eindeutig nicht das was du suchst.
  Mit Zitat antworten Zitat
wurzelzwerg

Registriert seit: 19. Jun 2011
Ort: Ilmenau
111 Beiträge
 
Delphi XE5 Enterprise
 
#3

AW: TDictionary als const

  Alt 22. Jun 2017, 13:18
TDictionary ist hier eindeutig nicht das was du suchst.
danke, was sollte ich denn suchen?
Irgenwas wo ich über den key an value komme(readonly).
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: TDictionary als const

  Alt 22. Jun 2017, 13:27
Warum muss es denn eine Konstante sein?

Wenn es irgendeine Objektinstanz (Liste, Dictionary o.ä.) ist, wirst Du deren Daten immer verändern können.

Du könntest evtl. ein Singleton verwenden:

Delphi-Quellcode:
function MyDic: TDictionary<string, string>
begin
  if not Assigned(_MyDic) then
  begin
    _MyDic := TDictionary<string, string>.Create;
    _MyDic...DatenAnlegen;
  end;
  Result := _MyDic;
end;
Dann kannst Du MyDic zumindest nicht neu zuweisen freigeben aber immer noch).

Du kannst natürlich auch eine Funktion oder statische Klasse schreiben, der Du einen String übergibst und hard codiert einen anderen zurück erhältst.

Ist halt die Frage, was Du genau brauchst...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: TDictionary als const

  Alt 22. Jun 2017, 13:28
Wäre die Referenz eine Konstante (oder Singleton, oder ...), würde dir das auch nicht helfen, denn jeder kann ja die Referenz nehmen und Methoden wie Remove(..) oder Clear() aufrufen.

Unter System.Generics.Collections gibt es leider kein "Read Only"-Dictionary.

Mit den Standard-Delphi-Collections bin ich nie lange glücklich geworden, die Collections von Spring4D sind fantastisch. Da gibt es dann z.B. auch ein IReadOnlyDictionary<X, Y>


Ansonsten wenn es nur für diesen einen Anwendungszweck ist, mach dir doch eine eigene Klasse um ein TDictionary<X, Y> welches nur Methoden zum Nachschlagen, nicht modifizieren anbietet.
  Mit Zitat antworten Zitat
wurzelzwerg

Registriert seit: 19. Jun 2011
Ort: Ilmenau
111 Beiträge
 
Delphi XE5 Enterprise
 
#6

AW: TDictionary als const

  Alt 22. Jun 2017, 13:40
OK, danke. Werde mir dann wohl selbst was bauen.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

AW: TDictionary als const

  Alt 22. Jun 2017, 16:05
Warum muss es denn eine Konstante sein?

Wenn es irgendeine Objektinstanz (Liste, Dictionary o.ä.) ist, wirst Du deren Daten immer verändern können.
Um die Konstante ansich geht es ja nicht, sondern um die Möglichkeit der statischen Initialisiertung, wie sie z.b. gültig ist für
  • Arrays
    Delphi-Quellcode:
    const
      MyArray: array[0..1] of Integer = (0, 1);
  • Records
    Delphi-Quellcode:
    const
      MyRecord: TRecord = ( Foo: 1; Bar: 'test' );
  • etc

In C++ kann man auch fast alle standard Container der STL mit solchen Initializer-Lists statisch initialisieren, selbst wenn es sich um dynamisch erstellte Instanzen handelt. Delphi kann das meines Wissens nach nur für dynamische Arrays des Typs type TXArray = array of X :
Delphi-Quellcode:
var
  A: TStringArray;
begin
  A := TStringArray.Create('test', '123', '456');
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#8

AW: TDictionary als const

  Alt 22. Jun 2017, 17:10
Delphi kann das meines Wissens nach nur für dynamische Arrays des Typs type TXArray = array of X :
Delphi-Quellcode:
var
  A: TStringArray;
begin
  A := TStringArray.Create('test', '123', '456');
Das geht mittlerweile auch so:
Delphi-Quellcode:
const
  cStrings: TArray<string> = ['A', 'B', 'C'];
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort


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 16:09 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