3

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;
4

3 に答える 3

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;
于 2013-02-06T07:46:01.380 に答える
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;

追加の利点:同じ値を返す名前を一緒に保持する必要はありませんが、リストをアルファベット順に並べ替えることができます。

于 2013-02-06T07:46:13.690 に答える
1

テストするすべての名前を含む文字列の配列 (または、配列の次元を気にせずにさらに名前を追加する場合は動的配列) を作成します (ここでは、固定サイズの文字列配列を想定しています)。

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

テスト ルーチンでは、次のようにcaseキーワードを使用できます。

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

こっちの方がやりやすいと思う

于 2013-02-06T08:14:21.453 に答える