Sign in Join
Wiki copytemporary

Dialog Examples/ru: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: Dialog Examples/ru

OldNewLine
1+# Несколько полезных диалогов
2+
3+Вот некоторые полезные диалоги, которых нет в [[Component Palette/ru|палитре компонентов]]:
4+
5+- `procedure ShowMessage (const Msg: string);`
6+- `function MessageBox (Text, Caption : PChar; Flags: Word): Integer;`
7+- `function MessageDlg (const Msg: string; AType: TMsgDlgType; AButtons: TMsgDlgButtons; HelpCtx: LongInt): Word;`
8+- `function InputBox (const ACaption, APrompt, ADefault: string); string;`
9+- `function InputQuery (const ACaption, APrompt: string; var Value: string): Boolean;`
10+- `function PasswordBox(const ACaption, APrompt : String) : String;`
11+
12+Каждый из этих компонентов приводит к отображению небольшого всплывающего окна, которое содержит некоторую информацию и требует ответа пользователя: либо нажатия кнопки, либо ввода текста, либо и то и другое. Программист практически не контролирует формат, размер или положение этих всплывающих окон, но может влиять на их текстовое содержимое.
13+
14+Причина, по которой часто существует несколько очень похожих альтернатив, заключается в том, что разные методы могут вызывать компонент и получать данные обратно из процедуры или функции. Эти диалоги могут быть «платформозависимыми», то есть они могут отображаться по-разному. Например, строки, которые полностью отображаются в Windows XP, могут быть усечены в Windows 7.
15+
16+## Диалоги сообщений
17+
18+Диалоги сообщений отображают сообщение и ждут реакции \[пользователя в виде\] нажатия клавиши или щелчка мыши.
19+
20+### ShowMessage
21+
22+``` pascal
23+procedure ShowMessage(const Msg: string);
24+```
25+
26+{ Определено в Dialogs.pp }
27+
28+Простейшее диалоговое окно сообщения: принимает в качестве параметра простую строку, отображает ее в стереотипном поле и ожидает события щелчка мышью или клавиши ввода, прежде чем вернуться к вызывающей [[Routine/ru|подпрограмме]] или [[Program/ru|программе]].
29+
30+Это модальный вызов процедуры, то есть окно отображается, получает фокус и не оставляет фокус, пока не будет нажата кнопка ОК или не выбрано что-либо иное.
31+
32+Пример:
33+
34+``` pascal
35+program LazMessage;
36+uses
37+ Dialogs;
38+begin
39+ ShowMessage('Это сообщение от Lazarus');
40+end.
41+```
42+
43+У вас есть возможность создавать многострочные сообщения, используя следующие разделители строк, все они будут работать:
44+
45+- sLineBreak
46+- LineEnding
47+- или символьный код: \#13#10(Windows)/#10(Linux)/#13(macOS)
48+
49+**Пример из нескольких строк:**
50+
51+``` pascal
52+program LazMessage;
53+uses
54+ Dialogs;
55+begin
56+ ShowMessage('Это - многострочное' + sLineBreak + 'сообщение!' );
57+end.
58+```
59+
60+### MessageBox
61+
62+``` pascal
63+{ Определено в Forms.pp как часть TApplication; следовательно, должно вызываться как Application.Messagebox()
64+или с использованием конструкции 'with Application do ...'}
65+
66+function Application.MessageBox(Text, Caption: PChar; Flags: LongInt): Integer;
67+```
68+
69+Параметры включают
70+
71+- Text: строка, которая отображается как приглашение или инструкция в поле;
72+- Caption: строка заголовка в верхней части окна сообщения;
73+- Flags: longint - целое число, построенное путем сложения различных констант, для определения содержимого и поведения блока, например, MB_ABORTRETRYIGNORE + MR_ICONQUESTION заставит приложение отображать значок запроса (?) в поле с тремя кнопками: ABORT RETRY IGNORE.
74+
75+Функция возвращает целочисленное значение, соответствующее нажатой кнопке; его значение может быть определено с помощью констант\[IDOK..IDHELP\] Она может быть вызвана как вызов процедуры (то есть как оператор 'MessageBox()', а не как вызов функции 'Variable:= MessageBox()' - см. Пример ниже)
76+
77+Пример:
78+
79+``` pascal
80+uses
81+ Forms, Dialogs, LCLType;
82+
83+procedure DisplayMessageBox;
84+var
85+ Reply, BoxStyle: Integer;
86+begin
87+ BoxStyle := MB_ICONQUESTION + MB_YESNO;
88+ Reply := Application.MessageBox('Press either button', 'MessageBoxDemo', BoxStyle);
89+ if Reply = IDYES then Application.MessageBox('Yes ', 'Reply',MB_ICONINFORMATION)
90+ else Application.MessageBox('No ', 'Reply', MB_ICONHAND);
91+end;
92+```
93+
94+Обратите внимание, что в этом примере строки 'Yes' и 'No' были дополнены пробелами; в противном случае поле не будет достаточно широким, чтобы правильно отображать заголовок
95+
96+![](/wiki-images/c/c2/MessageBoxDemo.png) ![](/wiki-images/0/06/ReplyYes.png)
97+
98+### MessageDLG
99+
100+``` pascal
101+function MessageDlg(const aMsg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
102+function MessageDlg(const aCaption, aMsg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
103+```
104+
105+Две версии этой функции, то есть первый параметр 'Caption' является необязательным; если пропущено, заголовок отсутствует в поле
106+
107+Это наиболее полный и продуманный диалог сообщений, который позволяет программисту значительно контролировать внешний вид диалогового окна. Параметры, определяющие тип поля и его значка, являются типами, а не целочисленными константами, и кнопки можно указывать в виде набора в квадратных скобках, например \[mbRetry, mbIgnore, mbAbort, mbCancel\]. Параметр HelpCtx в настоящее время не реализован и должен быть установлен в ноль. Возвращаемое значение из функции - это идентификатор нажатой кнопки, выраженный в виде целого числа (см. определения ниже, \[mrNone..mrAll\]).
108+
109+Пример:
110+
111+``` pascal
112+uses
113+ Forms, Dialogs, LCLType, Controls;
114+
115+procedure TryMessageDlg;
116+begin
117+ if MessageDlg('Question', 'Do you wish to Execute?', mtConfirmation, [mbYes, mbNo, mbIgnore],0) = mrYes
118+ then { выполнить оставшуюся часть программы };
119+end;
120+```
121+
122+<figure>
123+<img src="Question.png" title="Question.png" />
124+<figcaption>Question.png</figcaption>
125+</figure>
126+
127+### QuestionDlg
128+
129+Диалог вопросов позволяет изменять заголовки кнопок и устанавливать кнопки по умолчанию и отмены.
130+
131+Пример:
132+
133+``` pascal
134+ case QuestionDlg ('Caption','Message',mtCustom,[mrYes,'Positive', mrNo, 'Negative', 'IsDefault'],'') of
135+ mrYes: QuestionDlg ('Caption','So you mean „Yes“',mtCustom,[mrOK,'That is right'],'');
136+ mrNo: QuestionDlg ('Caption','Oh, you mean „No“',mtCustom,[mrOK,'Exactly'],'');
137+ mrCancel: QuestionDlg ('Caption','You canceled the dialog with ESC or close button.',mtCustom,[mrOK,'Exactly'],'');
138+ end;
139+```
140+
141+<figure>
142+<img src="QuestionDlg.png" title="QuestionDlg.png" />
143+<figcaption>QuestionDlg.png</figcaption>
144+</figure>
145+
146+> **Note:** Если пользователь отменяет диалог, и кнопка 'IsCancel' не определена, возвращается mrCancel! Если вы хотите перенаправить ESC/закрыть на определенную кнопку, используйте параметр 'IsCancel' сразу после кнопки отмены
147+
148+> **Note:** Использование букв местного алфавита в типе UnicodeString в качестве заголовков кнопок может привести к ошибкам (замечено в V1.6.4).
149+
150+Расширенные примеры для кнопок (из файла promptdialog.inc)
151+
152+``` pascal
153+ [mrOk,mrCancel,'Cancel now',mrIgnore,300,'Do it','IsDefault']
154+```
155+
156+Это приведет к отображению 4 кнопок:
157+
158+- 'Ok' возвращает mrOk
159+- 'Cancel now' возвращает mrCancel
160+- 'Ignore' возвращает mrIgnore
161+- 'Do it' возвращает 300. Это будет кнопка по умолчанию (в фокусе)
162+
163+------------------------------------------------------------------------
164+
165+Прим.переводчика: для Darwin имеет значение порядок указания кнопок диалога. Этот код:
166+
167+``` pascal
168+ QuestionDlg('Caption',
169+ 'Message',
170+ mtInformation,
171+ [mrOK,
172+ mrCancel,
173+ mrYes,
174+ mrNo],
175+ 0);
176+```
177+
178+даст такое расположение кнопок диалога
179+
180+<figure>
181+<img src="scr_084.png" title="scr_084.png" />
182+<figcaption>scr_084.png</figcaption>
183+</figure>
184+
185+а вот эти изменения кода
186+
187+``` pascal
188+ QuestionDlg('Caption',
189+ 'Message',
190+ mtInformation,
191+ [mrCancel,
192+ mrOK,
193+ mrNo,
194+ mrYes],
195+ 0);
196+```
197+
198+поменяют порядок расположения на более привычный
199+
200+<figure>
201+<img src="scr_085.png" title="scr_085.png" />
202+<figcaption>scr_085.png</figcaption>
203+</figure>
204+
205+------------------------------------------------------------------------
206+
207+Обычно кнопки в диалогах Lazarus имеют значки. Для предотвращения отображения значков можно использовать нестандартизированные значения для результатов сообщения. В настоящее время наибольшее стандартизированное значение равно 11. Например:
208+
209+``` pascal
210+ case QuestionDlg ('Caption','Message',mtCustom,[20,'Positive', 21, 'Negative',22,'I do not know','IsCancel'],'') of
211+ 20: QuestionDlg ('Caption','So you mean „Yes“',mtCustom,[20,'That is right'],'');
212+ 21: QuestionDlg ('Caption','Oh, you mean „No“',mtCustom,[21,'Exactly'],'');
213+ 22: QuestionDlg ('Caption','So, please find out!',mtCustom,[22,'Maybe'],'');
214+ end;
215+```
216+
217+Для облегчения работы можно определить константы. Например:
218+
219+``` pascal
220+const
221+ mrNoneNI= 20;
222+ mrOkNI= mrNoneNI+1;
223+ mrCancelNI= mrNoneNI+2;
224+ mrAbortNI= mrNoneNI+3;
225+ mrRetryNI= mrNoneNI+4;
226+ mrIgnoreNI= mrNoneNI+5;
227+ mrYesNI= mrNoneNI+6;
228+ mrNoNI= mrNoneNI+7;
229+ mrAllNI= mrNoneNI+8;
230+ mrYesToAllNI= mrNoneNI+10;
231+ mrCloseNI= mrNoneNI+11;
232+ mrLastNI= mrCloseNI;
233+begin
234+ case QuestionDlg ('Caption','Message',mtCustom,[mrYesNI,'Positive', mrNoNI, 'Negative',mrCancelNI,'I do not know','IsCancel'],'') of
235+ mrYesNI: QuestionDlg ('Caption','So you mean „Yes“',mtCustom,[mrYesNI,'That is right'],'');
236+ mrNoNI: QuestionDlg ('Caption','Oh, you mean „No“',mtCustom,[mrNoNI,'Exactly'],'');
237+ mrCancelNI: QuestionDlg ('Caption','So, please find out!',mtCustom,[mrCancelNI,'Maybe'],'');
238+ end; //case
239+end;
240+```
241+
242+<figure>
243+<img src="QuestionDlgNoButIcons.png" title="QuestionDlgNoButIcons.png" />
244+<figcaption>QuestionDlgNoButIcons.png</figcaption>
245+</figure>
246+
247+------------------------------------------------------------------------
248+
249+Прим.переводчика: Отображение значков на кнопках диалоговых окон зависит от системных настроек. Можно попытаться ими управлять из своего приложения, не меняя глобальных настроек, при помощи свойства [TApplicationShowGlyphs](https://dsiders.gitlab.io/lazdocsnext/lcl/forms/tapplicationshowglyphs.html) компонента [[TApplicationProperties/ru|TApplicationProperties]]. Но, как говорится, "есть нюансы" :)
250+
251+- Windows
252+ - для Win XP отображение значков ***зависит от*** значений этого свойства
253+ - для Win 7 и Win 10 значки ***не отображаются никогда*** вне зависимости от значений этого свойства
254+ - для Win 11 не проверял
255+
256+- Linux (проверялось для Debian GTK2 и Qt5)
257+ - значки ***отображаются всегда*** вне зависимости от значений этого свойства
258+
259+<figure>
260+<img src="scr_086.png" title="scr_086.png" />
261+<figcaption>scr_086.png</figcaption>
262+</figure>
263+
264+<figure>
265+<img src="scr_087.png" title="scr_087.png" />
266+<figcaption>scr_087.png</figcaption>
267+</figure>
268+
269+- Darwin
270+ - отображение значков ***зависит от*** значений этого свойства
271+
272+<figure>
273+<img src="scr_081.png" title="scr_081.png" />
274+<figcaption>scr_081.png</figcaption>
275+</figure>
276+
277+<figure>
278+<img src="scr_082.png" title="scr_082.png" />
279+<figcaption>scr_082.png</figcaption>
280+</figure>
281+
282+<figure>
283+<img src="scr_083.png" title="scr_083.png" />
284+<figcaption>scr_083.png</figcaption>
285+</figure>
286+
287+## Диалоги ввода текста
288+
289+### InputBox
290+
291+Диалоги ввода текста: отображение сообщения и ожидание ввода текста пользователем
292+
293+``` pascal
294+function InputBox(const ACaption, APrompt, ADefault: String): String;
295+```
296+
297+Отображает поле с определенным заголовком и приглашением, и ожидает ввода пользователя в текстовом поле. По умолчанию строка может быть отображена в текстовом поле. Введенная пользователем строка или строка по умолчанию возвращается как результат функции.
298+
299+Пример:
300+
301+``` pascal
302+uses
303+ Forms, LCLType, Dialogs, Controls;
304+
305+procedure TryInputBox;
306+var
307+ UserString: string;
308+begin
309+ UserString := InputBox('Get some text input','Please type in some information', 'Some sample text');
310+ ShowMessage(UserString)
311+end;
312+```
313+
314+### InputQuery
315+
316+``` pascal
317+function InputQuery(const ACaption, APrompt : String; MaskInput : Boolean; var Value : String) : Boolean;
318+function InputQuery(const ACaption, APrompt : String; var Value : String) : Boolean;
319+```
320+
321+Две версии этой функции, которая отображает подсказку и ожидает ввода пользователем текстовых данных; первый включает в себя логический параметр MaskInput, который определяет, маскируется ли пользовательский ввод звездочками в поле ввода текста (например, при вводе пароля), а второй пропускает это свойство. Текст, введенный пользователем, возвращается в переменном параметре 'Value'(Значение); результатом функции является логическое значение, которое возвращает TRUE, если была нажата кнопка OK, или FALSE, если окно было закрыто любым другим механизмом (например, нажатием на значок 'Close'(Закрыть) в верхней строке заголовка). Пропуск параметра MaskInput эквивалентен установке его в значение FALSE.
322+
323+Пример:
324+
325+``` pascal
326+uses
327+ Forms, LCLType, Dialogs, Controls;
328+
329+procedure TryInputQuery;
330+var
331+ QueryResult: Boolean;
332+ UserString: string;
333+begin
334+ if InputQuery('Question', 'Type in some data', TRUE, UserString)
335+ then ShowMessage(UserString)
336+ else
337+ begin
338+ InputQuery('Don''t be silly', 'Please try again', UserString);
339+ ShowMessage(UserString);
340+ end
341+end;
342+```
343+
344+![](/wiki-images/d/d0/MessageDlgQuestion.png) ![](/wiki-images/c/ce/DontBeSillly.png)
345+
346+### PasswordBox
347+
348+``` pascal
349+Function PasswordBox(const ACaption, APrompt : String) : String;
350+```
351+
352+Ведет себя очень похоже на функцию InputQuery с MaskInput = TRUE; разница в том, что введенный пароль возвращается как результат функции (как в InputBox).
353+
354+## Константы и типы, используемые в диалогах сообщений
355+
356+Несколько констант и типов, относящихся к использованию с диалоговыми окнами, предварительно определены в библиотеке LCL:
357+
358+целочисленные константы для определения типов кнопок и иконки для отображения в MessageBox
359+
360+``` pascal
361+const { Defined in LCLType.pp }
362+
363+MB_OK = $00000000;
364+MB_OKCANCEL = $00000001;
365+MB_ABORTRETRYIGNORE = $00000002;
366+MB_YESNOCANCEL = $00000003;
367+MB_YESNO = $00000004;
368+MB_RETRYCANCEL = $00000005;
369+
370+
371+MB_ICONHAND = $00000010;
372+MB_ICONQUESTION = $00000020;
373+MB_ICONEXCLAMATION = $00000030;
374+MB_ICONASTERICK = $00000040;
375+MB_ICONWARNING = MB_ICONEXCLAMATION;
376+MB_ICONERROR = MB_ICONHAND;
377+MB_ICONINFORMATION = MB_ICONASTERICK;
378+```
379+
380+целочисленные константы, определяющие возвращаемое значение из MessageBox в зависимости от того, какая кнопка была нажата
381+
382+``` pascal
383+IDOK = 1; ID_OK = IDOK;
384+IDCANCEL = 2; ID_CANCEL = IDCANCEL;
385+IDABORT = 3; ID_ABORT = IDABORT;
386+IDRETRY = 4; ID_RETRY = IDRETRY;
387+IDIGNORE = 5; ID_IGNORE = IDIGNORE;
388+IDYES = 6; ID_YES = IDYES;
389+IDNO = 7; ID_NO = IDNO;
390+IDCLOSE = 8; ID_CLOSE = IDCLOSE;
391+IDHELP = 9; ID_HELP = IDHELP;
392+```
393+
394+определяет, будет ли первая, вторая или третья кнопка по умолчанию
395+
396+``` pascal
397+MB_DEFBUTTON1 = $00000000;
398+MB_DEFBUTTON2 = $00000100;
399+MB_DEFBUTTON3 = $00000200;
400+MB_DEFBUTTON4 = $00000300;
401+```
402+
403+Параметр Flags MessageBox создается путем добавления константы кнопки \[MB_OK..MB_RETRYCANCEL\], необязательной константы значка \[MB_ICONHAND..MB_ICONINFORMATION\] и необязательной постоянной кнопки по умолчанию \[MB_DEFBUTTON1..MB_DEFBUTTON3\]
404+
405+Типы для использования в MessageDlg, для которого требуются параметры AType TMsgDlgType и AButtons of TMSgDlgButtons
406+
407+``` pascal
408+{ Defined in Dialogs.pp }
409+type
410+ TMsgDlgType = (mtWarning, mtError, mtInformation, mtConfirmation,
411+ mtCustom);
412+ TMsgDlgBtn = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore,
413+ mbAll, mbNoToAll, mbYesToAll, mbHelp, mbClose);
414+ TMsgDlgButtons = set of TMsgDlgBtn;
415+
416+
417+const
418+ mbYesNoCancel = [mbYes, mbNo, mbCancel];
419+ mbOKCancel = [mbOK, mbCancel];
420+ mbAbortRetryIgnore = [mbAbort, mbRetry, mbIgnore];
421+
422+
423+ MsgDlgBtnToBitBtnKind: array[TMsgDlgBtn] of TBitBtnKind = (
424+ bkYes, bkNo, bkOK, bkCancel, bkAbort, bkRetry, bkIgnore,
425+ bkAll, bkNoToAll, bkYesToAll, bkHelp, bkClose
426+ );
427+
428+
429+ BitBtnKindToMsgDlgBtn: array[TBitBtnKind] of TMsgDlgBtn = (
430+ mbOk, mbOK, mbCancel, mbHelp, mbYes, mbNo,
431+ mbClose, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToALl, mbYesToAll
432+ );
433+
434+
435+{ Defined in Controls.pp }
436+const
437+ mrNone = 0;
438+ mrOK = mrNone + 1;
439+ mrCancel = mrNone + 2;
440+ mrAbort = mrNone + 3;
441+ mrRetry = mrNone + 4;
442+ mrIgnore = mrNone + 5;
443+ mrYes = mrNone + 6;
444+ mrNo = mrNone + 7;
445+ mrAll = mrNone + 8;
446+ mrNoToAll = mrNone + 9;
447+ mrYesToAll = mrNone + 10;
448+ mrLast = mrYesToAll;
449+```
450+
451+---
452+*From the Free Pascal wiki, page "Dialog Examples/ru", as it stood on 2022-08-19 after a change by Zoltanleo, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history