2013-06-18 31 views
-1

在下面的代碼,我得到的錯誤,說:不兼容的類型:「tValidPos」和「TPOS」

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. 同樣適用於posvalidPos

如果我使用像pos [0] := validPos [i]括號我仍然得到「不兼容的類型:‘枚舉’和‘tValidPos’」

請幫我解決這個問題。

+0

看着你的代碼很難想象你想要做什麼?你能解釋一下你想用這個代碼做什麼嗎?另外,函數結果「tValidPos」在哪裏聲明? –

+0

在上一個問題中(您刪除的那個),我解釋說您發佈的代碼沒有意義,並且詢問您何時轉發,請在問題文本中解釋*您真正嘗試實現的內容。在你發佈的代碼中有幾個問題,但是如果我們不知道你想要做什麼,很難告訴你如何解決它們。再次,請編輯您的問題,並提供您的代碼應該做什麼的解釋,以便我們瞭解如何做以幫助您找到答案。 –

+0

我會盡力解釋: 原函數接收tComboBox和有效位置的列表 。該列表是tValidPos,即, 反過來,是一個tPos數組。 tPos是列舉了所有可能位置的枚舉數 。有效的 職位列表是可變的。每個要定位的元素都有 它是有效的位置。該函數爲每個tComboBox.ItemIndex返回對應的tPos的 。 我發佈的代碼爲簡化目的,但最終 ,我想我沒有成功。 – user2383818

回答

-1

終於找到了解決辦法。這確實很簡單。

由於是不可能使用的序號值以指數枚舉的陣列,所述的方式來實現,這是通過重複基於tComboBox.ItemIndex和,在同一時間,使用Succ函數取出下一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; 

這裏只有一個限制:validPos元素必須 次序同tPos

注:我只是贊成「索引」解決方案,這就是堆疊的原因。給了它一個好的想法, 真正的解決方案出現了。

1

i:= Low(validPos); //不兼容的類型:「tValidPos」和「TPOS」

i是一個數組,但Low(validPos)返回單個序號值,而不是陣列。 Hense不兼容的類型。

pos:= validPos [i]; //不兼容的類型:「枚舉」和「tValidPos」

pos也是一個數組,但validPos[i]是一個單一的順序值,而不是陣列。 Hense不兼容的類型。

對於你正在嘗試做的,iposResult都需要被聲明爲tPos,不tValidPos

+0

'我[0]:= validPos [0]; //不兼容的類型:'Enumeration'和'tValidPos'' – user2383818

+0

這個任務有什麼問題? – user2383818

+0

@ user2383818:如果你把'i'改成了'tPos'就像我建議的那樣,那麼'i [0]'不是一個有效的語句,因爲'i'不再是一個數組,所以你不能索引它。如果你不明白序數值和數組之間的區別,你需要停止你正在做的事情,並閱讀編程基礎知識的好教程。 –