Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi array of String als Result einer Funktion (https://www.delphipraxis.net/9598-array-string-als-result-einer-funktion.html)

Brakeman 29. Sep 2003 20:54


array of String als Result einer Funktion
 
Hallo,
ich habe vor, dass mir eine Funktion als Result ein array of String zurück liefert. Wenn ich folgendes schreibe:

Delphi-Quellcode:
function fillArray(array_name,Source, Ext:String): array of String;
begin
...
end;
bekomme ich die Compilermeldung:

Bezeichner erwartet, aber 'ARRAY' gefunden.

Hat jemand einen Rat, wie ich es dennoch hinbekomme?

Chewie 29. Sep 2003 20:59

Re: array of String als Result einer Funktion
 
Einen Typ definieren:
Delphi-Quellcode:
type TStringArray = Array of String;

function fillArray(array_name,Source, Ext:String): TStringArray;
begin
...
end;

Brakeman 29. Sep 2003 21:05

Re: array of String als Result einer Funktion
 
Super, so funktionierts!

Danke!!!

sakura 30. Sep 2003 08:37

Re: array of String als Result einer Funktion
 
Hintergrund: Der Grund dafür liegt in der Typenbehandlung von Pascal/Delphi. Dabei ist array of String eine Typenkombination, allerdings kein bestimmter Typ. Deswegen hast Du, vor der Einführung eines "neuen Datentypes" eine Typenfehlermeldung erhalten. (Stichwort: Strikte Typenbezeichnung)

...:cat:...

combocracker 13. Dez 2003 14:13

Re: array of String als Result einer Funktion
 
Hallo,

ich habe auch mal eine Frage zu diesem Thema. Ich hatte anfangs das gleiche Problem wie oben. Mein Problem ist jetzt aber, dass die Funktion, die mir das Result zurückgeben soll, in einer anderen Unit liegt als die Prozedur, die das Array empfangen soll und, dass die Prozedur irgendwie nicht die Daten empfängt.

Die Unit, in der die Funktion liegt, heißt bei mir DBQuery.
Die Unit, die empfangen soll, heißt Adressbuch.

Habe Code in DBQuery folgendermaßen:


Code:

type
   TArray = array of array of string;

[...]


function TDBQuery.Query(SQLQuery: PChar): TArray;
//Zum Testen gibt sie nur ein Multidim. Array zurück.

var

Data: TArray;

begin

SetLength(Data, 1, 3);

Data[0, 0] := 'test';
Data[0, 1] := 'test';
Data[0, 2] := 'test';

result := Data

end;
In Adressbuch steht folgender Code:
Code:

type
TArray2 = DBQuery.TArray;

[...]


procedure TFrmAdressbuch.EintraegeAnzeigen;

var

EArray: TArray2;

begin

SetLength(EArray, 1, 3); // Ist dieser Schritt nötig?
EArray := Query.Query;

ShowMessage(EArray[0, 0]); // Ist Leer!! :-(


end;

So mein Problem ist also, dass EArray leer ist und darin keine Daten sind. Könnt ihr mir bitte helfen und mir sagen, wo der Fehler ist??

Vielen Dank im Voraus, Moritz.

nailor 13. Dez 2003 15:05

Re: array of String als Result einer Funktion
 
wenn du zweimal in zwei verschiedenen units ein und denselben typen deklarierst, geht das trotzdem nicht. du musst den typen in einer (evtl. eigenen) unit deklarieren, und dann mit uses das so basteln, dass alle anderen units drauf zugreifen können!

combocracker 13. Dez 2003 17:08

Re: array of String als Result einer Funktion
 
:wiejetzt: Bin mir nicht sicher, ob ich dich richtig verstehe.

Aber meinst du, dass ich in der Prozedur EintraegeAnzeigen folgendes mache?

Code:
var

EArray: DBQuery.TArray;
Jetzt greift der ja direkt auf den Typen in der Unit DBQuery zu. In der Unit Adressbuch ist die Unit DBQuery natürlich über uses eingebunden.

Leider funzt es so aber auch nicht. EArray ist immer noch leer. :cry:

Und was ist mit "SetLength(EArray, 1, 3); // Ist dieser Schritt nötig?"? Muss ich das machen, oder setzt Delphi die Größe von EArray automatisch fest, wenn ich das Array (wenn es denn dann mal funktioniert) über die Funktion als Result bekomme.

Gruß, Moritz.

Der_Unwissende 13. Dez 2003 18:19

Re: array of String als Result einer Funktion
 
Setlength musst du nicht explizit aufrufen.
Also deine Codeschnipsel sind entweder etwas unvollständig, oder der Fehler steckt in der Klasse Query. Also ich weiß nicht, warum du Query.Query zuweist.
Die SetLength kannst du weglassen, da nur ein Zeiger auf das erste Element des Arrays übergeben wird. Hierin könnte ein weiteres Problem liegen. Die Variable Data ist nur lokal. Es kann also gut sein, dass du den Speicherbereich des Arrays erstmal in aller Ruhe freigibst und anders verwendest. Ich gehe mal davon aus, dass die Klasse Query die Funktion aufruft und das Ergebnis von TDBQuery.Query in ihrer Variablen Query speichert. Wie gesagt, genau genommen wird nur ein Zeiger gespeichert und es ist egal was in dem entsprechendem Speicherbereich steht.
Du musst Data einfach nur etwas globaler definieren und dafür sorgen, dass dieses Array garantiert erst freigegeben wird, wenn du mit der Auswertung fertig bist.


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