Організація взаємодії додатка з користувачем в delhi
Взаємодія програми з користувачем присутній в кожній програмі. Додаток має мати можливість повідомити користувачеві про той чи інший розвиток подій, надати можливість прийняти рішення і повідомити його програмі. Для цього Delphi надає програмістові кілька способів, залежно від необхідного рівня взаємодії додатка з користувачем в кожному конкретному випадку.
функція ShowMessage
Найпростіший випадок такої взаємодії - просто поінформувати користувача. Ну хоча б про те, що в процесі обчислення відбувся розподіл на нуль. Просте інформаційне повідомлення вкаже користувачу на необхідність внести зміну в дані розрахунку. Для створення простого інформаційного повідомлення служить вбудована функція ShowMessage:
ShowMessage ( 'На нуль ділити не можна!');
Функція ShowMesage допускає виведення повідомлення в кілька рядків. Для цього потрібно скористатися стандартними символами переходу на інший рядок: # 10 # 13:
ShowMessage ( 'виникла помилка ділення на нуль.' + # 10 # 13 + 'Виправте введені дані.');
Приклад.
Ось як може виглядати програма, що обчислює результат ділення двох чисел, з організацією видачі інформації користувачеві про неправильному введенні даних:
procedure TForm1.Button1Click (Sender: TObject);
var x, y: Integer;
begin
try
x: = StrToInt (Edit1.Text);
y: = StrToInt (Edit2.Text);
if y = 0 then
begin
ShowMessage ( 'На нуль ділити не можна!' + # 10 # 13 + 'Виправте введення.');
Edit2.SetFocus;
exit;
end;
Label3.Caption: = 'Значення:' + FloatToStr (x / y) ;;
except
ShowMessage ( 'Повинні бути введені цілі числа, виправте!');
Edit1.SetFocus;
end;
end;
Дана програма попереджає користувача як про введення нуля, так і взагалі про введення нечислових даних або нецілих чисел. Інформаційне віконце виводиться в модальному режимі, тобто, при видачі повідомлення робота програми переривається, і продовжиться тільки після закриття вікна з оператора, наступного за викликом функціонально ShowMessage:

функція MessageDlg
У загальному випадку, крім простого інформування, додаток повинен отримати згоду користувача на вчинення тієї чи іншої дії. Такого роду взаємодія програми і користувача дозволяє здійснити функція MessageDlg. Як видно з назви, функція MessageDlg здійснює саме діалог, тобто задає питання і чекає відповідь користувача.
Для отримання такої відповіді функція MessageDlg може надавати користувачеві набір кнопок, що мають на увазі ту чи іншу відповідь. Відповіді на питання можуть бути, наприклад, "Так" - "Ні", або "Так" - "Ні" - "Скасувати", або інші варіанти. Ось опис функції MessageDlg:
function MessageDlg (const Msg: String; DlgType: TMsgDlgType;
Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
Параметри функції MessageDlg:
Msg - виведене повідомлення, з можливістю виведення в декілька рядків, DlgType - тип діалогу, наприклад "Небезпека, Помилка, Інформація, Підтвердження", і т.д. Buttons - безліч кнопок з відповідними заголовками, HelpCtx - в більшості випадків можна використовувати "0" - нуль. Для кожного з типів діалогу виводиться своя піктограма, що, безсумнівно, додає барвистості і інформативності вікна, виведеному цією функцією.
Для того щоб отримати більш повну інформацію про параметри, скористайтеся довідкою Delphi: натисніть CTRL і клацніть мишкою по функції або потрібного параметра. Відкриється модуль з повним описом.
Функція MessageDlg повертає значення, відповідне даному користувачем відповіді на питання. Це значення нескладно отримати в цілу змінну і проаналізувати, перед тим як використовувати в програмі. Наприклад, натискання на кнопку "Yes" повертає значення "6", результат натискання будь-яких інших кнопок також нескладно отримати.
Наприклад, для того щоб організувати діалог закриття програми, програма може використовувати такий варіант функції MessageDlg:
Result: = MessageDlg ( 'Ви дійсно хочете закрити програму?', MtConfirmation, [mbYes, mbNo], 0);
if Result = 6 then Application.Terminate;
procedure TForm1.Button1Click (Sender: TObject);
var Result: Integer;
begin
if Memo1.Modified
then Result: = MessageDlg ( 'Зберегти зміни?', mtConfirmation, [mbYes, mbNo, mbCancel], 0);
case Result of
2: exit; // Натискання "Cancel", виходимо з функції, без виходу з програми
6: Memo1.Lines.SaveToFile ( 'ІмяФайла.txt'); // Натискання "Yes", зберігаємо файл
7:; // Натискання "No", нічого не робимо
else exit; // Якщо вікно закрили натисканням на "хрестик" в заголовку - теж виходимо без виходу з програми
end;
Application.Terminate; // Закриваємо додаток
end;

Бачимо, що в порівнянні з функцією ShowMessage функція MessageDlg має більш розвинений інтерфейс. Можна керувати заголовком вікна, піктограму виведеної в тому чи іншому типі запиту, і набором кнопок, що дозволяє отримати і проаналізувати відповідь користувача. Користуючись цим, функцію MessageDlg з успіхом можна використовувати замість функції ShowMessage.
Русифікація функції MessageDlg
Звичайно, такі заголовки кнопок як, наприклад, "Yes", "No", "Cancel" давно стали стандартом і зрозумілі користувачам без перекладу. Однак, застосовуючи функцію MessageDlg в програмі, де всі інші написи виводяться російською мовою, можна бачити що англійський інтерфейс її вікна виглядає чужеродно. Вонікает питання, як можна русифікувати заголовок вікна і назви кнопок такою зручною і корисною функції як MessageDlg.
Є кілька способів зробити це. Тема і назви кнопок функції MessageDlg беруться з модуля consts.pas і при компіляції поміщаються в ресурси програми. Тому, змінивши дані константи в згаданому модулі, і перекомпіліровать додаток, ми отримаємо цілком собі російськомовне вікно, що виводиться функцією MessageDlg.
Однак, щось міняти в стандартних модулях Delphi не завжди правильно. Є інший спосіб, пов'язаний з динамічним формуванням функції MessageDlg. Цей спосіб дозволяє перед виведенням на екран динамічно змінити параметри функції. Ось як, користуючись цим способом, можна русифікувати запит на збереження тексту в попередній програмі:
procedure TForm1.Button1Click (Sender: TObject);
begin
if Memo1.Modified then
with CreateMessageDialog ( 'Зберегти зміни?', mtInformation, [mbYes, mbNo, mbCancel]) do
try
Caption: = 'Запит на збереження'; // Зміна заголовка вікна
(FindComponent ( 'Yes') as TButton) .Caption: = 'Так'; // Русифікація кнопки "Yes"
(FindComponent ( 'No') as TButton) .Caption: = "Ні"; // Русифікація кнопки "No"
(FindComponent ( 'Cancel') as TButton) .Caption: = 'Скасувати'; // Русифікація кнопки "Cancel"
ShowModal; // Виклик діалогового вікна в модальному режимі
case ModalResult of // Аналіз результату закриття модального діалогового вікна
2: exit;
6: Memo1.Lines.SaveToFile ( 'ІмяФайла.txt');
7:;
else exit;
end;
finally
Free;
end;
Application.Terminate;
end;
