![]() |
Wertezuweisung an Array der Oberklasse klappt separat, aber nicht als Prozedur
Hallo Delphi Community,
es kann sein, dass ich euch für euch einfache Fragen stelle, aber ich freue mich auf eure Tipps 😉 Eine kurze Frage zur Zuweisung von statischen an dynamische Arrays, die als Parameter in der Prozedur als TObject-Arrays deklariert sind.
Delphi-Quellcode:
Ich möchte an dynArray das statische cArray übergeben.
cArray: Array[0..3] of TUnterklasse;
dynArray: array of TOberklasse; Wird die Wertzuweisung direkt in der Aufrufmethode durchgeführt, klappt es:
Delphi-Quellcode:
In folgender Prozedur wird für aiArray = cArray „Inkompatible Typen“ gemeldet, obwohl der Parameter als Open Array von TObject deklariert ist.
SetLength(dynArray, Length(cArray));
for i := 0 to High(cArray) do dynArray [i] := cArray [i];
Delphi-Quellcode:
Vielen Dank für eure Hinweise 😉
setArrayObj(cArray, dynArray);
procedure setArrayObj(aiArray: array of TObject; var aoArray: TObjectArray); //2024-07-11 var i: Integer; begin SetLength(aoArray, Length(aiArray)); for i := 0 to High(aiArray) do aoArray[i] := aiArray[i]; end; |
AW: Wertezuweisung an Array der Oberklasse klappt separat, aber nicht als Prozedur
Hast du ein komplettes Codebeispiel?
Ich kann jetzt nur raten, aber du kannst dein
Delphi-Quellcode:
halt nicht in ein einen Parameter
cArray: Array[0..3] of TUnterklasse;
Delphi-Quellcode:
reinstecken.
aiArray: array of TObject;
Stell dir das mal umgekehrt vor: Eine Referenz auf ein
Delphi-Quellcode:
zeigt nun auf ein
Array of TObject
Delphi-Quellcode:
. Wer hindert mich jetzt daran, an erster Stelle von meinem Array-Objekt einen
Array of TUnterklasse.
Delphi-Quellcode:
reinzustecken?
TButton
Delphi-Quellcode:
ist ja auch ein
TButton
Delphi-Quellcode:
. Für das Objekt-Array gültig, aber dem Code, der jetzt mit einem "array of TUnterklasse" arbeitet und einen TButton bekommt, dem flöge das jetzt zur Laufzeit um die Ohren.
TObject
Lesestoff zum Thema: ![]() ![]() ![]() |
AW: Wertezuweisung an Array der Oberklasse klappt separat, aber nicht als Prozedur
Alles klar,
danke für deinen Tipp :) |
AW: Wertezuweisung an Array der Oberklasse klappt separat, aber nicht als Prozedur
Alternativ könnte man auch auf eine Lösung mit Generics setzen:
Delphi-Quellcode:
type
TOberklasse = class end; TUnterklasse = class(TOberklasse) end; var cArray: Array[0..3] of TUnterklasse; dynArray: TArray<TOberklasse>; type { Da globale generische Methoden nicht erlaubt sind, brauchen wir einen Container. } TArrayTools = record public { Der zweite generische Parameter TSource ist hier als kompatibel zum ersten Parameter T deklariert. Damit ist sichergestellt dass die Zuweisung zulässig ist. Da das Target-Array eh neu erzeugt wird, halte ich eine function für zweckmäßiger. } class function SetArray<T: class; TSource: T>(const ASource: array of TSource): TArray<T>; static; end; class function TArrayTools.SetArray<T,TSource>(const ASource: array of TSource): TArray<T>; begin SetLength(Result, Length(ASource)); for var I := 0 to Length(ASource) - 1 do Result[I] := ASource[I]; end; procedure Test(); begin dynArray := TArrayTools.SetArray<TOberklasse,TUnterklasse>(cArray); end; |
AW: Wertezuweisung an Array der Oberklasse klappt separat, aber nicht als Prozedur
Vielen Dank Uwe Raabe,
dein Vorschlag mit Generics ist gut - ich habe vor Jahren davon gehört. Da kommme ich wieder rein :-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:52 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-2025 by Thomas Breitkreuz