Збільшення можливостей функції MessageDlg (документація)

Необхідність у двох неочевидних (не за замовчуванням) можливості функції messagedlg
змусили мене дослідити вихідний код модуля dialogs.
По-перше, мені потрібна була форма діалогу, яка закривалася б при натисканні клавіші і
повертала при цьому код натиснутої клавіші.
Щось на зразок команди turbopascal if keypressed then thekey: = readkey.
По-друге, мені потрібно було контролювати,
яка кнопка діалогу активна за замовчуванням.
Якщо, наприклад, у вас з'явилася форма messagedlg з питанням: "Ви дійсно хочете видалити файл?"
і за замовчуванням фокус знаходиться на кнопці yes (що вірно в стандартному вікні messagedlg),
то для нетерплячого користувача можуть виникнути проблеми.
У модулі dialogs є функція, звана createmessagedialog,
яка використовується в messagedlg для власне формування діалогу.
Використовуючи функцію createmessagedialog прямо ви отримуєте найкращу форму messagedlg і плюс більший контроль за поведінкою цієї форми.
Нижче показано вирішення цих моїх двох проблем.
Створіть новий додаток. Додайте дві кнопки (buttons) і Мітку (label) на формі.
Назвіть подія onclick кнопки button1
tform1.button1click і подія onclick кнопки button2 tform1.button2click.
Клацніть кнопкою button1, щоб з'явилася діалогова форма,
яка завершиться, коли користувач натисне одну з видимих діалогових кнопок або натисне
esc або клацне на іконці закриття форми діалогу. Натиснута кнопка буде показана в мітці label1.
Клацніть кнопкою button2, буде показана стандартна діалогова форма,
але з однією відмінністю: за замовчуванням вибрана кнопка no, а не кнопка yes.
Для вибору кнопки no я використовую код: if tbutton (controls [n]). Name = "no".
Замість "no" можна використовувати "yestoall", "abort" або будь-які інші заголовки кнопки,
використовуваної за замовчуванням.
unit unit1;
interface
uses
windows, messages, sysutils, classes, graphics, controls,
forms, dialogs,
stdctrls;
type
tform1 = class(tform)
button1: tbutton;
label1: tlabel;
button2: tbutton;
procedure button1click(sender: tobject);
procedure helpboxkeypress(sender: tobject; var key:
char);
procedure button2click(sender: tobject);
private
{ private declarations }
public
{ public declarations }
end;
var
form1: tform1;
implementation
{$r *.dfm}
var
legalkeys: string;
procedure tform1.button1click(sender: tobject);
var
s:string;
begin
legalkeys:=”abc123″;
s:=”what do you want to do now?”#13#13″a. go home”#13″b.
eat lunch”#13+
“c. sleep”#13″1. program in delphi”#13″2. order a
pizza”#13″3. nothing”;
with createmessagedialog(s, mtco
begin
try
onkeypress:=helpboxkeypress;
if showmodal=mrok
then label1.caption:=”you pressed: “+legalkeys[tag]
else label1.caption:=”you pressed: “+”cancel”;
finally
free;
end; //try..finally
end; //with
end;
procedure tform1.helpboxkeypress(sender: tobject; var key:
char);
begin
if pos(upcase(key),legalkeys)> 0 then
begin
tform(sender).tag:=pos(upcase(key),legalkeys);
tform(sender).modalresult:=mrok;
end
else if key=#27 then tform(sender).modalresult:=mrcancel;
end;
procedure tform1.button2click(sender: tobject);
var
n:integer;
begin
with createmessagedialog(“do you really want to delete
the file?”,mtwarning,[mbyes,mbno]) do
begin
for n:=0 to controlcount-1 do
if (controls[n] is tbutton)
then if tbutton(controls[n]).name=”no” then tbutton
(controls[n]).taborder:=0;
showmodal;
end;
end;
end.


Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*