Нужно ли "создавать" / инициализировать локальные переменные, если они просто используются в качестве указателей для формирования элементов управления?

У меня есть этот простой пример синхронизации 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;

В чем здесь проблема?

Если я добавлю это в начале, сообщение исчезнет:

ScrlBox1:= TScrollBox.Create(nil);
ScrlBox2:= TScrollBox.Create(nil);

но я не думаю, что создание переменных прокрутки необходимо, верно? Это просто переменные указатели на элементы управления в форме.

1 ответ

Решение

Если оба radiobtn_SyncLeftSides а также radiobtn_SyncrightSides не проверены, вы не инициализируете ScrlBox1 а также 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 else
  begin
    // NOT INITIALIZED HERE!!!!!
  end;

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

Если вы не хотите синхронизировать прокрутку, просто 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;
Другие вопросы по тегам