Вопрос пользователя связан с проблемами использования встроенных функций InputQuery и InputBox в среде разработки Delphi XE2. Пользователь столкнулся с тем, что область ввода располагается не в том месте, и хотел бы узнать, возможно ли как-то переустановить её до создания собственной формы ввода.
Анализ проблемы
Компонент InputQuery в Delphi XE2 предназначен для отображения короткого текста-метки слева от поля ввода, аналогично компоненту TLabeledEdit. Однако, пользователь пытается использовать его для отображения инструкций над меткой, что не предусмотрено функциональностью данного компонента.
Подтвержденный ответ
InputQuery() не предназначен для использования в таком контексте, и лучше создать собственную форму с нужным расположением элементов. Тем не менее, если необходимо использовать именно InputQuery, существует техническая возможность переупорядочить элементы управления на форме, используемой InputQuery.
Пример кода
Для изменения расположения элементов можно использовать событие OnActiveFormChange класса TScreen. Ниже приведен пример кода, который позволяет переместить поле ввода под меткой:
procedure TMyForm.ActiveFormChanged(Sender: TObject);
var
Form: TCustomForm;
Prompt, Edit, Ctrl: TControl;
I, J, ButtonTop: Integer;
begin
Form := Screen.ActiveCustomForm;
if (Form = nil) or (Form.ClassName <> 'TInputQueryForm') then Exit;
for I := 0 to Form.ControlCount-1 do
begin
Ctrl := Form.Controls[I];
if Ctrl is TLabel then
begin
Prompt := TLabel(Ctrl);
end
else if Ctrl is TEdit then
begin
Edit := TEdit(Ctrl);
end;
end;
Edit.SetBounds(Prompt.Left, Prompt.Top + Prompt.Height + 5, Prompt.Width, Edit.Height);
Form.ClientWidth := (Edit.Left * 2) + Edit.Width;
ButtonTop := Edit.Top + Edit.Height + 15;
J := 0;
for I := 0 to Form.ControlCount-1 do
begin
Ctrl := Form.Controls[I];
if Ctrl is TButton then
begin
Ctrl.SetBounds(Form.ClientWidth - ((Ctrl.Width + 15) * (2-J)), ButtonTop, Ctrl.Width, Ctrl.Height);
Form.ClientHeight := Ctrl.Top + Ctrl.Height + 13;
Inc(J);
end;
end;
end;
procedure TMyForm.DoSomething;
var
value: string;
begin
Screen.OnActiveFormChange := ActiveFormChanged;
try
InputQuery('Enter New Schedule', 'Format: <Second> <Minute> <Hour> <Day_of_the_Month> <Month_of_the_Year> <Day_of_the_Week> <Year>.'#10'Use * for repeating cycles. ex: 0 0 7 * * * * (trigger at 7AM everyday)', value);
finally
Screen.OnActiveFormChange := nil;
end;
end;
Также предоставлен альтернативный код, который добавляет метку с инструкциями выше поля ввода:
class procedure TScreenEvents.ActiveFormChanged(Sender: TObject);
// ... код аналогичен предыдущему примеру, но включает добавление метки с инструкциями
end;
procedure TMyForm.DoSomething;
// ... код аналогичен предыдущему примеру, но включает вызов InputQuery без дополнительного сообщения
end;
Заключение
Использование встроенных функций InputQuery и InputBox в Delphi XE2 может потребовать дополнительной настройки, если требуется изменение стандартного расположения элементов. Создание собственной формы с нужным расположением элементов управления является предпочтительным решением, но с помощью предоставленных примеров кода можно добиться желаемого результата, используя существующие компоненты.
Пользователь сталкивается с проблемой неправильного расположения области ввода в компоненте `InputQuery/InputBox` в Delphi XE2 и ищет способ корректировки этого расположения.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.