delphi 7的函数结果可以是未定义的

时间:2012-05-17 03:32:28

标签: delphi delphi-7 undefined

我写了这个函数,它比较字符串,如果匹配则返回TRUE,否则返回FALSE。

唯一的问题是,当我编译时,我得到一个错误,说结果可能是未定义的。我知道这不是一个问题,因为在这种特殊情况下只有两种可能的结果,但我是一个完美主义者,我想要变得更好。 你们有人可以开导我吗?

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;

1 个答案:

答案 0 :(得分:4)

如果Plano为空,则结果未定义。在这种情况下,for循环永远不会执行,Result永远不会被设置。

另外,你应该在try / finally中包装TStringList create / free(因为你是一个完美主义者;)

这就是我要做的事情:

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;添加到顶部,并删除了else项检查。 try / finally保证释放Plano,即使引发了异常。