繁体   English   中英

如何在Oxygene中设置动态数组大小(SetLength不起作用)

[英]How set dynamic array size in Oxygene (SetLength doesn't work)

使用Oxygene的SetLength等效于什么? 我正在尝试确定整数数组的大小。

var listIndexes: array of integer;
begin
     setLength(listIndexes,5);  // doesn't work
end;

Bill, Delphi-Prism中不存在Setlength函数(可以使用ShineOn的命名空间ShineOn.Rtl,但其中有Setlength函数的部分实现)。

在delphi棱镜中,您可以尝试一下

type
IntegerArray = array of integer;

var listIndexes: IntegerArray;
listIndexes:=New IntegerArray(5);

要么

 var listIndexes: Array of Integer;
 listIndexes:=New Integer[5];

UPDATE

另外,您可以编写自己的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;

您可以使用Array.Resize方法,该方法似乎仅适用于.NET Framework 3.5应用程序。 等效的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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM