У тих випадках, коли прикладній програмі у процесі її функціонування необхідно так чи інакше привертати увагу користувача до якихось подій усередині додатка або операційної системи, необхідну інформацію можна виводити в діалогові вікна, як наприклад, при запиті на збереження оброблюваних даних.
Найпростіший спосіб - 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. Ці параметри задають координати віконечка повідомлення на екрані.














