如果它们仅用作表单控件的指针,我是否需要"创建"/初始化局部变量?

Mik*_*nni 2 delphi compiler-warnings tscrollbox delphi-xe7

我有一个同步Scrollboxes的简单示例,我控制哪一方通过单选按钮同步 - 同步左侧或右侧.当我编译时,我收到编译器消息:

[dcc32警告] Unit1.pas(51):W1036变量'ScrlBox1'可能尚未初始化

[dcc32警告] Unit1.pas(51):W1036变量'ScrlBox2'可能尚未初始化

这是一个简单的例子:

procedure TForm1.Button1Click(Sender: TObject);
var
  ScrlBox1, ScrlBox2: TScrollBox;
begin

    if radiobtn_SyncLeftSides.Checked then // Snyc Left side
    begin
      ScrlBox1 := ScrollBoxLeft1;
      ScrlBox2 := ScrollBoxLeft2;
    end
    else if radiobtn_SyncrightSides.Checked then  // Snyc Right side
    begin
      ScrlBox2 := ScrollBoxRight1;
      ScrlBox1 := ScrollBoxRight2;
    end;

    // Sync scroll boxes
    ScrlBox2.VertScrollBar.Position := ScrlBox1.VertScrollBar.Position;
    ScrlBox2.HorzScrollBar.Position := ScrlBox1.HorzScrollBar.Position;

end;
Run Code Online (Sandbox Code Playgroud)

这是什么问题?

如果我在开头添加这个消息就消失了:

ScrlBox1:= TScrollBox.Create(nil);
ScrlBox2:= TScrollBox.Create(nil);
Run Code Online (Sandbox Code Playgroud)

但我认为创建滚动框变量是不必要的,对吧?这些只是表单上控件的变量指针.

Rem*_*eau 6

如果这两个 radiobtn_SyncLeftSidesradiobtn_SyncrightSides未被选中,你是不是初始化ScrlBox1ScrlBox2使用前变量.这就是编译器所抱怨的.

procedure TForm1.Button1Click(Sender: TObject);
var
  ScrlBox1, ScrlBox2: TScrollBox;
begin
  if radiobtn_SyncLeftSides.Checked then // Snyc Left side
  begin
    ScrlBox1 := ScrollBoxLeft1;
    ScrlBox2 := ScrollBoxLeft2;
  end
  else if radiobtn_SyncrightSides.Checked then  // Snyc Right side
  begin
    ScrlBox2 := ScrollBoxRight1;
    ScrlBox1 := ScrollBoxRight2;
  end else
  begin
    // NOT INITIALIZED HERE!!!!!
  end;

  // Sync scroll boxes
  ScrlBox2.VertScrollBar.Position := ScrlBox1.VertScrollBar.Position;
  ScrlBox2.HorzScrollBar.Position := ScrlBox1.HorzScrollBar.Position;
end;
Run Code Online (Sandbox Code Playgroud)

如果您不想同步滚动,则应该只Exit执行以下过程:

procedure TForm1.Button1Click(Sender: TObject);
var
  ScrlBox1, ScrlBox2: TScrollBox;
begin
  if radiobtn_SyncLeftSides.Checked then // Snyc Left side
  begin
    ScrlBox1 := ScrollBoxLeft1;
    ScrlBox2 := ScrollBoxLeft2;
  end
  else if radiobtn_SyncrightSides.Checked then  // Snyc Right side
  begin
    ScrlBox2 := ScrollBoxRight1;
    ScrlBox1 := ScrollBoxRight2;
  end else
  begin
    Exit; // <-- HERE
  end;

  // Sync scroll boxes
  ScrlBox2.VertScrollBar.Position := ScrlBox1.VertScrollBar.Position;
  ScrlBox2.HorzScrollBar.Position := ScrlBox1.HorzScrollBar.Position;
end;
Run Code Online (Sandbox Code Playgroud)

  • 如果*总是*检查两个单选按钮中的一个,那么您不需要检查*both*.用一个简单的`else`代替第二个`if`子句:`if radiobtn_SyncLeftSides.Checked然后{...} else {...}`. (5认同)
  • 如果您可以保证检查其中一个单选按钮,则应该引发异常而不是简单的退出.添加其他选项后,例外是您的提醒 (4认同)