在下面的代码中,我得到了注释错误:
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;
我无法弄清楚出了什么问题,因为
i
和validPos
都属于tValidPos
pos
和validPos
如果我使用像pos [0] := validPos [i]
这样的括号,我仍然会得到“不兼容的类型:'枚举'和'tValidPos'”
请帮我解决这个问题。
答案 0 :(得分:1)
i:=低(validPos); //不兼容的类型:'tValidPos'和'tPos'
i
是一个数组,但Low(validPos)
返回单个序数值,而不是数组。 Hense不兼容的类型。
pos:= validPos [i]; //不兼容的类型:'枚举'和'tValidPos'
pos
也是一个数组,但validPos[i]
是单个序数值,而不是数组。 Hense不兼容的类型。
对于您尝试执行的操作,i
,pos
和Result
都需要声明为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}}订购。
注意:我只是放弃了“索引”解决方案而且就是这样 堆积的原因。给了它一个很好的想法, 真正的解决方案出现了。