Как я могу эмулировать модальный результат из формы, в которой нет кнопок?

#delphi

#delphi

Вопрос:

У меня есть форма, которая будет отображаться модально только со списком. Я хочу иметь возможность возвращать модальный результат mrOK при двойном щелчке элемента в списке или модальный результат mrCancel, когда пользователь нажимает escape.

Когда в форме нет кнопки для назначения модального ответа, как я могу эмулировать это?

Ответ №1:

На самом деле это очень просто: просто установите свойство формы ModalResult :

Используйте ModalResult, чтобы закрыть форму, когда она отображается модально.

По умолчанию ModalResult равен mrNone . Установите для ModalResult любое ненулевое значение, чтобы закрыть форму. Значение, присвоенное ModalResult, становится возвращаемым значением вызова функции ShowModal, используемой для отображения формы.

В вашем случае,

 procedure TForm1.ListBox1DblClick(Sender: TObject);
begin
  if ListBox1.ItemIndex <> -1 then
    ModalResult := mrOk;
end;

procedure TForm1.ListBox1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    VK_RETURN:
      if ListBox1.ItemIndex <> -1 then
        ModalResult := mrOk;
    VK_ESCAPE:
      ModalResult := mrCancel;
  end;
end;
 

Комментарии:

1. Вероятно, вы захотите обрабатывать нажатия клавиш в OnKey... случае самой формы, а не в списке. Просто установите KeyPreview для свойства формы значение True.

2. Поскольку OP написал «форму […] только с полем списка», я думаю, что чище использовать обработчик событий фактического элемента управления.