Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Beliebiges Array übergeben (https://www.delphipraxis.net/170537-beliebiges-array-uebergeben.html)

dominikkv 21. Sep 2012 17:17

Beliebiges Array übergeben
 
Hallo,

ich habe folgende Arrays:
Delphi-Quellcode:
type
  TMeinArray1: array of TMeinObjekt1;
  TMeinArray2: array of TMeinObjekt2;
  TMeinArray3: array of TMeinObjekt3;
TMeinObjekt1, TMeinObjekt2 und TMeinObjekt3 erben alle von TPersistent, mehr haben sie nicht gemeinsam.

Mein Problem ist, ich möchte eine Funktion schreiben, die Arrays von diesen Typen als Parameter entgegennimmt.
Soll heißen das hier sollte möglich sein:
Delphi-Quellcode:
var
  meinArray1: TMeinArray1;
  meinArray2: TMeinArray2;
  meinArray3: TMeinArray3;
begin
  // Initialisiere die drei arrays und fülle sie mit Werten...

  MeineTolleFunktion(meinArray1);
  MeineTolleFunktion(meinArray2);
  MeineTolleFunktion(meinArray3);
end;
Mein Versuch sieht so aus:
Delphi-Quellcode:
function MeineTolleFunktion(const Parameter): Boolean;
var
  I1        : Integer;
  MeinObjekt: TObject;
begin
//  for I1 := 0 to Length(Parameter) - 1 do // Length(Parameter) geht natürlich nicht
//    begin
//      MeinObjekt := Parameter[I1]; // Parameter[I1] geht natürlich nicht
//      MacheWasMit(MeinObjekt);
//    end;
end;
Das ganze kompilliert schon mal, nur möchte ich jetzt, wie als Kommentar angedeutet, auf das Array zugreifen...

Hat jemand eine Idee, wie man sowas machen könnte? Oder vielleicht einen ganz anderen Ansatz?


Grüße
Dominik


Edit:// Delphi 7

sirius 21. Sep 2012 17:48

AW: Beliebiges Array übergeben
 
Du nimmst statt Arrays eine Klasse namens TObjectList.

Panthrax 21. Sep 2012 18:31

AW: Beliebiges Array übergeben
 
Delphi-Quellcode:
type
  PMeinArray = ^TMeinArray;
  TMeinArray = array of TPersistent;

{ Variante 1 }

function MeineTolleFunktion(const Parameter: PMeinArray): Boolean; overload;
begin
  Result := False;
end;

{ Variante 2 }

function MeineTolleFunktion(const Parameter: TMeinArray): Boolean; overload;
begin
  Result := False;
end;

function MeineTolleFunktion(const Parameter: TMeinArray1): Boolean; inline; overload;
var
  P: TMeinArray absolute Parameter;
begin
  Result := MeineTolleFunktion(P);
end;

var
  MeinArray1: TMeinArray1;

begin
  MeineTolleFunktion(@MeinArray1); // Variante 1
  MeineTolleFunktion(MeinArray1); // Variante 2
end.
Ich würde Variante 2 nehmen, oder von TList ableiten (Variante 3):
Delphi-Quellcode:
{ Variante 3}
type
  TPersistentList = class(TList) // ggf. von TObjectList ableiten
    // Typsicherheit herstellen für TPersistent
  end;

  TMeinObjekt1List = class(TPersistentList)
    // Typsicherheit herstellen für TMeinObjekt1
  end;

function MeineTolleFunktion(const Parameter: TPersistentList): Boolean; overload;
begin
  Result := False;
end;

Aphton 21. Sep 2012 22:52

AW: Beliebiges Array übergeben
 
Delphi 2007 unterstützt noch keine Generics, oder?

Bummi 21. Sep 2012 23:19

AW: Beliebiges Array übergeben
 
wenn alle MeinObjektx von einer Basisklasse MeinObjekt abgeleitet sind kann man ja auch wenn man es nie braucht

TMeinArray= array of TMeinObjekt;

deklarieren und wie folgt verfahren ...

Delphi-Quellcode:
function MeineTolleFunktion(const Parameter: TMeinArray): Boolean; overload;
begin
   if High(Parameter)>-1 then
      if Parameter[0] is TMeinObjekt1  then Showmessage('Nr1')
      else Showmessage('Keine Nr 1');


  Result := False;
end;

procedure TForm2.Button1Click(Sender: TObject);
var
 vArray1:TMeinArray1;
 vArray2:TMeinArray2;
begin
   SetLength(vArray1,1);
   vArray1[0] := TMeinObjekt1.Create;
   MeineTolleFunktion(TMeinArray(vArray1)) ;
   vArray1[0].Free;

   SetLength(vArray2,1);
   vArray2[0] := TMeinObjekt2.Create;
   MeineTolleFunktion(TMeinArray(vArray2)) ;
   vArray2[0].Free;
end;

himitsu 21. Sep 2012 23:58

AW: Beliebiges Array übergeben
 
Haben diese TMeinObjektX einen gemeinsamen Vorfahren? (wenn nicht, dann TObject)

Versuch mal einen offenen Array-Parameter
Delphi-Quellcode:
function MeineTolleFunktion(Parameter: array of TMeinObjektVorfahr): Boolean;
Falls das ncht geht, dann wäre es "sicherer", wenn du 3 überladene Prozeduren erstellt, also je Typ eine Version.
Bei deiner Variante, könntest du die Arrays in ein
Delphi-Quellcode:
array of TObject
casten, aber wenn jemand was Anderes übergibt, dann knallt es ganz schnell mal.

dominikkv 24. Sep 2012 20:25

AW: Beliebiges Array übergeben
 
Danke für die vielen Antworten!
Zitat:

Zitat von sirius (Beitrag 1183919)
Du nimmst statt Arrays eine Klasse namens TObjectList.

Danke, natürlich mache ich das. Die erleichtert mir auch das Leben beim Freigeben :wink: Das ich das nicht gleich gesehen habe... aber manchmal wächst halt so ein Code mit der Zeit und man wird blind für radikalere Änderungen :lol:
Zitat:

Zitat von Panthrax (Beitrag 1183923)
Delphi-Quellcode:
begin
  MeineTolleFunktion(@MeinArray1); // Variante 1
  MeineTolleFunktion(MeinArray1); // Variante 2
end.

Variante 1 will ich nicht, und für Variante 2 müsste ich für jedes Array eine eigene Funktion basteln... aber cooler Ansatz :thumb:
Variante 3 geht in die Richtung mit der TObjectList :stupid:
Zitat:

Zitat von Aphton (Beitrag 1183939)
Delphi 2007 unterstützt noch keine Generics, oder?

Auf jeden Fall gilt dies für Delphi 7
Zitat:

Zitat von Bummi (Beitrag 1183940)
wenn alle MeinObjektx von einer Basisklasse MeinObjekt abgeleitet sind kann man ja auch wenn man es nie braucht

TMeinArray= array of TMeinObjekt;

deklarieren und wie folgt verfahren ...
Delphi-Quellcode:
MeineTolleFunktion(TMeinArray(vArray1)) ;

Würde gehen, will ich aber nicht 8-)
Zitat:

Zitat von himitsu (Beitrag 1183941)
Haben diese TMeinObjektX einen gemeinsamen Vorfahren? (wenn nicht, dann TObject)

TPersistent
Zitat:

Zitat von himitsu (Beitrag 1183941)
Versuch mal einen offenen Array-Parameter
Delphi-Quellcode:
function MeineTolleFunktion(Parameter: array of TMeinObjektVorfahr): Boolean;

Geht leider nicht
Zitat:

Zitat von himitsu (Beitrag 1183941)
Falls das ncht geht, dann wäre es "sicherer", wenn du 3 überladene Prozeduren erstellt, also je Typ eine Version.
Bei deiner Variante, könntest du die Arrays in ein
Delphi-Quellcode:
array of TObject
casten, aber wenn jemand was Anderes übergibt, dann knallt es ganz schnell mal.

Leider sind das nicht nur 3 Arrays, sondern beliebig viele (über XSLT generiert), darum habe ich eine allgemeine Lösung gesucht.

Nochmals vielen Dank für eure Antworten :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:52 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