Главная » Delphi » Диалог типа MessageBox

0

Для этого перенесем, как всегда, проект из папки Glava4\2 в новую папку (Glava9\l), присвоим ему опять промежуточный номер версии 1.20.2 и присоединим к проекту еще одну форму (Form3— она и будет окном диалога). Перенесем ее, как и Form2, в список Available forms (пункт Project | Options I Forms), установим ДЛЯ BorderStyle значение bsNone, ДЛЯ Position значение poDesktopCenter, а соответствующий модуль назовем fmessage.pas.

Размеры подгоним на глаз и установим для формы красный цвет (пункт color в свойствах). Затем поместим на форму компонент Label, для которого установим в свойствах Font— цвет шрифта белый, размер 10 и стиль "полужирный" (можно и сам шрифт заменить, например, на Arial — будет еще красивее, только шрифты надо выбирать из тех, что заведомо установлены на любом компьютере). Текст в Label пока не пишем. Кроме этого, установим на форму две стандартные кнопки, назвав их ButtonYes и ButtonNo (их цвет изменить не получится, для этого нужно взять кнопки типа BitBtn с закладки Additional, но так даже пикантней). В результате получим заготовку формы, показанную на рис. 9.1.

Рис. 9.1. Заготовка формы-сообщения

Окончательно выровняем компоненты позже, в процессе отладки, а сейчас еще установим свойство TabOrder у кнопки ButtonYes равным I, а у кнопки ButtonNo, соответственно, 0. В этом случае первой при запуске сфокусируется кнопка ButtonNo, а при нажатии клавиши <ТаЬ> фокус перейдет на ButtonYes. О таких вещах следует всегда думать, если вы собираетесь сделать программу удобной для работы. Если разнообразных компонентов много и вы не уверены, какой именно компонент будет фокусироваться первым, то можно не возиться с TabOrder, а В момент показа компонента принудительно установить фокус "куда надо" с помощью процедуры setFocus (подробнее о передаче фокуса мы поговорим позже).

Теперь напишем следующий текст, заменив им все, что находится в основном модуле (SlideShow.dpr) там, где программа определяет, что один экземпляр уже запущен:

if st=’SlideShow’ then begin

Form3:=TForm3.Create(Application); (создаем экземпляр формы) Form3.Show; (показываем заставку)

while FlagExit=0 do Application. ProcessMessages; /’пустой цикл,

пока ждем ответа} if FlagExit=l then (была нажата кнопка ButtonNo} begin

Form3.Free; (уничтожаем Form3} exit; (выхода из программы} end else break (была нажата кнопка ButtonYes -

выходим из цикла и запускаем программу вторично1

end;

Переменную-флаг FiagExit мы будем использовать для того, чтобы определить, каков был результат диалога. Естественно, надо ее добавить в число переменных в модуле /"message:

var

Form3: TForm3; FiagExit:byte=Q;

Вообще-то мы начали немного с другого конца — логично сначала бы обеспечить диалог (ради которого все затевалось), а потом уже писать процедуру- результат его окончания. Но в данном случае это безразлично— одно без другого все равно не заработает. Переходим к форме Form3 и первым делом заполним компонент Label 1 и заголовки кнопок. Для этого создаем обработчик события onCreate, в который вставляем следующие строки:

procedure TForm3. ForrnCreate (Sender: TObject); begin

if word (GetKeyboardLayout (0) ) = $’119

(т. е. если язык по умолчанию русский}

then begin

Labell.Caption:=’Bbi действительно хотите

запустить’+#10+#13+’программу повторно?'; ButtonYes.Caption:=’Да'; ButtonNo.Caption: = ‘HeT’ ; end else begin

Labell.Caption:=’You really want to start program next time?'; But tonYes.Caption: =’Yes'; ButtonNo.Caption:=’No'; end; end;

В этой процедуре мы делаем следующий фокус: определяем текущую раскладку клавиатуры (как мы знаем из главы 7, при запуске она соответствует той, которая установлена в системе по умолчанию) и в зависимости от этого определяем язык диалога. Вставка в строку символьных кодов #10 и #13 (<LF> и <CR>, о них см. сноску 1 в главе 6) позволит разорвать строку и не делать форму слишком длинной. Если бы мы формировали заголовок статически на этапе создания формы, то разорвать строку нам бы не удалось. Английская строка короче, потому ее мы не разрываем. В принципе в свойствах captions или Text компонентов Delphi можно использовать только один символ — либо <LF>, либо <CR> — результатом все равно будет перенос текста на следующую строку, но порядка ради мы всегда будем использовать их вместе. Причем перенос будет работать только в тех компонентах, где это возможно — например, в заголовке формы или в однострочном редакторе Edit либо проигнорируется перенос, либо вторая половина строки исчезнет вообще.

Теперь создаем в модуле fmessage обработчики щелчков на соответствующих кнопках:

procedure TForm3.ButtonYesClick(Sender: TObject); begin

FlagExit:=2; {обеспечит повторный запуск) end;

prooedure TForm3.ButtonNoClick(Sender: TObject); begin

FlagExit:=l; {обеспечит выход) end;

Запустите и проверьте— все работает. Так мы сформировали стандартный диалог, который будет работать при нажатии кнопок мыши и от клавиши <Enter>. Но нам еще хочется использовать горячие клавиши. Для этого создадим такой обработчик события onKeyPress:

procedure TForm3.FonnKeyPress(Sender: TObject; var Key: Char); begin

if (key=’ Y’) or (key=’y’) or (кеу=’д’1 or (кеу=’Д’) then FlagExit:=2; if (key=’N’) or (key=’n’) or (кеу=’т’) or (key=’T’) then FlagExit:=l; end;

Запустите и проверьте — все работает, причем надписи зависят от раскладки по умолчанию (которая устанавливается в свойствах клавиатуры из панели управления). На самом деле пример этот вполне искусственный, т. к. раскладка по умолчанию есть вещь независимая (слава богу!) от языковой версии Windows — у многих, включая автора этих строк, версия русская, а раскладка по умолчанию английская. И именно языковая версия нам точнее укажет на то, кто именно будет читать наши сообщения, но определение версии — отдельный вопрос. На самом же деле все это вообще не так делается — в Delphi есть специальный механизм интернационализации, который позволяет полностью перевести ваше приложение на тот или иной язык и даже автоматически запускать его в зависимости от версии ОС — как раз именно то, что недавно мы имели в виду. По всем этим причинам мы а дальнейшем повторять эту часть программы не будем— посчитаем, что это была просто иллюстрация.

А вот другой диалог, который нам будет устанавливать время задержки при демонстрации (пока оно у нас постоянно и равно 3 сек, см. главу 2), мы постараемся сделать как надо — это действительно необходимо в программе.

Источник: Ревнч Ю. В.  Нестандартные приемы программирования на Delphi. — СПб.: БХВ-Петербург, 2005. — 560 е.: ил.

По теме:

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