Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Delphi-Coll unter XE2 oder neuer nutzen (https://www.delphipraxis.net/180670-delphi-coll-unter-xe2-oder-neuer-nutzen.html)

Dawn87 6. Jun 2014 12:04

Delphi-Coll unter XE2 oder neuer nutzen
 
Hallo,

ich benutze in einem Projekt von mir die Delphi-Collections, (https://github.com/ghquant/delphi-coll) welche u.A. Erweiterungen für generische Listen, Dictionaries und auch MultiMaps mitbringen. Die Kompilierung des Source-Codes scheitert bei der Kompilierung mit XE2 und XE5 an Stellen in dem entweder ein TKey oder TValue-Wert nach TObject gecastet werden soll:

Delphi-Quellcode:
procedure TObjectDictionary<TKey, TValue>.HandleKeyRemoved(const AKey: TKey);
begin
  if FOwnsKeys then
    TObject(AKey).Free; // <-- E2089 Ungültige Typumwandlung
end;
Mit Delphi XE funktioniert das ganze so noch.

Da es offensichtlich keine neuere Version gibt, frage ich mich nun, wie dieser Fehler behoben werden kann, um diese Library zu XE2/XE5 kompatibel zu machen. Womöglich ist es auch zielführender eine andere Collection-Library zu verwenden, welche noch aktiv gepflegt wird. Im Spring-Framework sind ebenfalls Collections vorhanden, jedoch keine MultiMaps wenn ich das richtig sehe.

Was ich brauche, ist ein generisches TDictionary, welches mehrere Values pro Key verwalten kann. Dies kann (konnte) Delphi in der Vergangenheit leider nicht out-of-the-box.

Hat jemand einen Ratschlag für mich?

Grüße
Stefan

mkinzler 6. Jun 2014 12:19

AW: Delphi-Coll unter XE2 oder neuer nutzen
 
Mit DelphiXE6 geht es ohne Probleme.

Es scheint aber doch eine neuer Version zu geben

Delphi-Quellcode:
procedure TObjectDictionary<TKey, TValue>.HandleKeyRemoved(const AKey: TKey);
begin
  if FOwnsKeys then
    PObject(@AKey)^.Free;
end;

himitsu 6. Jun 2014 13:14

AW: Delphi-Coll unter XE2 oder neuer nutzen
 
Damit man im Generic die Typen problemlos entsprechend casten kann, muß der Typ als "Object" gekennzeichnet sein.

Delphi-Quellcode:
type TObjectDictionary<TKey: class; TValue> = ...

oder
Delphi-Quellcode:
type TObjectDictionary<TKey: TMyClass; TValue> = ...


Ansonsten kommt der "doofe" Code-Parser vom Compiler damit nicht klar.


Die andere Alternative ist leider, wie mkinzler schon zeigte, das brutale Umgehen der Typprüfung des Compilers.




Delphi macht derartige Typprüfungen leider schon in der generischen Deklaration, und nicht erst in der Ableitung.

Dawn87 6. Jun 2014 13:18

AW: Delphi-Coll unter XE2 oder neuer nutzen
 
Besten Dank für Eure Antworten.

Es gibt tatsächlich eine neuere Version. Die habe ich ausgerechnet im Ursprungsbeitrag sogar verlinkt. Wenn man sich von der Website den MASTER-Branch holt, funktioniert es auch mit Delphi XE5.

Tatsächlich wird aber auch in der Version nicht die Variante, welche himitsu vorgeschlagen hat umgesetzt, sondern die Typprüfung wird umgangen.

Grüße
Stefan

Stevie 6. Jun 2014 14:38

AW: Delphi-Coll unter XE2 oder neuer nutzen
 
Ich würde dir empfehlen, Spring4D zu nutzen. Das wird aktiv entwickelt (Delphi-Coll ist faktisch tot - Alex macht daran nix mehr).

Delphi-Coll hat einige eher ausgefallenere Collection Types, die Spring4D (noch) nicht hat. Wenn dir dort etwas fehlen sollte, Feedback ist gern willkommen.

Dawn87 7. Jun 2014 13:54

AW: Delphi-Coll unter XE2 oder neuer nutzen
 
Hallo Stevie,

auch Dir Danke ich für Deine Antwort.

Was die Collections betrifft, so hast Du ja einen ersten Vorschlag: "Multimaps". Fürs Erste muss ich erst einmal bei Delphi-Coll bleiben, aber ich werde den Aufwand für einen Umstieg demnächst mal genauer bewerten.

Spring4d bzw. Dependency Injection im Allgemeinen ist ein Thema mit dem ich mich neben dem Berufsalltag zurzeit auseinandersetze. Diesbezüglich kommen sicher bald einige Fragen auf das Forum zu. Bei der Verwendung von DI fällt einem erst einmal so auf, was man sich in der Vergangenheit durch "suboptimale" Programmstukturierung verbaut hat.

Beste Grüße
Stefan

Stevie 9. Jun 2014 13:51

AW: Delphi-Coll unter XE2 oder neuer nutzen
 
Zitat:

Zitat von Dawn87 (Beitrag 1261683)
Was die Collections betrifft, so hast Du ja einen ersten Vorschlag: "Multimaps". Fürs Erste muss ich erst einmal bei Delphi-Coll bleiben, aber ich werde den Aufwand für einen Umstieg demnächst mal genauer bewerten.

Multimaps hab ich gestern eingebaut.

Zitat:

Zitat von Dawn87 (Beitrag 1261683)
Spring4d bzw. Dependency Injection im Allgemeinen ist ein Thema mit dem ich mich neben dem Berufsalltag zurzeit auseinandersetze. Diesbezüglich kommen sicher bald einige Fragen auf das Forum zu. Bei der Verwendung von DI fällt einem erst einmal so auf, was man sich in der Vergangenheit durch "suboptimale" Programmstukturierung verbaut hat.

Ja, das sind immer diese Aha-Momente, wo einem dann schlagartig klar wird, warum manche immer von Design Prinzipien und so rumlabern ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:13 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