![]() |
Managed Records - initializer fälschlicherweise aufgerufen?
Hallo,
Problem mit managed records in 10.4.2. Ich habe einen record und eine generische Liste dieser Records:
Delphi-Quellcode:
und ich habe diese record operators:
type
TMyRec = record Files : TStringlist; MyStr : string; procedure Clear; class operator Initialize(out Dest: TMyRec ); class operator Finalize(var Dest: TMyRec ); end; /// <summary> /// List of all updates found in the package /// </summary> TMyList = class(TList<TMyRec>)
Delphi-Quellcode:
Woanders in einer Klasse im Code habe ich ein Listenfeld und eine Methode die
procedure TMyRec.Clear;
begin Files.Clear; MyStr := ''; end; class operator TMyRec.Finalize(var Dest: TUpdate); begin Dest.ParameterFiles.Free; // mein Loggingaufruf log.Send(LevelBlue, cCategory, 'Liste freigegeben'); end; class operator TMyRec .Initialize(out Dest: TUpdate); begin Dest.ParameterFiles := TStringlist.Create; log.Send(LevelBlue, cCategory, 'Liste erzeugt'); end; etwas verarbeitet:
Delphi-Quellcode:
Lt. diesem Blogpost einer authritativen Quelle:
type
TMyClass = class(TObject) private FMyList : TMyList; procedure DoIt; end; [..] procedure TMyClass.DoIt; var Rec: TMyRec; begin Rec.MyStr := 'Test'; FMyList.Add(Rect); end; ![]() bin ich der Meinung, dass FMyList.Add(Rect); den Initializer von TMyRec nicht aufrufen sollte, da Add in Generics.Collections ein const vor dem Parameter stehen hat und das dann ja wie im Blogpost unter "Passing Managed Records as Parameters" geschildert ein ParByConstValue sein müsste. Nur mein Log und auch der Debugger die sagen etwas anderes. Hat jemand eine Idee? Grüße TurboMagic |
AW: Managed Records - initializer fälschlicherweise aufgerufen?
Zitat:
Delphi-Quellcode:
und nicht Rect. Es ist nicht dieses Statement das den Initializer aufruft sondern das davor, eventuell auch einfach die Deklaration der lokalen Variablen selbst.
FMyList.Add(Rec);
|
AW: Managed Records - initializer fälschlicherweise aufgerufen?
Hallo,
danke für die Antwort. 1. Ja, das muss FMyList.Add(Rec); heißen 2. Mit deiner anderen Vermutung liegst du aber leider falsch! Der Initializer wird einmal beim Betreten der Methode aufgerufen, weil es ja diese lokale Variable gibt: Rec: TMyRec; Aber: er wird auch durch FMyList.Add(Rec); nochmal aufgerufen! Was ich als falsch empfinde! Grüße TurboMagic |
AW: Managed Records - initializer fälschlicherweise aufgerufen?
Zitat:
|
AW: Managed Records - initializer fälschlicherweise aufgerufen?
Ok, aber inzwischen hab' ich nochwas ganz unerklärliches.
Diese Methode:
Delphi-Quellcode:
die ja zu einem Objekt dieses Typs TMyList = class(TList<TMyRec>) gehört
function TMyList.GetSelectedWhatever: UInt8;
begin Result := 0; for var MyRec in self do if MyRec.IsSelected then inc(Result); end; procedure TMyList.DoSomething; begin end; springt beim Debuggen sobald ich die for Schleife erreiche in eine ganz andere normale public methode DoSomething; und zwar mitten in die Methode! Das sieht total falsch abgebogen und nach Bug aus! Ich kann nur meinen Code nicht teilen. Grüße TurboMagic |
AW: Managed Records - initializer fälschlicherweise aufgerufen?
Ok, mein letzter Post stellte sich als falsch heraus, da war der Debugger schuld,
der mal wieder gesetzte Breakpoints vergessen hat. Aber im Freigeben der Stringliste im Finalizer krachts trotzdem noch mit "invalid pointer". |
AW: Managed Records - initializer fälschlicherweise aufgerufen?
Kannst du nicht einmal alles möglichst kurz zum Nachstellen in die .DPR oder eine .pas-Datei packen? Dann kann das jeder bei sich direkt ausprobieren.
|
AW: Managed Records - initializer fälschlicherweise aufgerufen?
Danke, ich habe das jetzt auf eine normale Klasse und eine TBojectList<T> umgebaut und
inzwischen alle dadurch zugezogenen Problemchen beseitigt (glücklicherweise hatte ich für einiges Unit tests) und werde daher gerade kein testprogrämmchen schreiben. Evtl. schaue ich mir das bei gelegenheit nochmal mit einer Minimaldemo an... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz