-1

在下面的代码中,我得到了错误注释:

function ToPos : tValidPos;
type
  tPos      = (poAboveCenter , poAboveLeft  , poAboveRight);
  tValidPos =  array [Low (tPos)..High (tPos)] of tPos;
const
  validPos : tValidPos = (poAboveRight, poAboveLeft, poAboveCenter);
var
  i, pos : tValidPos;
begin
  i := Low (validPos); // Incompatible types: 'tValidPos' and 'tPos'
  pos := validPos [i]; // Incompatible types: 'Enumeration' and 'tValidPos'
  Result := i; 
  for i := Low (validPos) to High (validPos) do
    if validPos [i] = pos then begin
      Result := validPos [i];
      Break;
    end;
end;

我不知道出了什么问题,因为

  1. i并且validPos都是类型tValidPos
  2. 同样适用于posvalidPos

如果我使用括号,pos [0] := validPos [i]我仍然会得到“不兼容的类型:'Enumeration' and 'tValidPos'”

请帮我解决这个问题。

4

2 回答 2

1

i := 低(有效位置);// 不兼容的类型:'tValidPos' 和 'tPos'

i是一个数组,但Low(validPos)返回单个序数值,而不是数组。Hense 不兼容的类型。

位置 := 有效位置 [i]; // 不兼容的类型:'Enumeration' 和 'tValidPos'

pos也是一个数组,但validPos[i]它是一个单一的序数值,而不是一个数组。Hense 不兼容的类型。

对于您尝试执行的操作,i,posResult所有都需要声明为tPos, not tValidPos

于 2013-06-18T18:55:38.160 回答
-1

终于找到了解决办法。这确实很简单。

由于不可能使用序数值来索引枚举数数组,因此实现此目的的方法是基于迭代tComboBox.ItemIndex并同时获取下一个validPosusingSucc函数。

type  tPos      = (po1, po2, po3, po4, po5, poNil);
   tValidPos =  array [Low (tPos)..High (tPos)] of tPos;
const  validPos : tValidPos = (po1, po4, poNil, poNil, poNil, poNil);
 .........
function ToPos (const aComboBox: tComboBox; validPos: tValidPos) : tPos;
var p, pos : tPos ;
    i      :  Byte;
begin
  p := Low (ValidPos); // initialize with first validPos

  for i := 0 to aComboBox.ItemIndex do begin
    pos := validPos [p]; // current validPos

    if  pos = poNil then begin // not validPos?
      pos := Low (ValidPos); // first validPos
      Break;
    end;

    if Succ (p) <= High (validPos) then // next p is in range?
      p := Succ (p) // next validPos
    else
    begin
      pos := Low (ValidPos); // first validPos
      Break;
    end;
  end;

  Result := pos; // return corresponding validPos
end;

只有一个限制:validPos元素必须按tPos.

注意:我只是预见了“索引”解决方案,这就是堆叠的原因。仔细考虑之后,真正的解决方案出现了。

于 2013-06-19T17:15:13.140 回答