Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Idee gesucht: Mehrere Daten mit Funktion zurückgeben (https://www.delphipraxis.net/81530-idee-gesucht-mehrere-daten-mit-funktion-zurueckgeben.html)

Andreas L. 28. Nov 2006 19:46


Idee gesucht: Mehrere Daten mit Funktion zurückgeben
 
Hi,
ich habe eine Funktion geschrieben die mehrere Daten (Strings, Booleans und Integers) aus einer Datei extrahiert. Diese Daten sollen über nur diese eine Funktion dem User zur Verfügung stehen. Ich dachte da an einen Record

Delphi-Quellcode:
type
Tsomething = record
 value1: String[100];
 value2: Boolean;
 value3: Integer;
end;
den ich der Funktion dann einfach als Rückgabewert geben
Delphi-Quellcode:
function bla(......):Tsomething;
Dieser record und die Funktion sind in einer extra Unit ausgelagert. Jetzt ist meine Frage:
Kann der User der diese Unit z. B. in seiner Haupt-Unit einbindet (uses-Klausel) einfach auf den zurückgegebenen Record zugreifen obwohl Tsomething nicht in seiner Haupt-Unit deklariert ist? Und wie macht er das dann? So wie mit einen normalen, in der Unit deklarierten Record?

Schonmal Danke :mrgreen:

ciao,
Andy

mkinzler 28. Nov 2006 19:51

Re: Idee gesucht: Mehrere Daten mit Funktion zurückgeben
 
Zitat:

Kann der User der diese Unit z. B. in seiner Haupt-Unit einbindet (uses-Klausel) einfach auf den zurückgegebenen Record zugreifen obwohl Tsomething nicht in seiner Haupt-Unit deklariert ist?
Ja, du kannst ja auch auf Typen zugreifen, die du aus anderen Units importierst.
Zitat:

Und wie macht er das dann? So wie mit einen normalen, in der Unit deklarierten Record?
Ja.

himitsu 28. Nov 2006 20:00

Re: Idee gesucht: Mehrere Daten mit Funktion zurückgeben
 
Zitat:

Zitat von mkinzler
Ja, du kannst ja auch auf Typen zugreifen, die du aus anderen Units importierst.

Jo und zwar bezieht sich das auf alle Typen und Funktionen, welche im Interface-Teil definiert wurden.

Andreas L. 28. Nov 2006 20:01

Re: Idee gesucht: Mehrere Daten mit Funktion zurückgeben
 
Ahh, das wahr ja einfach,

Danke an euch :-)

RavenIV 29. Nov 2006 08:21

Re: Idee gesucht: Mehrere Daten mit Funktion zurückgeben
 
Allerdings gibt es (wie immer) auch hier einen Fallstrick:
Wenn der Record in verschiedenene Units deklariert ist, ist er nicht gleich, obwohl er gleich aufgebaut ist und gleich heisst.
Also muss man den Record in EINER Unit deklarieren und diese EINE Unit in die anderen Units einbinden. Somit ist der Record nur einmal deklariert und somit 100%-ig identisch.

Andreas L. 29. Nov 2006 14:01

Re: Idee gesucht: Mehrere Daten mit Funktion zurückgeben
 
Zitat:

Zitat von RavenIV
Allerdings gibt es (wie immer) auch hier einen Fallstrick:
Wenn der Record in verschiedenene Units deklariert ist, ist er nicht gleich, obwohl er gleich aufgebaut ist und gleich heisst.
Also muss man den Record in EINER Unit deklarieren und diese EINE Unit in die anderen Units einbinden. Somit ist der Record nur einmal deklariert und somit 100%-ig identisch.

Hab auch nur eine Unit. Also kein Problem.

Aber gibt es auch eine record-Liste? In diesen Tutorial (http://dsdt.info/tutorials/typdateien/) werden die records ja in eine Datei abgelegt. Gibt es auch eine Möglichkeit das ich per Funktion mehrere records zurückgebe?

Delphi-Quellcode:
type
Tsomething = record
value1: String[100];
value2: Boolean;
value3: Integer;
end;
...
function blubb:Tsomething;
Es sollen also mehrere records zurückgegeben werden.
Delphi-Quellcode:
function blubb:array of Tsomething;
Geht das so irgendwie? Wenn ja, wie verwende ich Arrays?

Luckie 29. Nov 2006 14:05

Re: Idee gesucht: Mehrere Daten mit Funktion zurückgeben
 
Delphi-Quellcode:
  TMyRecArray = array of TSomething;

  function Foobar: TMyRecArray;

Andreas L. 29. Nov 2006 14:06

Re: Idee gesucht: Mehrere Daten mit Funktion zurückgeben
 
Zitat:

Zitat von Luckie
Delphi-Quellcode:
  TMyRecArray = array of TSomething;

  function Foobar: TMyRecArray;

Und wie greift der User darauf zu?

Delphi-Quellcode:
edit1.text := TmyRecArry[1].value1; //1 für datensatz 2?

Luckie 29. Nov 2006 14:15

Re: Idee gesucht: Mehrere Daten mit Funktion zurückgeben
 
So:
Delphi-Quellcode:
type
  TMyRec = record
    FName: ShortString;
  end;

  TMyRecArray = array[0..1] of TMyRec;


function FillMyRecArrays: TMyRecArray;
var
  MyRecArray: TMyRecArray;
  i: Integer;
begin
  for i := 0 to length(MyRecArray) - 1 do
  begin
    MyRecArray[i].FName := IntToStr(i);
  end;
  Result := MyRecArray;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  MyRecArray: TMyRecArray;
  i: Integer;
begin
  MyRecArray := FillMyRecArrays;
  for i := 0 to length(MyRecArray) - 1 do
    ShowMessage(MyRecArray[i].FName);
end;

Andreas L. 29. Nov 2006 14:21

Re: Idee gesucht: Mehrere Daten mit Funktion zurückgeben
 
Zitat:

Zitat von Luckie
So:
Delphi-Quellcode:
type
  TMyRec = record
    FName: ShortString;
  end;

  TMyRecArray = array[0..1] of TMyRec;


function FillMyRecArrays: TMyRecArray;
var
  MyRecArray: TMyRecArray;
  i: Integer;
begin
  for i := 0 to length(MyRecArray) - 1 do
  begin
    MyRecArray[i].FName := IntToStr(i);
  end;
  Result := MyRecArray;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  MyRecArray: TMyRecArray;
  i: Integer;
begin
  MyRecArray := FillMyRecArrays;
  for i := 0 to length(MyRecArray) - 1 do
    ShowMessage(MyRecArray[i].FName);
end;

2 Fragen habe ich noch:
1. Kann TMyRecArray = array[0..1] of TMyRec; nur 2 Einträge beinhalten? Wie mache ich das er unendlich viele Einträge haben kann. Also ein dynamischer Array?
2. Wenn ich einen record definiere:
Delphi-Quellcode:
type
tsomething = record;
 blubb: String[50];
Muss ich dann immer angeben wie viel Speicher reserviert werden soll (hier für 50 Zeichen)? Oder kann ich das auch weglassen um so beliebig lange Strings zu speichern?

Thorben_K 29. Nov 2006 14:46

Re: Idee gesucht: Mehrere Daten mit Funktion zurückgeben
 
Delphi-Quellcode:

type

  TMyRec = record
    FName: ShortString;
  end;

TMyArray : Array of TMyRec;
geht so einfach, mit SetLenght kannst du das array erweitern, du sollest aber mal überlegen ob die in deinem fall nicht eine TList anbietet :)

zu deiner 2. frage, wie es bei neuen compilern ist weiss ich nichts, aber bei älteren müssen string eine zeichenangabe haben, zumindest wenn du sie auch mal speichern willst

Andreas L. 29. Nov 2006 18:16

Re: Idee gesucht: Mehrere Daten mit Funktion zurückgeben
 
Hmm... irgendwas klappt noch nicht ganz:

Delphi-Quellcode:
for Line := 0 to Cookies.Count -1 do
    begin

     if pos(Domain, Cookies.Strings[Line]) > 0 then
      begin

       SetLength(tempcookies, Length(tempcookies) + 1);
       tempcookies[Length(tempcookies)] := CreateMozCookie(Cookies.Strings[Line]);

      end;
    end;
Cookies = stringlist
tempcookies = TMozCookies
CreateMozCookie() gibt ein TMozCookie zurück
Delphi-Quellcode:
type
  TMozCookie = record
      Domain: String;
      WholeDomain: Boolean;
      Path: String;
      Secure: Boolean;
      Expires: TDate;
      Name: String;
      Value: String;
  end;

  TMozCookies = array of TMozCookie;
Also TMozCookie ist ein Cookie (als record) und TMozCookies ist ein Array mit mehreren TMozCookie.

Ich versuche also mit

Delphi-Quellcode:
tempcookies[Length(tempcookies)] := CreateMozCookie(Cookies.Strings[Line]);
mehrere TMozCookie in das Array zu schreiben.

Ich habe die Anwendung schon mit F7 durch gemacht. Direkt wenn die Funktion CreateMozCookie durch ist kommt eine AV. Der Cursor im Editor bleibt auf dem letzten end; stehen. Ich denke es hat was mit der Zuweisung des MozCookie an das Array zu tun. Ich weiß leider nicht weiter. Hat da jemand Ahnung?

shmia 29. Nov 2006 18:21

Re: Idee gesucht: Mehrere Daten mit Funktion zurückgeben
 
Falsch:
Delphi-Quellcode:
   SetLength(tempcookies, Length(tempcookies) + 1);
   // nach SetLength ändert sich ja auch das Ergebnis von Length(tempcookies)
   tempcookies[Length(tempcookies)] := CreateMozCookie(Cookies.Strings[Line]);
Richtig:
Delphi-Quellcode:
   len := Length(tempcookies)
   SetLength(tempcookies, len + 1);
   tempcookies[len] := CreateMozCookie(Cookies.Strings[Line]);

Der_Unwissende 29. Nov 2006 18:38

Re: Idee gesucht: Mehrere Daten mit Funktion zurückgeben
 
Zitat:

Zitat von shmia
Falsch:
Delphi-Quellcode:
   SetLength(tempcookies, Length(tempcookies) + 1);
   // nach SetLength ändert sich ja auch das Ergebnis von Length(tempcookies)
   tempcookies[Length(tempcookies)] := CreateMozCookie(Cookies.Strings[Line]);
Richtig:
Delphi-Quellcode:
   len := Length(tempcookies)
   SetLength(tempcookies, len + 1);
   tempcookies[len] := CreateMozCookie(Cookies.Strings[Line]);

Hi,
das len sollte durch Compileroptimierung eher überflüssig sein (behaupte ich einfach mal).
An sich gilt für dyn. Arrays immer, dass die null indexiert sind, also der erste Wert an der Stelle 0 steht und der letzte an der Stelle length(Array) - 1. Du kannst aber auch einfach low und high verwenden.
Arrays um ein Element zu vergrößern ist immer gaaanz schlecht. Ist zwar durchaus möglich, aber dabei wird der Speicher für das neue Array reserviert, das alte Array dort rein kopiert und dann das alte Array frei gegeben. Das ganze sind die Kosten für ein weiteres Element. Kommt ein zweites hinzu, musst du wieder diese Schritte vornehmen.
Besser ist es da, wenn du das Array gleich um mehr als ein Element vergrößerst. Der Zeitbedarf für das allozieren von Speicher und dem kopieren eines Arrays ist für eine große Anzahl von Elementen nahezu gleich dem Zeitaufwand für ein Element. Allozierst du aber gleich den Speicher für 100 Elemente, so sind die Kosten pro neuem Element nur noch bei einem 100stel der Kosten für nur ein Element. Hundert ist dabei keineswegs die optimale zahl.
In einem der (noch recht aktuellen) Threads wurde von alzaimar (u.A.!) gesagt, dass die Verdopplung der größe ein recht guter Wert ist. Du musst dir dann halt nur in einer weiteren Variable den Index des tatsächlich letzten verwendeten Elements merken.
Alternativ kannst du auch eine TList einsetzen, die macht intern fast das gleiche (nur eben nicht verdoppeln). Eine TList wächst dabei dyn., verwendet zwar auch ein Array, aber das bleibt für dich transparent.

Gruß Der Unwissende

Andreas L. 29. Nov 2006 19:49

Re: Idee gesucht: Mehrere Daten mit Funktion zurückgeben
 
Jetzt klappt alles.

Vielen Dank euch allen :-)


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