2014-07-23 104 views
0

我想改變一個TLabel的字體顏色,根據我從一個整數得到的值。使用整數值作爲參考

var 
    i: Integer; 
begin 
ValueGenerator (i); 
    if i <= 14 then 
    begin 
    L1.Font.Color := clBlue; 
    end; 
    if i >= 15 then 
    begin 
    L1.Font.Color := clGreen; 
    end; 
    if i <= 29 then 
    begin 
    L1.Font.Color := clGreen; 
    end; 
    if i >= 30 then 
    begin 
    L1.Color := clYellow; 
    end; 
    if i <= 49 then 
    begin 
    L1.Color := clYellow; 
    end; 
    if i >= 50 then 
    begin 
    L1.Color := clRed; 
    end; 
    L1.Caption := IntToStr(i); 
end; 

值輸出爲0到100 什麼都值我得到了,我的TLabel總是在clGreen。我在這裏做錯了什麼?

+0

範圍重疊。如果你給它的值是20,那麼它將會大於15並且小於29.你應該考慮在其中添加一些'else',以使它只選擇一個,但即使如此,我也要重構這個代碼。也許一個'case'是你真正想要的嗎? –

+0

你需要更多'else'。 – JimmyB

+0

是的,有更多的工作。但正如我所看到的'案例'解決方案,這是我最需要的。謝謝@ LasseV.Karlsen – Bianca

回答

7

您的範圍重疊,值20都大於15並小於29,因此它首先設置一種顏色,然後再設置另一種顏色,但沒有一個使得其餘代碼不執行。所以首先你設置clGreen,然後你有我小於49的情況​​,這將覆蓋。

下面是你可能要編寫代碼:

case i of 
    0..14: L1.Font.Color := clBlue; 
    15..29: L1.Font.Color := clGreen; 
    30..49: L1.Font.Color := clYellow; 
    50..100: L1.Font.Color := clRed; 
end; 
+0

這正是我想要的。 'case'對我來說是新事物。非常感謝你的代碼! BR,Bee。 – Bianca

0

根據您的邏輯,您的顏色將始終爲藍色或綠色。你需要添加最上面的條件:

if (i >= 15) and (i < 30) then 
begin 
    L1.Font.Color := clGreen; 
end; 

等等等等。

+0

你說得對,修好了。 – C0D3LIC1OU5

+0

謝謝,這種方法在上面的例子中是如此。固定值。 – Bianca

6

而不是case我想在這種情況下,一些堆放if .. then .. else使用,所以你不必照顧整個範圍內的每個顏色的,只爲最大值

if i <= 14 then 
    L1.Color := clBlue 
else if i <= 29 then 
    L1.Color := clGreen 
else if i <= 49 then 
    L1.Color := clYellow 
// can easily extended with 
// else if i <= 79 then 
// L1.Color := clMaroon 
else 
    L1.Color := clRed; 
+0

'案例'也有'其他'。 –

+0

@SertacAkyuz是的,但我的回答沒有'case' –

+1

我知道。你給了一個優勢*「所以你不必關心整個範圍」*,你也可以用'案例'來做到這一點。我就是這麼說的。 –