![]() |
Re: Objektarray als Rückgabewert einer Funktion
du übergibst es der variable als output-parameter. so kann die funktion alle daten in die variable
die übergeben wurde schreiben und der rückgabewert is dann noch frei für z.B. einen fehlercode. zu deinem fehler kann ich so schlecht was sagen. poste mal alle deine typen-deklarationen und dort wo die funktion aufgerufen wird. so wie ich's geschrieben habe muß es eigentlich gehen! |
Re: Objektarray als Rückgabewert einer Funktion
Ein TObjectList Objekt wäre hier wesentlich besser geeignet als ein array of TStudents.
Dafür gibt es mehrere Gründe: 1.) wenn das TObjectList Objekt freigeben wird, werden auch alle enthaltenen Objekte freigegeben man spart also arbeit und schützt sich vor Speicherlecks 2.) bei TObjectList kann man ganz einfach und stressfrei weitere Objekte einfügen oder löschen bei einem dynamischen Array ist das jedesmal mit grösserem Aufwand verbunden
Delphi-Quellcode:
Das Löschen eines Objekts in einem dyn. Array ist noch viel komplizierter; bei TObjectList ist es nur ein Einzeiler.
// mit TObjectList
mylist.Add(TStudent.Create); // eine Zeile, klarer Code // mit dynamischem array SetLength(dynarray, Length(dynarray)+1); dynarray[Length(dynarray)] := TStudent.Create; // immer aufpassen, damit man mit dem Index nicht um eins daneben liegt 3.) man kann (und sollte auch) eine Klasse von TObjectList ableiten und dort Methoden implementieren, die sich auf alle Objekte in der Liste beziehen:
Delphi-Quellcode:
Vor einem dynamischen Array kann man nicht ableiten.
TStudentList=Class(TObjectList)
public function GetBesteNote:double; function GetDurchschnittsNote:double; function BerechneFrauenQuote:double; // zwischen 0.0 bis 1.0 ... end; Man wird also auch keine objektorientierte Software erhalten. OOP hat ja seine Überlegenheit gegenüber "normaler" strukturierter Programmierung schon oft genug bewiesen. |
Re: Objektarray als Rückgabewert einer Funktion
Ok:
Deklaration in der Unit, wo ich die Funktion aufrufe:
Delphi-Quellcode:
Aufruf der Methode:
type
Students = array of TStudent;
Delphi-Quellcode:
Die Deklaration der Methode:
procedure TTableView.getClick(Sender: TObject);
var StudentCount: Integer; begin StudentCount := DBAccess.getAllEntries(Students); //Compilerfehler kommt hier [...] end;
Delphi-Quellcode:
Die Methode:
function getAllEntries(var Output: Students): Integer;
Delphi-Quellcode:
Deklaration des Arrays in der Unit, die den Datenbankzugriff durchführt:
function TDBAccess.getAllEntries(Output: Students): Integer;
var StudentCount: Integer; begin //StudentCount wird vorher ermittelt [...] //vorbereiten setLength(Output, StudentCount+1); for i := 1 to StudentCount do begin //SQL Qeuries die das Array füllen //z.B. Output[i].Name := SQLQuery.FieldbyName('Name').AsString; [...] end; result := length(Output); end;
Delphi-Quellcode:
Wenn Du nochirgendetwas brauchst, sag Bescheid.
type
Students = array of TStudent; PS: Welche Unit muss ich importieren, damit ich auf eine TObjectList verwenden kann? |
Re: Objektarray als Rückgabewert einer Funktion
TObjectList steht in Contnrs. Und hier
Zitat:
|
Re: Objektarray als Rückgabewert einer Funktion
Zitat:
Delphi-Quellcode:
müsste es heißen ;)
dynarray[Length(dynarray)[b]-1[/b]]
aber zu deinem post: es geht hier ja nich darum was angebrachter ist. er hat sich ja schon für einen array entschieden. davon mal abgesehen, dass ich es zum lernen (also am anfang) nich schlecht finde mit arrays zu arbeiten um das feeling dafür zu kriegen. natürlich hast du recht, dass die von dir angesprochene TObjectList eigentlich geschickter ist. edit: oh ja stimmt, Students war ja n typ... das hätte ich auch sehen können ;) aber gar nich drauf geachtet, weil kein T davor stand. |
Re: Objektarray als Rückgabewert einer Funktion
Ist die ObjectList denn soviel geschickter, dass es sich lohnt die Struktur des Programms grundlegend zu ändern?
|
Re: Objektarray als Rückgabewert einer Funktion
Zitat:
Es ist nicht "verboten", mit dynamischen Arrays zu arbeiten. Aber dann sollte man das Array in einer Klasse so verpacken, dass man im Prinzip nichts mehr falsch machen kann. TObjectList verwendet intern übrigens auch ein dynamisches Array, aber dieses Array ist geschützt vor direktem Zugriff von aussen. Ich würde vorschlagen du probierst beide Varianten (dyn. Array und TObjectList) aus. Ich schätze danach wirst du mit mir einig sein, dass TObjectList elegenter und einfacher ist. |
Re: Objektarray als Rückgabewert einer Funktion
Hallo,
Zitat:
Gruß Hawkeye |
Re: Objektarray als Rückgabewert einer Funktion
Ich habe jetzt angefangen ObjectLists hinzuzufügen und muss sagen, dass es bis jetzt wirklich einfacher ist! Allerdings habe ich immernoch ein kleines Problem: Gibt es irgendeinen Trick, wie man die Objekte in die Liste bekommt?
Bis jetzt geh ich so vor, allerdings bleibt die Liste nach dem Add-Befehl leer: Die Deklaration der Liste:
Delphi-Quellcode:
und hinzufügen mit:
unit uProductList;
interface uses Contnrs, uProduct; type TProductList = class(TObjectList) private { Private-Deklarationen } public end; var ProductList: TProductList; implementation uses uDBAccess; end.
Delphi-Quellcode:
Danke für Eure Gedult!
function TDBAccess.getPossibleProducts(): TProductList;
begin result := TProductList.Create; [...] //In Result schreiben aProduct := TProduct.Create(aName, aSize, aColor, aPrice); result.Add(aProduct); end; end; PS: Und ja, das hier ist jetzt eine Liste mit Produkten und vorher hatte ich eine Liste mit Schülern; Und ich hab noch mehr von solchen Späßen ... ;-) |
Re: Objektarray als Rückgabewert einer Funktion
Wie sieht denn die Abfrage dieser Liste aus? Allerdings bin ich wie meine Vorredner der Meinung, dass Objekte als Funktionsrückgabewerte eher suboptimal sind.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:30 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