Вопрос о глобальных переменных и формах в программировании часто вызывает дискуссии. С одной стороны, глобальные переменные могут упростить доступ к данным из разных частей программы, но с другой стороны, они могут привести к непредсказуемому поведению программы из-за сложности отслеживания зависимости между различными частями кода. В данной статье мы рассмотрим, как можно избежать использования глобальных переменных и форм, используя примеры на языке Object Pascal в среде разработки Delphi.
Локальные формы в классе
Чтобы избежать глобальных переменных, можно сделать формы членами класса, в котором они используются. Например, в главной форме можно создать локальную переменную, которая будет ссылаться на вторую форму с таймером и меткой.
unit MainFormUnit;
interface
uses
Winapi.Windows, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, TimerFormUnit;
type
TMainForm = class(TForm)
btnOpenTimerForm: TButton;
procedure btnOpenTimerFormClick(Sender: TObject);
private
{ Private declarations }
FTimerForm: TTimerForm; // Локальная переменная для формы с таймером
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
procedure TMainForm.btnOpenTimerFormClick(Sender: TObject);
begin
if FTimerForm is nil then
FTimerForm := TTimerForm.Create(nil);
try
FTimerForm.Show;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
FTimerForm.Free;
end;
end;
end.
В данном примере, при нажатии на кнопку btnOpenTimerForm, создается новая форма FTimerForm, если она еще не существует, и показывается пользователю. Важно обработать возможные исключения и корректно освободить ресурсы формы.
Таймерная форма
Таймерная форма может быть реализована следующим образом:
unit TimerFormUnit;
interface
uses
Winapi.Windows, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TTimerForm = class(TForm)
lblDateTime: TLabel;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
TimerForm: TTimerForm;
implementation
{$R *.dfm}
procedure TTimerForm.FormCreate(Sender: TObject);
begin
Timer1.Enabled := True;
end;
procedure TTimerForm.FormDestroy(Sender: TObject);
begin
Timer1.Enabled := False;
inherited;
end;
procedure TTimerForm.Timer1Timer(Sender: TObject);
begin
lblDateTime.Caption := DateTimeToStr(Now);
end;
end.
Здесь используется событие FormCreate для активации таймера, а FormDestroy - для его деактивации, что предотвращает утечку ресурсов.
Главный модуль программы
В главном модуле программы Project1.dpr настройка главного цикла обработки событий приложения:
program Project1;
{$APPTYPE CONSOLE}
uses
System.SysUtils,
Vcl.Forms,
MainFormUnit,
TimerFormUnit;
begin
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
Использование локальных переменных позволяет избежать глобальных переменных и упрощает управление жизненным циклом форм. При этом важно корректно управлять созданием и уничтожением объектов, чтобы избежать утечек памяти и других проблем.
В контексте обсуждается использование локальных форм вместо глобальных переменных в программировании на Delphi, чтобы улучшить управление памятью и упростить структуру программы.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.