不兼容的类型:'tValidPos'和'tPos'

时间:2013-06-18 15:39:47

标签: delphi casting delphi-2010

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

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. ivalidPos都属于tValidPos
  2. 类型
  3. 同样适用于posvalidPos
  4. 如果我使用像pos [0] := validPos [i]这样的括号,我仍然会得到“不兼容的类型:'枚举'和'tValidPos'”

    请帮我解决这个问题。

2 个答案:

答案 0 :(得分:1)

  

i:=低(validPos); //不兼容的类型:'tValidPos'和'tPos'

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

  

pos:= validPos [i]; //不兼容的类型:'枚举'和'tValidPos'

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

对于您尝试执行的操作,iposResult都需要声明为tPos,而不是tValidPos

答案 1 :(得分:-1)

终于找到了解决方案。这确实很简单。

由于无法使用序数值来索引枚举数组,因此实现此目的的方法是基于tComboBox.ItemIndex进行迭代,同时使用validPos获取下一个Succ 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元素必须是 按{{1}}订购。

注意:我只是放弃了“索引”解决方案而且就是这样 堆积的原因。给了它一个很好的想法, 真正的解决方案出现了。