В статье мы рассмотрим вопрос инициализации локальных переменных-указателей на элементы управления в Delphi. При работе с компонентами на форме часто бывает необходимо использовать указатели на них в коде. Но как быть с инициализацией этих указателей? Нужно ли явно создавать и инициализировать их, или достаточно просто использовать как указатели на уже существующие элементы управления?
Рассмотрим простой пример синхронизации ScrollBox'ов, где мы управляем, какую сторону синхронизировать с помощью RadioButton'ов - левую или правую сторону. При компиляции мы получаем предупреждения компилятора:
[dcc32 Warning] Unit1.pas(51): W1036 Variable 'ScrlBox1' might not have been initialized
[dcc32 Warning] Unit1.pas(51): W1036 Variable 'ScrlBox2' might not have been initialized
Вот сам пример кода:
procedure TForm1.Button1Click(Sender: TObject);
var
ScrlBox1, ScrlBox2: TScrollBox;
begin
if radiobtn_SyncLeftSides.Checked then // Синхронизация левой стороны
begin
ScrlBox1 := ScrollBoxLeft1;
ScrlBox2 := ScrollBoxLeft2;
end
else if radiobtn_SyncrightSides.Checked then // Синхронизация правой стороны
begin
ScrlBox2 := ScrollBoxRight1;
ScrlBox1 := ScrollBoxRight2;
end;
// Синхронизация ScrollBox'ов
ScrlBox2.VertScrollBar.Position := ScrlBox1.VertScrollBar.Position;
ScrlBox2.HorzScrollBar.Position := ScrlBox1.HorzScrollBar.Position;
end;
Что здесь не так? Если мы добавим в начало процедуры создание ScrollBox'ов:
то предупреждения компилятора пропадут. Но создавать ScrollBox'ы на самом деле не нужно, так как мы просто используем указатели на уже существующие элементы управления на форме.
Итак, в чем же проблема? Дело в том, что если ни один из RadioButton'ов не выбран, то переменные ScrlBox1 и ScrlBox2 не инициализируются перед использованием. Именно об этом и предупреждает компилятор. Чтобы исправить это, можно добавить еще одно условие, проверяющее, выбран ли хотя бы один RadioButton:
procedure TForm1.Button1Click(Sender: TObject);
var
ScrlBox1, ScrlBox2: TScrollBox;
begin
if radiobtn_SyncLeftSides.Checked then // Синхронизация левой стороны
begin
ScrlBox1 := ScrollBoxLeft1;
ScrlBox2 := ScrollBoxLeft2;
end
else if radiobtn_SyncrightSides.Checked then // Синхронизация правой стороны
begin
ScrlBox2 := ScrollBoxRight1;
ScrlBox1 := ScrollBoxRight2;
end
else
begin
// Переменные не инициализированы здесь!!!!
end;
// Синхронизация ScrollBox'ов
ScrlBox2.VertScrollBar.Position := ScrlBox1.VertScrollBar.Position;
ScrlBox2.HorzScrollBar.Position := ScrlBox1.HorzScrollBar.Position;
end;
Если ни один из RadioButton'ов не выбран, то мы просто выходим из процедуры с помощью команды Exit:
procedure TForm1.Button1Click(Sender: TObject);
var
ScrlBox1, ScrlBox2: TScrollBox;
begin
if radiobtn_SyncLeftSides.Checked then // Синхронизация левой стороны
begin
ScrlBox1 := ScrollBoxLeft1;
ScrlBox2 := ScrollBoxLeft2;
end
else if radiobtn_SyncrightSides.Checked then // Синхронизация правой стороны
begin
ScrlBox2 := ScrollBoxRight1;
ScrlBox1 := ScrollBoxRight2;
end
else
begin
Exit; // <--- Здесь
end;
// Синхронизация ScrollBox'ов
ScrlBox2.VertScrollBar.Position := ScrlBox1.VertScrollBar.Position;
ScrlBox2.HorzScrollBar.Position := ScrlBox1.HorzScrollBar.Position;
end;
Статья рассматривает вопрос инициализации локальных переменных-указателей на элементы управления в Delphi при работе с компонентами на форме. В примере рассматривается синхронизация ScrollBox'ов, где указатели на ScrollBox'ы не инициализированы, если ни о
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.