AGB  ·  Datenschutz  ·  Impressum  







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

Eigene Klasse von TObjectDictonary

Ein Thema von psycodad · begonnen am 20. Dez 2018 · letzter Beitrag vom 1. Feb 2019
Antwort Antwort
Seite 1 von 2  1 2      
psycodad

Registriert seit: 8. Feb 2005
Ort: Embrach (CH)
40 Beiträge
 
Delphi 10.3 Rio
 
#1

Eigene Klasse von TObjectDictonary

  Alt 20. Dez 2018, 17:23
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?
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Eigene Klasse von TObjectDictonary

  Alt 20. Dez 2018, 17:27
Kannst du mal Code zeigen wie du das Objekt erstellst/benutzt?
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.443 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Eigene Klasse von TObjectDictonary

  Alt 20. Dez 2018, 17:29
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.
  Mit Zitat antworten Zitat
psycodad

Registriert seit: 8. Feb 2005
Ort: Embrach (CH)
40 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Eigene Klasse von TObjectDictonary

  Alt 20. Dez 2018, 17:29
Code:
var
  ReportCache: TReportCache;
begin
 ReportCache := TReportCache.Create();
end;
  Mit Zitat antworten Zitat
psycodad

Registriert seit: 8. Feb 2005
Ort: Embrach (CH)
40 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Eigene Klasse von TObjectDictonary

  Alt 20. Dez 2018, 17:32
Mann mann mann, jepp, das war's. Das ich da nicht selber drauf gekommen bin.

VIELEN DANK.
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: Eigene Klasse von TObjectDictonary

  Alt 20. Dez 2018, 17:48
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;
  Mit Zitat antworten Zitat
psycodad

Registriert seit: 8. Feb 2005
Ort: Embrach (CH)
40 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Eigene Klasse von TObjectDictonary

  Alt 31. Jan 2019, 14:18
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?
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: Eigene Klasse von TObjectDictonary

  Alt 31. Jan 2019, 20:24
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;
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
675 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Eigene Klasse von TObjectDictonary

  Alt 1. Feb 2019, 01:08
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.
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.443 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Eigene Klasse von TObjectDictonary

  Alt 1. Feb 2019, 08:29
Weil:
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

Geändert von freimatz ( 1. Feb 2019 um 08:37 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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:33 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