使用 Oxygene 的 SetLength 等价物是多少?我正在尝试调整整数数组的大小。
var listIndexes: array of integer;
begin
setLength(listIndexes,5); // doesn't work
end;
比尔, Delphi-Prism中不存在 Setlength 函数(您可以使用ShineOn的命名空间 ShineOn.Rtl, 它具有 Setlength 函数的部分实现)。
在德尔福棱镜你可以试试这个
type
IntegerArray = array of integer;
var listIndexes: IntegerArray;
listIndexes:=New IntegerArray(5);
或者
var listIndexes: Array of Integer;
listIndexes:=New Integer[5];
更新
此外,您可以编写自己的 SetLength
method SetLength(var myArray: Array of Integer; NewSize: Integer);
var
ActualLength: Integer;
begin
var DummyArray: &Array := &Array.CreateInstance(typeOf(Integer), NewSize);
if assigned(myArray) then
begin
ActualLength:= iif(myArray.Length > NewSize, NewSize, myArray.Length);
&Array.Copy(myArray, DummyArray, ActualLength);
end;
myArray := array of integer(DummyArray);
end;
[编辑更新] 您可以使用似乎仅适用于 .NET Framework 3.5 应用程序的Array.Resize方法。等效的 C# 代码如下所示:
// Create and initialize a new string array.
String[] myArr = {"The", "quick", "brown", "fox", "jumps",
"over", "the", "lazy", "dog"};
// Display the values of the array.
Console.WriteLine(
"The string array initially contains the following values:");
PrintIndexAndValues(myArr);
// Resize the array to a bigger size (five elements larger).
Array.Resize(ref myArr, myArr.Length + 5);
但是,如果您的目标是早期版本的 .NET Framework 或需要非常频繁地调整列表的大小,那么我建议您使用 .NET ArrayList或 .NET 中的其他System.Collections,这可能会使您的代码相当简单并允许您使用框架的新功能,例如 Linq。
这只是一个快速更新
RemObjects 添加了一个很酷的新 VCL 框架,可以在 .net 及其新的原生目标之上使用。这也会影响字符串。
.net 或 VCL 之外的字符串是不可变的。这就是为什么只能缩小它们的大小(String.Substring),这就是您在问题中遇到的情况。
但是,制作自己的“setlength()”方法相当容易。看起来并不漂亮而且非常老派,但对于一个直接的解决方案,它可以完成工作。
我使用查找表,以便我们将字符串增长 16 倍。提醒(小于 16)同样使用查找表。LLVM 会积极优化这样的代码。它可能很丑陋,但它确实有效。希望这可以帮助。只需按照您认为合适的方式重命名:
var str_growth_LUT: array[1..16] of String
= [' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' '];
class procedure QTXString.SetLength(var Text: String; NewLength: Integer);
begin
var lCurrent := length(Text);
if NewLength < lCurrent then
Text := Text.Substring(1, NewLength)
else
if NewLength > lCurrent then
begin
var diff := NewLength - lCurrent;
var temp: String;
// Calculate parts of 16
var major := diff mod 16;
var minor := diff - (major * 16);
// grow by chunks of 16
while major > 0 do
begin
temp := temp + str_growth_LUT[16];
dec(major);
end;
// Add reminder (less than 16)
if minor > 0 then
temp := temp + str_growth_LUT[minor];
Text := temp;
end;
end;