![]() |
Beliebiges Array übergeben
Hallo,
ich habe folgende Arrays:
Delphi-Quellcode:
TMeinObjekt1, TMeinObjekt2 und TMeinObjekt3 erben alle von TPersistent, mehr haben sie nicht gemeinsam.
type
TMeinArray1: array of TMeinObjekt1; TMeinArray2: array of TMeinObjekt2; TMeinArray3: array of TMeinObjekt3; 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:
Mein Versuch sieht so aus:
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;
Delphi-Quellcode:
Das ganze kompilliert schon mal, nur möchte ich jetzt, wie als Kommentar angedeutet, auf das Array zugreifen...
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; Hat jemand eine Idee, wie man sowas machen könnte? Oder vielleicht einen ganz anderen Ansatz? Grüße Dominik Edit:// Delphi 7 |
AW: Beliebiges Array übergeben
Du nimmst statt Arrays eine Klasse namens TObjectList.
|
AW: Beliebiges Array übergeben
Delphi-Quellcode:
Ich würde Variante 2 nehmen, oder von TList ableiten (Variante 3):
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.
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; |
AW: Beliebiges Array übergeben
Delphi 2007 unterstützt noch keine Generics, oder?
|
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; |
AW: Beliebiges Array übergeben
Haben diese TMeinObjektX einen gemeinsamen Vorfahren? (wenn nicht, dann TObject)
Versuch mal einen offenen Array-Parameter
Delphi-Quellcode:
Falls das ncht geht, dann wäre es "sicherer", wenn du 3 überladene Prozeduren erstellt, also je Typ eine Version.
function MeineTolleFunktion(Parameter: array of TMeinObjektVorfahr): Boolean;
Bei deiner Variante, könntest du die Arrays in ein
Delphi-Quellcode:
casten, aber wenn jemand was Anderes übergibt, dann knallt es ganz schnell mal.
array of TObject
|
AW: Beliebiges Array übergeben
Danke für die vielen Antworten!
Zitat:
Zitat:
Variante 3 geht in die Richtung mit der TObjectList :stupid: Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Nochmals vielen Dank für eure Antworten :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 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