2013-02-06 22 views
3

我有一個問題,當我去添加更多的「名稱」的if語句。我很難看到那裏是否準備好了。因此,是否有一個更乾淨的方式來寫這個在哪裏我可以很容易地看到什麼名字都讀在那裏?寫所有這些if語句清理器

function TfDB.GetW(name: string) :integer; 
    begin 
    result := 0; 
    if (name = 'Destacker') or (name='Router') or (name = 'Turn Table') Then 
     result := 57; 
    if (name = 'Laser Marker') then 
     result := 66; 
    if (name = 'SP28')OR(name='Chamber') OR (name = 'CM402') OR (name = 'SP60') then 
     result := 65; 
    if (name = 'Conveyor') OR (name = 'Slide Gate') OR (name = 'Washer') then 
     result := 51; 
    if (name = 'BTU') OR (name = 'Furukawa') OR (name = 'Radial') OR (name = 'HDP') or (name = 'MSR') OR (name = 'Koki') Or (name = 'MSF') then 
     result := 98; 
    if (name = 'Buffer')OR (name = 'Reclaimer') OR (name = 'ECO Roller') then 
     result := 49; 
    if (name = 'Inverter') or (name = 'CNC') then 
     result := 42; 
    if (name = '3-D Check Station') or (name='Screw Machine') or (name='VT-Win') or(name='Component Viewer') then 
     result := 58; 
    if (name = 'AOI Panel') or (name='AirBlow') then 
     result := 42; 
    if (name='Mag Loader') or (name='Soltec') then 
     result := 73; 
    if (name='Tester') then 
     result := 33; 
    if (name='LoadBox') then 
     result := 17; 
    if (name = 'DeltaWave') then 
     result := 89; 
    if (name = 'ScrewFeeder') then 
     result := 25; 
    if (name='Pump') then 
     result := 33; 

    //if result is 0 show message error. 

    end; 
+0

我認爲你應該使用數據庫或者至少一個INI才能在未來編輯,硬編碼可能不是一個好主意。 – ComputerSaysNo

+0

它使用一個數據庫,它抓住一個機器(泵)的名稱,並給它一個33的形狀大小..但是,如果我想要改變一臺機器的大小或增加新的機器尺寸,那麼我必須要更改。但只是發現這更容易。 –

回答

10

您可以創建一個字典TDictionary<string, Integer>,並將其存儲在全局變量中。在初始化時使用名稱到寬度映射加載它。然後你的功能就變成了單線程。

var 
    WidthMapping: TDictionary<string, Integer>; 
.... 
function TfDB.GetW(name: string) :integer; 
begin 
    if not WidthMapping.TryGetValue(name, Result) then 
    ... handle error condition 
end; 
.... 
initialization 
    WidthMapping := TDictionary<string, Integer>.Create; 
    WidthMapping.Add('Destacker', 57); 
    WidthMapping.Add('Router', 57); 
    ... etc. 
.... 
finalization 
    WidthMapping.Free; 
+0

我喜歡這種方法,並保持它的堆疊方便我閱讀 –

+0

我可以問,TDictionary需要什麼? –

+0

它是'Generics.Collections',或者如果你正在使用新的命名空間'System.Generics.Collections'。爲了將來的參考,您可以隨時在聯機幫助中查看:http://docwiki.embarcadero.com/Libraries/XE2/en/System.Generics.Collections.TDictionary –

5

是,不使用if語句,但在陣列和循環:

const 
    NAME_RESULT: array [1..2] of record 
    Name: string; 
    Value: Integer; 
    end = (
    (Name: 'whatever'; Value: 57) 
    , (Name: 'Something else'; Value: 57) 
); 
var 
    i: Integer; 
begin 
    Result := 0; // or whatever you need your default to be 
    for i := Low(NAME_RESULT) to High(NAME_RESULT) do 
    if SameText(name, NAME_RESULT[i].Name) then 
    begin 
     Result := NAME_RESULT[i].Value; 
     Break; 
    end; 
end; 

額外的好處:你不需要它會返回相同的值的名稱保持在一起,但可以按字母順序排列列表。

1

創建一個包含所有需要測試的名稱的字符串(這裏我假定爲固定大小的字符串數組)的字符串(或者動態數組,如果您想進一步添加更多名稱而不考慮數組維度):

var test = array [1..50] of string; 
    a[1]:='Destacker'; 
    a[2]:='Router'; 

在您的測試程序,你可以使用情況關鍵字如下:

function TfDB.GetW(index: integer) :integer 
    begin 
    result:=0; 
    case index of 
     1,2,3: result:=57; 
     4: result:=66 
    end 
    end; 

我認爲這樣更容易

+0

你如何從控制名稱獲得索引?請不要調用索引變量名稱。任何名爲name的變量都應該是一個字符串。 –

+0

對不起,我一定跳過那部分:) –