首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Oxygene中设置动态数组大小(SetLength不起作用)

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

Stack Overflow用户
提问于 2009-11-09 23:49:28
回答 3查看 2.4K关注 0票数 1

使用Oxygene的SetLength的等价物是什么?我正在尝试调整整数数组的大小。

代码语言:javascript
复制
var listIndexes: array of integer;
begin
     setLength(listIndexes,5);  // doesn't work
end;
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-10 00:08:57

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

在delphi prism中,你可以尝试这样做

代码语言:javascript
复制
type
IntegerArray = array of integer;

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

代码语言:javascript
复制
 var listIndexes: Array of Integer;
 listIndexes:=New Integer[5];

更新

此外,您还可以编写自己的SetLength

代码语言:javascript
复制
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;
票数 2
EN

Stack Overflow用户

发布于 2009-11-10 01:22:33

编辑更新您可以使用似乎只适用于.NET Framework3.5应用程序的Array.Resize方法。等效的C#代码如下所示:

代码语言:javascript
复制
    // 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框架的早期版本,或者需要频繁地调整列表的大小,那么我建议您使用.NET ArrayList或.NET中的其他System.Collections,这可能会使您的代码变得相当简单,并允许您使用框架的新功能,如Linq。

票数 1
EN

Stack Overflow用户

发布于 2019-06-15 22:34:29

这只是一个快速更新

RemObjects添加了一个很酷的新VCL框架,可以在.net及其新的本机目标上使用。这也会影响字符串。

.net或VCL之外的字符串是不可变的。这就是为什么它们只能缩小(String.Substring),这就是你在问题中所经历的。

然而,创建自己的"setlength()“方法是相当容易的。它看起来并不美观,而且非常老套,但对于一个直接的解决方案,它做到了。

我使用一个查找表,这样我们就可以将字符串增加16倍。提醒(小于16)同样使用查找表。LLVM积极地优化这样的代码。它可能很丑陋,但它是有效的。希望这能有所帮助。只需按您认为合适的方式重命名:

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1701900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档