Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Objektarray als Rückgabewert einer Funktion (https://www.delphipraxis.net/124536-objektarray-als-rueckgabewert-einer-funktion.html)

MarvinM 20. Nov 2008 16:37


Objektarray als Rückgabewert einer Funktion
 
Hallo zusammen,

ich möchte in einem Projekt einen Array von Objekten von einer Funktion zurück geben lassen, wie kann ich das deklarieren?

Denn folgendes geht nicht:

Delphi-Quellcode:
function getAllEntries(): array of TStudent;
Ich habe auch schon versucht den Array als Typ zu deklarieren, leider aber auch erfolglos :-(

Ich bin mir sicher, dass die Antwort auf die Frage trivial ist, trotzdem komme ich nicht drauf ;-)

Danke schoneinmal für Eure Mühe!

nat 20. Nov 2008 17:15

Re: Objektarray als Rückgabewert einer Funktion
 
Zitat:

Zitat von MarvinM
Ich habe auch schon versucht den Array als Typ zu deklarieren, leider aber auch erfolglos :-(

warum? also so sollte es gehen:

Delphi-Quellcode:
type
  TStudentArr = array of TStudent;


function getAllEntries(): TStudentArr;

MarvinM 20. Nov 2008 20:36

Re: Objektarray als Rückgabewert einer Funktion
 
Ich glaube ich habe mich ein wenig ungünstig ausgedrückt...

Ich kann das durchaus als Typ deklarieren, das nimmt der Compiler auch so an. In der anderen Unit, in der ich die Funktion nun aufrufe deklariere wieder diesen Array, aber nur lokal in der Methode, um die Daten, die ich aus der Funktion erhalte, weiterverarbeiten zu können. Also sowas á la:

Delphi-Quellcode:
var
  Students: array of TStudents;
  i: Integer;
begin
  for i := 0 to 100 do
    Students[i] := DBAccess.getAllEntries()[i];
end;
Leider bekomme ich nur einen leeren Array herraus. Die Funktion getAllEntries() sieht folgendermaßen aus:

Delphi-Quellcode:
function TDBAccess.getAllEntries(): Students; //Students ist weiter oben als Typ deklariert
begin
  for i := 0 to 100 do
    Students[i] := TStudent.Create;

  //Ein paar SQL Queries, die den Array füllen
end;
Ich dachte zuerst, dass es nicht der richtige Weg ist, den Rückgabewert als Typ zu deklarieren, daher habe ich meine Frage wohl ein wenig missverständlich formuliert, ich hoffe, dass es jetzt klarer ist, Sorry.

BTW: Der oder Das Array?

Zwoetzen 20. Nov 2008 20:46

Re: Objektarray als Rückgabewert einer Funktion
 
Ich bin mir nicht ganz sicher, aber da es sich um ein dynamisches Array handelt, müsste man da vorher nicht die Dimension des Arrays festlegen?

Delphi-Quellcode:
function TDBAccess.getAllEntries(): Students; //Students ist weiter oben als Typ deklariert
begin
  SetLength(Students, 101); // => Students: Array[0..100] of TStudents
  for i := 0 to 100 do
    Students[i] := TStudent.Create;

  //Ein paar SQL Queries, die den Array füllen
end;
Eventuell mal die Bereichsprüfung in den optionen aktivieren, da dürfte Delphi dann rummeckern, wenn es nicht passt ;)

PS: Ich würde das Array sagen, wegen das Datenfeld (= Array). Im Zweifelsfall einfach De Array sagen xD

Edit: Was mir noch auffällt: Einmal heißt es Array of TStudents, aber weiter unten sagst du dann TStudent.Create. Copy&Paste-Fehler?

nat 20. Nov 2008 20:52

Re: Objektarray als Rückgabewert einer Funktion
 
Zitat:

Zitat von MarvinM
Delphi-Quellcode:
function TDBAccess.getAllEntries(): Students; //Students ist weiter oben als Typ deklariert
begin
  for i := 0 to 100 do
    Students[i] := TStudent.Create;

  //Ein paar SQL Queries, die den Array füllen
end;

also wenn deine funktion so aussieht, dann is das kein wunder ;)
was ist denn Students[i]? du mußt mit result arbeiten
also so, dass das in etwa so aussieht

Delphi-Quellcode:
function TDBAccess.getAllEntries(): Students; //Students ist weiter oben als Typ deklariert
begin
  setlength(result, 101);
  for i := 0 to 100 do //bzw to length(result)-1
    result[i] := TStudent.Create;

  //Ein paar SQL Queries, die den Array füllen
end;
allerdings finde ich es etwas geschickter die funktion so umzuschreiben
Delphi-Quellcode:
function TDBAccess.getAllEntries(var Output: Students): integer
begin
setlength(Output, 101);
....

result := length(Output);
end;
edit:
kein roter kasten mehr? naja... :)

MarvinM 20. Nov 2008 20:56

Re: Objektarray als Rückgabewert einer Funktion
 
Arg, natürlich muss ich result benutzen! Danke!


PS1: Danke für den Tipp, wie man die Länge von dynamischen Arrays definiert!
PS2: Das Datenfeld, die Datenreihe, aber die Array? Ich weiß ja nicht...

nat 20. Nov 2008 21:02

Re: Objektarray als Rückgabewert einer Funktion
 
ach so, zum artikel: de.wiktionary.org 8)

MarvinM 21. Nov 2008 08:51

Re: Objektarray als Rückgabewert einer Funktion
 
Gibt es denn eigentlich eine einfachere Möglichkeit, als alle Items durchzugehen und dann die Werte von dem Rückgabewert der Funktion in die Variable zu schreiben?

Also nich so wie hier, sondern einfacher?
Delphi-Quellcode:
  for i := 1 to MAXSIZEOFAARAY do
    Students[i] := DBAccess.getAllEntries()[i];
Kann man vielleicht mit einer Funktion gleich das ganze Array übernehmen?

PS: Ok, dann ist die Frage mit dem Artikel ja geklärt ;-)

nat 21. Nov 2008 13:50

Re: Objektarray als Rückgabewert einer Funktion
 
Zitat:

Zitat von nat
allerdings finde ich es etwas geschickter die funktion so umzuschreiben
Delphi-Quellcode:
function TDBAccess.getAllEntries(var Output: Students): integer
begin
setlength(Output, 101);
....

result := length(Output);
end;

deshalb habe ich das geschrieben! ;)
da haste gleich alle daten in deinem array

Delphi-Quellcode:
count := DBAccess.getAllEntries(Students);
for i:=0 to count-1 do
begin
  //irgendwas mit Students[i] machen
end;

MarvinM 22. Nov 2008 14:23

Re: Objektarray als Rückgabewert einer Funktion
 
Aber ist es dann nicht so, dass ich das Array als Parmeter der Funktion mitgebe? Ich will es ja eigentlich aus der Funktion erhalten.

Außerdem meckert der Compiler bei der Zeile:

Delphi-Quellcode:
StudentCount := DBAccess.getAllEntries(Students);
Meldung: '(' erwartet, aber ')' gefunden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:45 Uhr.
Seite 1 von 3  1 23      

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