Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Eigene Klasse von TObjectDictonary (https://www.delphipraxis.net/199047-eigene-klasse-von-tobjectdictonary.html)

psycodad 20. Dez 2018 16:23

Eigene Klasse von TObjectDictonary
 
Guten Abend allerseits,

Ich probiere mir eine eigene Klasse von TObjectDictionary zu basteln. Das geht ja alles gut unds kompiliert auch. Wenn ich allerdings dann ein Objekt von der Klasse erzeugen möchte, ist beim "Inherited Create( s,0)" im Constructor Schluss mit Lustig. Ich krieg immer ne Fehlermeldung:

Erste Gelegenheit für Exception bei $77401812. Exception-Klasse EInvalidCast mit Meldung 'Ungültige Typumwandlung'. Prozess MyProg.exe (6512)


Code:
type
  TReportCache = class( TObjectDictionary<String,TfrxReport> )
  private
  public
    function GetReportObject( const aReportName: string): TfrxReport;
    procedure DelReportObject( const aReportName: string);
    Constructor Create;
  end;

implementation

{ TReportCache }

constructor TReportCache.Create;
var
  s: TDictionaryOwnerShips;
begin
  s := [doOwnsKeys, doOwnsValues];
  inherited Create( s, 0);
end;
Wenn ich "inherited Create" im Constructor ohne Parameter aufrufe funktionierts, allerdings krieg ich dann üble Speicherlecks weil die Objekte so in der Liste natürlich nicht abgeräumt werden.

Hat mir jemand einen Tipp was ich falsch mache?

Neutral General 20. Dez 2018 16:27

AW: Eigene Klasse von TObjectDictonary
 
Kannst du mal Code zeigen wie du das Objekt erstellst/benutzt?

freimatz 20. Dez 2018 16:29

AW: Eigene Klasse von TObjectDictonary
 
Hm, meine Vermutung ist das doOwnsKeys. Key ist bei Dir ein String. Das ist kein Objekt, welches das Dictionary freigeben darf.
Sonst wäre es ja schon noch interssant wo denn die Schutzverletzung kommt. Doch wohl nicht in dem Code den du hier zeigst.

psycodad 20. Dez 2018 16:29

AW: Eigene Klasse von TObjectDictonary
 
Code:
var
  ReportCache: TReportCache;
begin
 ReportCache := TReportCache.Create();
end;

psycodad 20. Dez 2018 16:32

AW: Eigene Klasse von TObjectDictonary
 
Mann mann mann, jepp, das war's. Das ich da nicht selber drauf gekommen bin.

VIELEN DANK.

Der schöne Günther 20. Dez 2018 16:48

AW: Eigene Klasse von TObjectDictonary
 
Tipp: Soweit du keinen wirklich guten Grund hast tust dir keinen Gefallen mit der Vererbung. Nimm stattdessen ein TObjectDictionary<String,TfrxReport> und benutze es.

https://de.wikipedia.org/wiki/Kompos..._von_Vererbung

Delphi-Quellcode:
TReportCache = class
   private var
      dictionary: TObjectDictionary<String, TFrxReport>;
   public
      function GetReportObject( const aReportName: string): TfrxReport;
      procedure DelReportObject( const aReportName: string);
      Constructor Create();
end;

psycodad 31. Jan 2019 13:18

AW: Eigene Klasse von TObjectDictonary
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1421448)
Tipp: Soweit du keinen wirklich guten Grund hast tust dir keinen Gefallen mit der Vererbung. Nimm stattdessen ein TObjectDictionary<String,TfrxReport> und benutze es.

https://de.wikipedia.org/wiki/Kompos..._von_Vererbung

Delphi-Quellcode:
TReportCache = class
   private var
      dictionary: TObjectDictionary<String, TFrxReport>;
   public
      function GetReportObject( const aReportName: string): TfrxReport;
      procedure DelReportObject( const aReportName: string);
      Constructor Create();
end;

Danke für den Tipp. Werde es in Zukunft mit Kompositon machen, sehr einleuchtend. Eine kleine Frage noch zu deinem Beispiel: Wieso machst du ein private var? Würde nicht ein private alleine reichen?

Der schöne Günther 31. Jan 2019 19:24

AW: Eigene Klasse von TObjectDictonary
 
Ja, es würde reichen. Ich habe mir einfach angewöhnt in Klassendefinitionen die Variablen von den Methoden zu trennen:

Delphi-Quellcode:
TReportCache = class
    private var
        someVariable: Integer;
        someOtherVariable: Integer;
    private
        procedure doStuff();
end;

MyRealName 1. Feb 2019 00:08

AW: Eigene Klasse von TObjectDictonary
 
Man braucht doch die Klasse drumherum garnicht, einfach

Code:
ReportCache := TDictionary<String,TFrxReport>.Create;
und dann statt dem

Code:
function GetReportObject( const aReportName: string): TfrxReport;
einfach

Code:
ReportCache.TrygetValue(aReportName, aObj);
aufrufen.

freimatz 1. Feb 2019 07:29

AW: Eigene Klasse von TObjectDictonary
 
Weil:
Zitat:

Zitat von Der schöne Günther (Beitrag 1421448)
Tipp: Soweit du keinen wirklich guten Grund hast tust dir keinen Gefallen mit der Vererbung. Nimm stattdessen ein TObjectDictionary<String,TfrxReport> und benutze es.

https://de.wikipedia.org/wiki/Kompos..._von_Vererbung

Oder auch Favour_Composition_over_Inheritance_FCoI


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