Delphi – это мощный инструмент для разработки приложений, но даже в таком проверенном временем инструментарии могут возникать ошибки. В данном случае, Ian Branch столкнулся с ошибкой доступа при использовании функции InputQuery. Давайте разберемся, в чем причина и как ее можно устранить.
Контекст проблемы
Ian использует функцию InputQuery для получения нескольких входных данных в Delphi 12 Athens. Пример кода, который он использует, выглядит следующим образом:
procedure TForm12.Button1Click(Sender: TObject);
var
Values: array of string;
begin
SetLength(Values, 3);
Values[0] := 'John';
Values[1] := '25';
Values[2] := 'London';
if InputQuery('User Information',
['Enter your name:', 'Enter your age:', 'Enter your city:'],
Values,
nil) then
begin
ShowMessage('Name: ' + Values[0] + sLineBreak +
'Age: ' + Values[1] + sLineBreak +
'City: ' + Values[2]);
end;
end;
По словам Ian, при нажатии на OK после ввода данных, приложение выдает ошибку доступа. Он также отмечает, что многовход работает корректно, и отмена также функционирует без сбоев.
Предложенное решение
Сообщество Delphi быстро откликнулось на проблему, и пользователь pyscripter предложил простое решение: использовать перегрузку InputQuery без последнего аргумента, который не может быть nil. Таким образом, исправленный код будет выглядеть так:
if InputQuery('User Information',
['Enter your name:', 'Enter your age:', 'Enter your city:'],
Values) then
begin
// Обработка введенных значений
end;
Альтернативное решение
Если по каким-то причинам предложенное решение не подходит, можно рассмотреть альтернативный подход. Например, проверить, что массив Values имеет достаточный размер перед вызовом InputQuery. Также стоит убедиться, что переменная sLineBreak в коде Ian действительно содержит нужный разделитель строк, так как ошибка может быть связана с некорректным выводом данных.
Пример кода с обработкой исключений
Для повышения надежности приложения можно использовать обработку исключений. Вот пример, как можно модифицировать код Ian с добавлением обработчика исключений:
procedure TForm12.Button1Click(Sender: TObject);
var
Values: array of string;
begin
SetLength(Values, 3);
Values[0] := 'John';
Values[1] := '25';
Values[2] := 'London';
try
if InputQuery('User Information',
['Enter your name:', 'Enter your age:', 'Enter your city:'],
Values) then
begin
ShowMessage('Name: ' + Values[0] + #10 +
'Age: ' + Values[1] + #10 +
'City: ' + Values[2]);
end;
except
on E: Exception do
ShowMessage('Произошла ошибка: ' + E.ClassName);
end;
end;
В этом примере, если при нажатии OK возникнет ошибка, программа перейдет к блоку except и выведет сообщение с информацией об ошибке, не завершаясь аварийно.
Заключение
Использование функции InputQuery в Delphi для получения нескольких входных данных является стандартной практикой. Проблема, с которой столкнулся Ian, является типичной и легко устранимой. Применение перегрузки функции без последнего аргумента, как предложил pyscripter, или же использование обработки исключений позволит избежать ошибок доступа и сделает программу более устойчивой к сбоям.
Пользователь Ian Branch столкнулся с ошибкой доступа при использовании функции `InputQuery` в Delphi 12 Athens для получения нескольких входных данных, и сообщество предложило устранить проблему, исключив последний аргумент функции.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.