У тих випадках, коли прикладній програмі у процесі її функціонування необхідно так чи інакше привертати увагу користувача до якихось подій усередині додатка або операційної системи, необхідну інформацію можна виводити в діалогові вікна, як наприклад, при запиті на збереження оброблюваних даних.
Найпростіший спосіб - procedure ShowMessage(const Msg: String) з модуля Dialogs.pas. Текст повідомлення, укладений в одинарних лапках і може містити не більше 255 символів.
Приклад із введенням у TEdit:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key in ['А'..'я'] then begin
Key:=#0;
Beep; // Наше повідомлення:
ShowMessage('Перейдіть на англійську розкладку');
end;
end;
Користувач побачить попередження з тим же заголовком, що його має проект. Віконце буде містити одну кнопку "ОК", що відповідає тільки за закриття повідомлення; тому з нею не можна пов'язати якусь функцію.
Розширити наші можливості має
function MessageDlg(const Msg: String; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: integer): integer :
Msg - 'Текст повідомлення'
DlgType - Вигляд діалогового вікна.
Назва параметра |
Значок |
mtWarning |
|
mtError |
|
mtInformation |
|
mtConfirmation |
|
mtCustom |
Значка немає |
Buttons - кнопки діалогового вікна: mbYes, mbNo, MbCancel, mbRetry, mbAbort, mbOk, mbIgnore, mbHelp, mbAll, mbYesToAll, mbNoToAll - та готові комбінації з них: mbYesNoCancel, mbOKCancel, mbYesAllNoAllCancel, mbAbortRetryIgnore, bmAbortIgnore .
Якщо потрібно скористатися однієї з цих готових закладок, пишуть, наприклад: mbYesNoCancel ; при потребі сполучити кілька - вводять параметри в квадратних дужках через кому: [mbYes, mbYesToAll] ; якщо одну - теж: [mbIgnore]
HelpCtx залишіть рівним нулю і більше про нього не згадуйте
Тепер створимо приклад. У OnCreate чи, ще краще, у OnCloseQuery (закладка Events у Form1) пропишіть:
Beep; //привертаємо увагу користувача
MessageDlg('Натисніть ОК, щоб закрити додаток', mtInformation, mbOKCancel, 0);
Подивилися? Ах так, що ОК натискай, що Cancel - програма все рівно закривається. Щоб система реагувала на натискання кнопок, скористаємося обробником case...of.
procedure
TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
case
MessageDlg('Натисніть ОК, щоб закрити додаток',mtInformation,mbOkCancel,0)
of
idOk: Application.Terminate;
idCancel:
Abort;
end;
end;
Відповідно до механізмів Delphi, функція MessageDlg повертає значення свого результату - натиснутої клавіші - integer (простої число), що зчитується оброблювачем case...of. Не забудьте в синтаксисі цього обробника вживати id_назва_кнопки замість mb_назва_кнопки
Тільки от клавіші діалогового вікна англійські. Але і це не лихо.
Перейдемо до function MessageBox(Parent: HWnd; Txt, Caption: PChar; TextType: Word): Integer , де
Parent - "хазяїн" (вікно, що володіє повідомленням) - указуйте Form1.handle чи Application.handle;
Txt - 'текст повідомлення';
Caption - 'його заголовок';
TextType - параметр, що поєднує DlgType і Buttons у попередній функції
MessageBox не тільки використовує не стандартні англійські кнопки, а їхні русифіковані еквіваленти з ресурсів Windows, але й генерує при виникненні звуковий сигнал, що відповідає параметру TextType.
Значення TextType |
Вигляд іконки
|
Кнопки |
0 |
-
|
ОК |
1 |
- |
ОК, Скасувати |
2 |
- |
Стоп, Повтор, Пропустити |
3 |
- |
Так, Ні, Скасувати |
4 |
- |
Так, Ні |
5 |
- |
Повтор, Скасувати |
16 |
Error |
ОК |
17 |
Error |
ОК, Скасувати |
18 |
Error |
Стоп, Повтор, Пропустити |
19 |
Error |
Так, Ні, Скасувати |
20 |
Error |
Так, Ні |
21 |
Error |
Повтор, Скасувати |
32 |
Confirmation |
ОК |
33 |
Confirmation |
ОК, Скасувати |
34 |
Confirmation |
Стоп, Повтор, Пропустити |
35 |
Confirmation |
Так, Ні, Скасувати |
36 |
Confirmation |
Так, Ні |
37 |
Confirmation |
Повтор, Скасувати |
48 |
Warning |
ОК |
49 |
Warning |
ОК, Скасувати |
50 |
Warning |
Стоп, Повтор, Пропустити |
51 |
Warning |
Так, Ні, Скасувати |
52 |
Warning |
Так, Ні |
53 |
Warning |
Повтор, Скасувати |
64 |
Information |
ОК |
65 |
Information |
ОК, Скасувати |
66 |
Information |
Стоп, Повтор, Пропустити |
67 |
Information |
Так, Ні, Скасувати |
68 |
Information |
Так, Ні |
69 |
Information |
Повтор, Скасувати |
MessageBox знаходиться в модулі Windows.pas і тому може використовуватися для подачі повідомлень також й у консольних додатках. Для прикладу розробим додаток для видачі повідомлення:
Відкрити File>New>Other> та оберати Console Application.
Delphi створить макет.
Залишити у Uses один модуль Windows та нижче продекларувати параметр var h: hwnd.
При компіляції може з'явитися попередження, що ця змінна не має початкового значення, але виконуваний файл створюється (у Delphi 6, принаймі).
program Project1;
uses Windows;
var h: hwnd;
begin
MessageBox(h,'Приклад консольного додатка з діалогом ..',
'Delphi для всіх',1);
end.
У додатках під Win32 (з формою) не слід вводити змінну h, а відразу в дужках можна написати: Form1.handle. Повідомлення користувача можна відправити нашій програмі за допомогою функції InputBox. Зараз ми створимо повідомлення з рядком уведення:
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Caption:=InputBox('Змінити заголовок',
'Введіть текст заголовка форми', 'Ваш_заголовок');
end;
Крім цих функцій є функції ShowMessagePos, MessageDlgPos з додатковими параметрами, що позначаються X і Y. Ці параметри задають координати віконечка повідомлення на екрані.
|