2010-02-03 77 views
4

我有一个数组声明:有没有简单的方法来克隆字符串数组?

const A: array[0..3] of ShortString = (
    'Customer', 
    'Supplier', 
    'Stock', 
    'GL' 
); 

var B: array of ShortString; 

我想字符串数组克隆到另一个阵列B.使用移动或复制功能不起作用。有没有一种快速简便的方法来克隆数组而不使用for循环?

回答

11

您面临的问题是您的常量A和您的变量B实际上是不同的类型。

type 
    TSA = array[0..3] of ShortString; 

const 
    A: TSA = (
    'Customer', 
    'Supplier', 
    'Stock', 
    'GL'); 

var B: TSA; 

有了这些声明,那么你可以简单的写:这可以通过向您展示如何声明的方式相当于一个const和相同类型的变种向您展示在你的问题是什么最容易被证明

B := A; 

但当是一个尺寸的阵列和是一个动态数组,这是不可能的,只能选择到SetLength(B)根据需要并复制元件一个接-一。

虽然常量VAR类型可能看起来像它们是相同的 - 或兼容类型 - 它们都没有了,这便是没有从试图分配整数不变的字符串不同变量...即使知道实现它所需的简单转换,编译器不能推测你打算这样做,所以你必须明确并自己提供转换代码。

2

喜欢的东西:

SetLength(B, Length(A)); 
for i := Low(A) to High(A) do 
    B[i] := A[i]; 

或者在一个更通用的方法:

type 
    TStringArray = array of ShortString; 

procedure CloneArray(const source: array of ShortString; var dest: TStringArray); 
var 
    i: integer; 
begin 
    SetLength(dest, Length(source)); 
    for i := Low(source) to High(source) do 
    dest[i] := source[i]; 
end; 

在你将不得不重新声明B中B中的一种情况:TStringArray。

+0

谢谢。但是我想知道如果没有使用for循环的话。 – 2010-02-03 06:58:28

+0

我不认为没有循环就可以完成。你为什么不做循环呢? – 2010-02-03 07:03:57

+0

在上例中,您可以使用Move(Source,Dest [0],Length(Source)* SizeOf(ShortString))来代替for循环 – kludg 2010-02-03 09:05:00

相关问题