Es ist Unsinn die Länge von Result nicht setzen zu müssen. Das ist ein dynamisches Array. Und dessen Größe muss man setzen, um den Elementen Werte zu weisen zu können. Und es gibt auch keine
Exception wenn man die Länge das Results setzt.
Und so funktioniert es:
Delphi-Quellcode:
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 =
class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TArr =
array of Int64;
TMyClass =
class(TObject)
private
public
function MyFunc(str:
string): Tarr;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function TMyClass.MyFunc(str:
string): TArr;
var
i: integer;
AsciiArray:
array of Int64;
begin
SetLength(AsciiArray, Length(str));
for i := 1
to Length(str)
do
begin
AsciiArray[i - 1] := Ord(str[i]);
end;
SetLength(Result, High(AsciiArray) + 1);
for i := Low(AsciiArray)
to High(AsciiArray)
do
Result[i] := AsciiArray[i];
end;
procedure TForm1.Button1Click(Sender: TObject);
var
MyClass: TMyClass;
arr: TArr;
i: Integer;
s:
string;
begin
MyClass := TMyClass.Create;
try
arr := MyClass.MyFunc('
test');
for i := 0
to high(arr)
do
s := s + IntToStr(arr[i]) + '
| ';
ShowMessage(s);
finally
MyClass.Free;
end;
end;
end.
Außerdem muss die Schleife nur bis Länge der Zeichenkette minus eins laufen. Und ein AnsiString fängt bei eins an, deswegen muss die Schleife von ein mit Länge Zeichenkette laufen. bei der Array Zuweisung muss man natürlich vom Index dann eins abziehen, weil es null basierend ist.
Wenn man High benutzt, muss man noch eins dazu addieren, da High den Index des letzten Elementes zurück. Bei einer Array Länge von vier und wenn das Array null basierend ist, wie bei dynamischen Arrays, dann liefert High drei. Das Array hat aber vier Elemente von null bis drei.