AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Wertezuweisung an Array der Oberklasse klappt separat, aber nicht als Prozedur
Thema durchsuchen
Ansicht
Themen-Optionen

Wertezuweisung an Array der Oberklasse klappt separat, aber nicht als Prozedur

Ein Thema von enigma · begonnen am 11. Jul 2024 · letzter Beitrag vom 11. Jul 2024
Antwort Antwort
enigma

Registriert seit: 15. Jun 2008
47 Beiträge
 
#1

Wertezuweisung an Array der Oberklasse klappt separat, aber nicht als Prozedur

  Alt 11. Jul 2024, 13:49
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:
cArray: Array[0..3] of TUnterklasse;
dynArray: array of TOberklasse;
Ich möchte an dynArray das statische cArray übergeben.
Wird die Wertzuweisung direkt in der Aufrufmethode durchgeführt, klappt es:
Delphi-Quellcode:
  SetLength(dynArray, Length(cArray));
  for i := 0 to High(cArray) do
    dynArray [i] := cArray [i];
In folgender Prozedur wird für aiArray = cArray „Inkompatible Typen“ gemeldet, obwohl der Parameter als Open Array von TObject deklariert ist.
Delphi-Quellcode:
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;
Vielen Dank für eure Hinweise 😉
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: Wertezuweisung an Array der Oberklasse klappt separat, aber nicht als Prozedur

  Alt 11. Jul 2024, 14:20
Hast du ein komplettes Codebeispiel?
Ich kann jetzt nur raten, aber du kannst dein cArray: Array[0..3] of TUnterklasse; halt nicht in ein einen Parameter aiArray: array of TObject; reinstecken.

Stell dir das mal umgekehrt vor: Eine Referenz auf ein Array of TObject zeigt nun auf ein Array of TUnterklasse. . Wer hindert mich jetzt daran, an erster Stelle von meinem Array-Objekt einen TButton reinzustecken? TButton ist ja auch ein TObject . 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.

Lesestoff zum Thema:

https://de.wikipedia.org/wiki/Kovari..._Kontravarianz

https://delphisorcery.blogspot.com/2...-variance.html

https://codeblog.jonskeet.uk/2013/06...-but-slow-too/
  Mit Zitat antworten Zitat
enigma

Registriert seit: 15. Jun 2008
47 Beiträge
 
#3

AW: Wertezuweisung an Array der Oberklasse klappt separat, aber nicht als Prozedur

  Alt 11. Jul 2024, 14:53
Alles klar,
danke für deinen Tipp
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#4

AW: Wertezuweisung an Array der Oberklasse klappt separat, aber nicht als Prozedur

  Alt 11. Jul 2024, 15:12
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
enigma

Registriert seit: 15. Jun 2008
47 Beiträge
 
#5

AW: Wertezuweisung an Array der Oberklasse klappt separat, aber nicht als Prozedur

  Alt 11. Jul 2024, 15:28
Vielen Dank Uwe Raabe,

dein Vorschlag mit Generics ist gut - ich habe vor Jahren davon gehört.
Da kommme ich wieder rein
  Mit Zitat antworten Zitat
Antwort Antwort

 

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