2016-09-19 4 views
3

Ich gehe davon aus, dass meine Frage in der SO-Wissensdatenbank bereits existiert und ich sie einfach nicht finden konnte. Bitte führen Sie mich in diesem Fall zum Ursprung und stimmen Sie ab, diesen als Duplikat zu schließen. Es geht darum, Array-Parameter an eine Prozedur zu übergeben.Wie übergeben Sie Array-Werte als Prozedurparameter?

Die unten Fall ist einfach, intuitiv und Arbeiten:

procedure MyProc(const A: array of ShortString); 
begin 
// 
end 

Jetzt kann ich MyProc anrufen und direkt Strings es passieren:

MyProc(['no', 'trump', 'please']); 

Was nun, wenn ich erklären, eine Art von Array von Kurzzeichenfolge?

type 
    TMyArray = array of ShortString; 

procedure MyProc(const A: TMyArray); 
begin 
// 
end 

Gibt es eine Möglichkeit MyProc Gabe von Parametern von Array-Typ direkt ausführen? I.e. Verwenden Sie den gleichen Prozeduraufruf wie oben.

+ Bonus-Frage:

type TMyRecord = record 
    param, value: ShortString 
end; 

procedure MyProc(const R: TMyRecord); 
begin 
// 
end 

Gibt es eine Technik, die eine Prozedur aufzurufen und Werte eines Typs Datensatz übergeben? So etwas wie (Pseudo-Code):

MyProc((TMyRecord.param='aaa', TMyRecord.value='bbb')); 

Der Grund, warum ich frage: Ich möchte nicht, eine Variable deklarieren und es einrichten. Stattdessen möchte ich Array/Record-Werte direkt als Prozedurparameter übergeben.

+0

Es gibt einen Unterschied zwischen offenen Array-Parametern und dynamischen Arrays, obwohl ihre Synatx ziemlich ähnlich ist. Mehr dazu in meinem Artikel dazu (http://rvelthuis.de/articles/articles-openarr.html). Datensätze können nur auf diese Weise übergeben werden, wenn Sie eine Funktion delacare, die sie erstellt –

+0

Wenn Sie jemals debuggen müssen Sie wünschen, dass Sie eine Variable deklariert und eingerichtet ... – GuidoG

+1

Eine Frage auch eine Zeit bitte. Und warum benutzt du kurze Saiten? –

Antwort

3

Ja, was Sie geschrieben haben, funktioniert in Delphi XE7 und höher.

program Project1; 

{$APPTYPE CONSOLE} 

type 
    TMyArray = array of ShortString; 

procedure MyProc(const A: TMyArray); 
var 
    s : ShortString; 
begin 
    for s in A do WriteLn(s); 
end; 

begin 
    MyProc(['no', 'trump', 'please']); 
    ReadLn; 
end. 

Output:

kein
Trumpf
bitte

XE7 neue dynamische Feldinitialisierung Syntax eingeführt, die über Funktionsaufrufe wie die ermöglicht. Vor diesen müssen Sie mit einem expliziten Konstruktor initialisiert werden wie:

MyProc(TMyArray.Create('no', 'trump', 'please')); 

Für die Aufzeichnung benötigen Sie einen Konstruktor oder eine andere Methode, um den Datensatztyp zurückzukehren. Dies funktioniert:

program Project1; 

{$APPTYPE CONSOLE} 

type 
    TMyRecord = record 
    param: ShortString; 
    value: ShortString; 
    constructor Create(AParam, AValue : ShortString); 
    end; 

constructor TMyRecord.Create(AParam: ShortString; AValue: ShortString); 
begin 
    param := AParam; 
    value := AValue; 
end; 

procedure MyProc(const R: TMyRecord); 
begin 
    WriteLn(R.param); 
    WriteLn(R.value); 
end; 

begin 
    MyProc(TMyRecord.Create('foo', 'bar')); 
    ReadLn; 
end. 

Ausgang:

foo
bar

+0

Haben Sie versucht, es zu kompilieren? – smooty86

+0

@ smoyy86 ja, natürlich. –

+0

Wirklich? Ich weiß nicht, wie es im neuesten Delphi funktioniert, das ältere wird es nicht nehmen ... Es ist möglich, dynamisches Array als einen offenen Array-Parameter zu übergeben, nicht anders herum. – smooty86

2

Wie bereits gesagt, kann es in Delphi XE7 und später durchgeführt werden. In früheren Versionen konnten Array-Typen nicht direkt als Parameter übergeben werden.

Wenn Sie nicht auf diesen "Komfort" verzichten können ..Als „hässlich“ Lösung, könnten Sie eine Zwischenfunktion, welche Kopien ein dynamisches Array in seine entsprechenden Array-Typ:

function AsTypeArray(const MyArray : array of ShortString) : TMyArray; 
begin 
    SetLength(Result, Length(MyArray)); 
    Move(MyArray[Low(MyArray)], Result[0], Length(MyArray) * SizeOf(MyArray[Low(MyArray)])); 
end; 

So könnte man schreiben:

MyProc(AsTypeArray(['no', 'trump', 'please'])); 

ich diese Lösung nicht gefällt , aber wenn Sie kein Upgrade auf Delphi XE7 oder höher durchführen können und Sie die Array-Typ-Parameter unbedingt direkt übergeben möchten, ist dies meines Erachtens der einzige Weg.

Beachten Sie, dass TMyArray Objekte als Parameter an Funktionen definieren für die Annahme von dynamischen Arrays passieren können:

procedure MyProc(const A: array of ShortString); 
//... 

var 
    Arr : TMyArray; 
begin 
    //... 
    MyProc(Arr); //It won't raise any error/warning 
end; 

Auch für Aufzeichnungen, eine Zwischenfunktion, die der Datensatztyp zurückgibt benötigt.

function MyRecord(Param : ShortString; Value : ShortString) : TMyRecord; 
begin 
    Result.Param := Param; 
    Result.Value := Value; 
end; 

Dann können Sie Ihren Datensatz übergeben, ohne eine Variable zu deklarieren.

MyProc(MyRecord('aaa', 'bbb')); 

Auch in den letzten Delphi-Versionen denke ich, dass es keinen anderen Weg gibt.

Verwandte Themen