Einzelnen Beitrag anzeigen

norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
504 Beiträge
 
Delphi 12 Athens
 
#9

AW: Anzeigen wenn sich in TObjectList ein Eintrag geändert hat

  Alt 3. Apr 2021, 18:56
Ich bin nicht sicher ob jetzt ein Teil meiner Anforderung verloren gegangen ist.

So wie TBase die Basisklasse für meine kommenden Objekte ist, sollte TBaseObjectList die Basisklasse für meine kommenden Listen sein

Eine der kommenden Klasse incl. Liste könnte dann so aussehen
Delphi-Quellcode:
  // ***************************************************************************************************************************************
  // Als Beispiel eine auf ein eigenes Property abgespeckte Klasse
  TNamen = class(TBase)
  private
    FNamen: String;
    procedure SetNamen(const Value: String);
  public
    property Namen: String read FNamen write SetNamen;

    constructor Create;
    destructor Destroy; override;
  end;

  // ***************************************************************************************************************************************
  // Und die zu diesem Beispiel passen ObjectList
  TNamenList<T: TNamen> = class(TBaseObjectList);

var
  lNamenList: TNamenList;
Wenn ich es so definiere TNamenList<T: TNamen> = class(TBaseObjectList) sagt Delphi bei Zugriff auf lNamenList[3].Namen dass er Namen nicht kennt

Wenn ich es so definiere TNamenList = TBaseObjectList<TNamen>; sagt Delphi bei Zugriff auf lNamen := lNamenList[3]; dass TNamen und TBase incompatibel sind.

Wenn ich per Typecast lNamen := TNamen(lNamenList[3]); auf die Liste zugreife funktioniert die Änderung von lNamen.Namen und die Liste wird korrekt auf Changed gesetzt. Eigentlich wollte ich aber ohne TypeCast auskommen, zumal es viele Zugriffe gibt die direkt auf lNamenList[3].Namen zugreifen. Und beim Beenden des Programms kommt weiterhin der EAccessViolation.


Das hier verstehe ich nicht ganz
Delphi-Quellcode:
  TBaseObjectList = class(TObjectList<TBase>)
  private
  ...
  end;
  TBaseObjectList<T: TBase> = class(TBaseObjectList);
Soll es wirklich zwei mal TBaseObjectList heißen?

Ich habe mal mein Testcode angehängt. Hängt vielleicht nur noch an einer Kleinigkeit
Angehängte Dateien
Dateityp: 7z Source.7z (4,5 KB, 2x aufgerufen)
  Mit Zitat antworten Zitat