В процессе изучения языка программирования Delphi разработчики могут столкнуться с различными проблемами, одной из которых является некорректное отображение диалогового окна. В этом контексте рассмотрим типичную проблему: ошибку при вызове приватной функции, которая отвечает за логику отображения диалога. Ошибка заключается в том, что происходит обращение к несуществующему (null) указателю.
Пример кода с ошибкой
unit SandBox;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
AhojButton: TButton;
procedure AhojButtonClick(Sender: TObject);
private
procedure ShowDialog(amount: Integer);
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ShowDialog(amount: Integer);
var
td: TTaskDialog;
tb: TTaskDialogBaseButtonItem;
begin
try
td := TTaskDialog.Create(nil);
// ...
tb := TTaskDialogBaseButtonItem.Create(nil); // Ошибка здесь
// ...
finally
td.Free;
tb.Free; // Не используется, так как tb не указывает на выделенную память
end;
end;
procedure TForm1.AhojButtonClick(Sender: TObject);
begin
ShowDialog(100);
end;
end.
Анализ проблемы
В приведенном выше коде ошибка происходит в строке tb := TTaskDialogBaseButtonItem.Create(nil);. Конструктор класса TTaskDialogBaseButtonItem требует передачи экземпляра коллекции, но разработчик пытается создать объект без указания соответствующей коллекции. Это приводит к тому, что переменная tb не указывает на реальный объект и остаётся nil.
Решение проблемы
Для исправления ошибки необходимо правильно инициализировать кнопки диалога через методы класса TTaskDialog. Пример корректного использования:
procedure TForm1.ShowDialog(amount: Integer);
var
td: TTaskDialog;
begin
td := TTaskDialog.Create(nil);
try
td.Caption := 'Warning';
td.Text := 'Continue or Close?';
td.MainIcon := tdiWarning;
td.CommonButtons := [];
with td.Buttons do // Используем коллекцию кнопок диалога
begin
Add.Create('Continue').ModalResult := 100; // Создаём и добавляем кнопку "Продолжить"
Add.Create('Close').ModalResult := 101; // Создаём и добавляем кнопку "Закрыть"
end;
if td.Execute then
case td.ModalResult of
100: ShowMessage('Continue');
101: ShowMessage('Close');
end;
finally
td.Free; // Освобождаем выделенные ресурсы диалога
end;
end;
Заключение
При работе с диалоговыми окнами в Delphi важно правильно инициализировать объекты и использовать методы класса для их добавления в соответствующие коллекции. Это позволит избежать ошибок, связанных с несуществующими указателями, и обеспечит корректное отображение диалогов.
Статья посвящена решению проблемы с диалоговым окном в приватной функции на Delphi, связанной с некорректным созданием объекта кнопки, что приводит к ошибке null указателя.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS