Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 不兼容类型:';tValidPos';和';TPO&x27;_Delphi_Casting_Delphi 2010 - Fatal编程技术网

Delphi 不兼容类型:';tValidPos';和';TPO&x27;

Delphi 不兼容类型:';tValidPos';和';TPO&x27;,delphi,casting,delphi-2010,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

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

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]
    这样的括号,我仍然会得到“不兼容的类型:'Enumeration'和'tValidPos'”

    请帮我解决这个问题

    i:=低(有效期);//不兼容的类型:“tValidPos”和“TPO”

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

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

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


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

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

    由于无法使用序数值为枚举数数组编制索引,因此实现此目的的方法是基于
    tComboBox.ItemIndex
    进行迭代,同时使用
    succi
    函数获取下一个
    validPos

    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;
    
    类型tPos=(po1、po2、po3、po4、po5、poNil);
    tValidPos=TPO的阵列[低(tPos)…高(tPos)];
    const validPos:tValidPos=(po1,po4,poNil,poNil,poNil,poNil);
    .........
    功能拓扑(const acombox:tcombox;validPos:tValidPos):tPos;
    var p,位置:TPO;
    i:字节;
    开始
    p:=低(有效期);//使用第一个validPos初始化
    对于i:=0到aComboBox.ItemIndex是否开始
    pos:=validPos[p];//当前有效期
    如果pos=poNil,则开始//无效?
    pos:=低(有效期);//第一个validPos
    打破
    结束;
    
    如果Succ(p)查看您的代码,很难想象您正在尝试做什么?你能解释一下你想用这些代码做什么吗?另外,函数结果“tValidPos”在哪里声明?在上一个问题(您删除的问题)中,我解释说您发布的代码毫无意义,并询问您何时重新发布,请在您的问题文本中解释您真正尝试实现的目标。您发布的代码中有几个问题,但是如果我们不知道您首先要做什么,就很难告诉您如何解决这些问题。再一次,请回答您的问题,并解释您的代码应该做什么,这样我们就知道如何帮助您找到答案。我将尝试解释:原始函数接收一个tComboBox和一个有效位置列表。该列表是TvalidPO的列表,而TvalidPO又是TPO的数组。tPos是列出所有可能位置的枚举器。有效位置的列表是可变的。要定位的每个元素都有其有效的位置。函数返回每个tComboBox.ItemIndex对应的TPO。我发布代码是为了简化,但最终,我认为我没有成功。我有一个该函数的工作版本,但我必须使用tPos进行赋值。有趣的是,虽然“I”和“validPos”都是“tValidPos”类型,但编译器不接受赋值。你能解释一下吗?除此之外,我不能做像'I':=validPos[0]'这样的赋值。编译器声明我必须使用enumertaor而不是序数值,这意味着我不能将tComboBox.ItemIndex值用于赋值。你知道我怎样才能做到吗?
    I[0]:=validPos[0];//不兼容的类型:“Enumeration”和“tValidPos”
    @user2383818:如果您像我建议的那样将
    i
    更改为
    TPO
    ,则
    i[0]
    不是有效的语句,因为
    i
    不再是数组,因此无法索引到其中。如果你不理解序数值和数组之间的区别,你需要停止你正在做的事情,去读一本好的编程基础教程。1-不,在上面的陈述中,“i”仍然是“tValidPos”。这就是为什么我不明白为什么我不能将数组“validPos”的元素[0]分配给数组“I”的元素[0]。2-您因按错键而被忽略。即使你的压力是正确的,那也不意味着你有权被打搅。