AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Objektarray als Rückgabewert einer Funktion
Thema durchsuchen
Ansicht
Themen-Optionen

Objektarray als Rückgabewert einer Funktion

Ein Thema von MarvinM · begonnen am 20. Nov 2008 · letzter Beitrag vom 23. Nov 2008
Antwort Antwort
Seite 2 von 3     12 3      
nat

Registriert seit: 10. Nov 2005
216 Beiträge
 
RAD-Studio 2009 Pro
 
#11

Re: Objektarray als Rückgabewert einer Funktion

  Alt 22. Nov 2008, 14:51
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!
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#12

Re: Objektarray als Rückgabewert einer Funktion

  Alt 22. Nov 2008, 14:58
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:
// 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
Das Löschen eines Objekts in einem dyn. Array ist noch viel komplizierter; bei TObjectList ist es nur ein Einzeiler.
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:
TStudentList=Class(TObjectList)
public
   function GetBesteNote:double;
   function GetDurchschnittsNote:double;
   function BerechneFrauenQuote:double; // zwischen 0.0 bis 1.0
...
end;
Vor einem dynamischen Array kann man nicht ableiten.
Man wird also auch keine objektorientierte Software erhalten.
OOP hat ja seine Überlegenheit gegenüber "normaler" strukturierter Programmierung schon oft genug bewiesen.
  Mit Zitat antworten Zitat
Benutzerbild von MarvinM
MarvinM

Registriert seit: 24. Jul 2006
94 Beiträge
 
#13

Re: Objektarray als Rückgabewert einer Funktion

  Alt 22. Nov 2008, 15:14
Ok:

Deklaration in der Unit, wo ich die Funktion aufrufe:

Delphi-Quellcode:
type
  Students = array of TStudent;
Aufruf der Methode:
Delphi-Quellcode:
procedure TTableView.getClick(Sender: TObject);
var
  StudentCount: Integer;
begin
  StudentCount := DBAccess.getAllEntries(Students); //Compilerfehler kommt hier

[...]
end;
Die Deklaration der Methode:
function getAllEntries(var Output: Students): Integer; Die Methode:
Delphi-Quellcode:
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;
Deklaration des Arrays in der Unit, die den Datenbankzugriff durchführt:
Delphi-Quellcode:
type
  Students = array of TStudent;
Wenn Du nochirgendetwas brauchst, sag Bescheid.

PS: Welche Unit muss ich importieren, damit ich auf eine TObjectList verwenden kann?
Mfg Marvin

Carpe Diem! - Genieße den Tag! - [gr. Horaz]
> Meine Homepage - http://www.prettyprograms.de <
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.544 Beiträge
 
Delphi 11 Alexandria
 
#14

Re: Objektarray als Rückgabewert einer Funktion

  Alt 22. Nov 2008, 15:18
TObjectList steht in Contnrs. Und hier
Zitat:
StudentCount := DBAccess.getAllEntries(Students);
wird eine Typdeklaration als Parameter übergeben statt einer Variablen des Typs.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
nat

Registriert seit: 10. Nov 2005
216 Beiträge
 
RAD-Studio 2009 Pro
 
#15

Re: Objektarray als Rückgabewert einer Funktion

  Alt 22. Nov 2008, 15:19
Zitat von sx2008:
Delphi-Quellcode:
SetLength(dynarray, Length(dynarray)+1);
dynarray[Length(dynarray)] := TStudent.Create; // immer aufpassen, damit man mit dem Index nicht um eins daneben liegt
hehe, und da is es dir auch gleich passiert!
dynarray[Length(dynarray)[b]-1[/b]] müsste es heißen

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.
  Mit Zitat antworten Zitat
Benutzerbild von MarvinM
MarvinM

Registriert seit: 24. Jul 2006
94 Beiträge
 
#16

Re: Objektarray als Rückgabewert einer Funktion

  Alt 22. Nov 2008, 15:23
Ist die ObjectList denn soviel geschickter, dass es sich lohnt die Struktur des Programms grundlegend zu ändern?
Mfg Marvin

Carpe Diem! - Genieße den Tag! - [gr. Horaz]
> Meine Homepage - http://www.prettyprograms.de <
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#17

Re: Objektarray als Rückgabewert einer Funktion

  Alt 22. Nov 2008, 15:48
Zitat von MarvinM:
Ist die ObjectList denn soviel geschickter, dass es sich lohnt die Struktur des Programms grundlegend zu ändern?
Na sicher.
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.
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#18

Re: Objektarray als Rückgabewert einer Funktion

  Alt 22. Nov 2008, 15:53
Hallo,

Zitat von sx2008:
Aber dann sollte man das Array in einer Klasse so verpacken, dass man im Prinzip nichts mehr falsch machen kann.
Ich würde das übrigens mit der Objektliste ebenso handhaben, um die Typsicherheit zu gewährleisten (Komposition statt Vererbung).

Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von MarvinM
MarvinM

Registriert seit: 24. Jul 2006
94 Beiträge
 
#19

Re: Objektarray als Rückgabewert einer Funktion

  Alt 22. Nov 2008, 17:49
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:
unit uProductList;

interface

uses
  Contnrs, uProduct;

type
  TProductList = class(TObjectList)
  private
    { Private-Deklarationen }
  public
    
  end;

var
  ProductList: TProductList;

implementation

uses
  uDBAccess;

end.
und hinzufügen mit:

Delphi-Quellcode:
function TDBAccess.getPossibleProducts(): TProductList;
begin
  result := TProductList.Create;
   [...]
    //In Result schreiben
    aProduct := TProduct.Create(aName, aSize, aColor, aPrice);
    result.Add(aProduct);
  end;
end;
Danke für Eure Gedult!

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 ...
Mfg Marvin

Carpe Diem! - Genieße den Tag! - [gr. Horaz]
> Meine Homepage - http://www.prettyprograms.de <
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.544 Beiträge
 
Delphi 11 Alexandria
 
#20

Re: Objektarray als Rückgabewert einer Funktion

  Alt 22. Nov 2008, 17:52
Wie sieht denn die Abfrage dieser Liste aus? Allerdings bin ich wie meine Vorredner der Meinung, dass Objekte als Funktionsrückgabewerte eher suboptimal sind.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 00:57 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