0

文字列を比較し、一致する場合は TRUE を返し、一致しない場合は FALSE を返すこの関数を作成しました。

唯一の問題は、コンパイル時に、結果が未定義になる可能性があるというエラーが表示されることです。この特定の状況で考えられる結果は 2 つしかないため、これが問題ではないことはわかっていますが、私は一種の完璧主義者であり、改善したいと考えています。どなたか教えていただけませんか?

function filterUPC(upc: String): Boolean; 
var
  i, pos1: integer;
  Plano: TStringList;
  upcPlano: String;
begin
  Plano := TStringList.Create;
  if (fmMain.lblPlanook.Visible) and 
     not (fmMain.lblPlanook.Caption = 'INCOMPATIBLE') then
  begin
    Plano.LoadFromFile(fmMain.ebPlano.Text);
    for i := 0 to Plano.Count - 1 do
    begin
      pos1:=AnsiPos(';', Plano[i]);
      upcPlano := AnsiMidStr(Plano[i], pos1 + 1, 12);
      if (upc = upcPlano) then
      begin
        Result := TRUE;
        Break;
      end
      else if (i = Plano.Count - 1) then
      begin
        Result := FALSE;
      end;
    end;
  end
  else
  begin
    Result := FALSE;
  end;
  Plano.Free;
end;
4

1 に答える 1

4

Planoが空の場合、結果は未定義です。その場合、for ループは実行されず、Result設定もされません。

また、TStringList の create/free を try/finally でラップする必要があります (あなたは完璧主義者なので ;)。

これが私がすることです:

function filterUPC(upc: String): Boolean;
var
  i, pos1: integer;
  Plano: TStringList;
  upcPlano: String;
begin
  Result := FALSE;
  Plano := TStringList.Create;
  try
    if (fmMain.lblPlanook.Visible) and (fmMain.lblPlanook.Caption <> 'INCOMPATIBLE') then
    begin
      Plano.LoadFromFile(fmMain.ebPlano.Text);
      for i := 0 to Plano.Count -1 do
      begin
        pos1 := AnsiPos(';', Plano[i]);
        upcPlano := AnsiMidStr(Plano[i], pos1 + 1, 12);
        if (upc = upcPlano) then
        begin
          Result := TRUE;
          Break;
        end;
      end;
    end
  finally
    Plano.Free;
  end;
end;

一番上に追加し、チェックResult:=FALSE;を外しました。elsetry/finally は、例外が発生した場合でも、Plano が解放されることを保証します。

于 2012-05-17T03:49:42.810 に答える