Sign in Join
Wiki copytemporary

Dialog Examples/ru: what changed

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

OldNewLine
11# Несколько полезных диалогов
22
33Вот некоторые полезные диалоги, которых нет в [[Component Palette/ru|палитре компонентов]]:
44
55- `procedure ShowMessage (const Msg: string);`
66- `function MessageBox (Text, Caption : PChar; Flags: Word): Integer;`
77- `function MessageDlg (const Msg: string; AType: TMsgDlgType; AButtons: TMsgDlgButtons; HelpCtx: LongInt): Word;`
88- `function InputBox (const ACaption, APrompt, ADefault: string); string;`
99- `function InputQuery (const ACaption, APrompt: string; var Value: string): Boolean;`
1010- `function PasswordBox(const ACaption, APrompt : String) : String;`
1111
1212Каждый из этих компонентов приводит к отображению небольшого всплывающего окна, которое содержит некоторую информацию и требует ответа пользователя: либо нажатия кнопки, либо ввода текста, либо и то и другое. Программист практически не контролирует формат, размер или положение этих всплывающих окон, но может влиять на их текстовое содержимое.
1313
1414Причина, по которой часто существует несколько очень похожих альтернатив, заключается в том, что разные методы могут вызывать компонент и получать данные обратно из процедуры или функции. Эти диалоги могут быть «платформозависимыми», то есть они могут отображаться по-разному. Например, строки, которые полностью отображаются в Windows XP, могут быть усечены в Windows 7.
1515
1616## Диалоги сообщений
1717
1818Диалоги сообщений отображают сообщение и ждут реакции \[пользователя в виде\] нажатия клавиши или щелчка мыши.
1919
2020### ShowMessage
2121
2222``` pascal
2323procedure ShowMessage(const Msg: string);
2424```
2525
2626{ Определено в Dialogs.pp }
2727
2828Простейшее диалоговое окно сообщения: принимает в качестве параметра простую строку, отображает ее в стереотипном поле и ожидает события щелчка мышью или клавиши ввода, прежде чем вернуться к вызывающей [[Routine/ru|подпрограмме]] или [[Program/ru|программе]].
2929
3030Это модальный вызов процедуры, то есть окно отображается, получает фокус и не оставляет фокус, пока не будет нажата кнопка ОК или не выбрано что-либо иное.
3131
3232Пример:
3333
3434``` pascal
3535program LazMessage;
3636uses
3737 Dialogs;
3838begin
3939 ShowMessage('Это сообщение от Lazarus');
4040end.
4141```
4242
4343У вас есть возможность создавать многострочные сообщения, используя следующие разделители строк, все они будут работать:
4444
4545- sLineBreak
4646- LineEnding
4747- или символьный код: \#13#10(Windows)/#10(Linux)/#13(macOS)
4848
4949**Пример из нескольких строк:**
5050
5151``` pascal
5252program LazMessage;
5353uses
5454 Dialogs;
5555begin
5656 ShowMessage('Это - многострочное' + sLineBreak + 'сообщение!' );
5757end.
5858```
5959
6060### MessageBox
6161
6262``` pascal
6363{ Определено в Forms.pp как часть TApplication; следовательно, должно вызываться как Application.Messagebox()
6464или с использованием конструкции 'with Application do ...'}
6565
6666function Application.MessageBox(Text, Caption: PChar; Flags: LongInt): Integer;
6767```
6868
6969Параметры включают
7070
7171- Text: строка, которая отображается как приглашение или инструкция в поле;
7272- Caption: строка заголовка в верхней части окна сообщения;
7373- Flags: longint - целое число, построенное путем сложения различных констант, для определения содержимого и поведения блока, например, MB_ABORTRETRYIGNORE + MR_ICONQUESTION заставит приложение отображать значок запроса (?) в поле с тремя кнопками: ABORT RETRY IGNORE.
7474
7575Функция возвращает целочисленное значение, соответствующее нажатой кнопке; его значение может быть определено с помощью констант\[IDOK..IDHELP\] Она может быть вызвана как вызов процедуры (то есть как оператор 'MessageBox()', а не как вызов функции 'Variable:= MessageBox()' - см. Пример ниже)
7676
7777Пример:
7878
7979``` pascal
8080uses
8181 Forms, Dialogs, LCLType;
8282
8383procedure DisplayMessageBox;
8484var
8585 Reply, BoxStyle: Integer;
8686begin
8787 BoxStyle := MB_ICONQUESTION + MB_YESNO;
8888 Reply := Application.MessageBox('Press either button', 'MessageBoxDemo', BoxStyle);
8989 if Reply = IDYES then Application.MessageBox('Yes ', 'Reply',MB_ICONINFORMATION)
9090 else Application.MessageBox('No ', 'Reply', MB_ICONHAND);
9191end;
9292```
9393
9494Обратите внимание, что в этом примере строки 'Yes' и 'No' были дополнены пробелами; в противном случае поле не будет достаточно широким, чтобы правильно отображать заголовок
9595
9696![](/wiki-images/c/c2/MessageBoxDemo.png) ![](/wiki-images/0/06/ReplyYes.png)
9797
9898### MessageDLG
9999
100100``` pascal
101101function MessageDlg(const aMsg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
102102function MessageDlg(const aCaption, aMsg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
103103```
104104
105105Две версии этой функции, то есть первый параметр 'Caption' является необязательным; если пропущено, заголовок отсутствует в поле
106106
107107Это наиболее полный и продуманный диалог сообщений, который позволяет программисту значительно контролировать внешний вид диалогового окна. Параметры, определяющие тип поля и его значка, являются типами, а не целочисленными константами, и кнопки можно указывать в виде набора в квадратных скобках, например \[mbRetry, mbIgnore, mbAbort, mbCancel\]. Параметр HelpCtx в настоящее время не реализован и должен быть установлен в ноль. Возвращаемое значение из функции - это идентификатор нажатой кнопки, выраженный в виде целого числа (см. определения ниже, \[mrNone..mrAll\]).
108108
109109Пример:
110110
111111``` pascal
112112uses
113113 Forms, Dialogs, LCLType, Controls;
114114
115115procedure TryMessageDlg;
116116begin
117117 if MessageDlg('Question', 'Do you wish to Execute?', mtConfirmation, [mbYes, mbNo, mbIgnore],0) = mrYes
118118 then { выполнить оставшуюся часть программы };
119119end;
120120```
121121
122-<figure>
123-<img src="Question.png" title="Question.png" />
124-<figcaption>Question.png</figcaption>
125-</figure>
122+![](/wiki-images/3/30/Question.png)
126123
127124### QuestionDlg
128125
129126Диалог вопросов позволяет изменять заголовки кнопок и устанавливать кнопки по умолчанию и отмены.
130127
131128Пример:
132129
133130``` pascal
134131 case QuestionDlg ('Caption','Message',mtCustom,[mrYes,'Positive', mrNo, 'Negative', 'IsDefault'],'') of
135132 mrYes: QuestionDlg ('Caption','So you mean „Yes“',mtCustom,[mrOK,'That is right'],'');
136133 mrNo: QuestionDlg ('Caption','Oh, you mean „No“',mtCustom,[mrOK,'Exactly'],'');
137134 mrCancel: QuestionDlg ('Caption','You canceled the dialog with ESC or close button.',mtCustom,[mrOK,'Exactly'],'');
138135 end;
139136```
140137
141-<figure>
142-<img src="QuestionDlg.png" title="QuestionDlg.png" />
143-<figcaption>QuestionDlg.png</figcaption>
144-</figure>
138+![](/wiki-images/a/ac/QuestionDlg.png)
145139
146140> **Note:** Если пользователь отменяет диалог, и кнопка 'IsCancel' не определена, возвращается mrCancel! Если вы хотите перенаправить ESC/закрыть на определенную кнопку, используйте параметр 'IsCancel' сразу после кнопки отмены
147141
148142> **Note:** Использование букв местного алфавита в типе UnicodeString в качестве заголовков кнопок может привести к ошибкам (замечено в V1.6.4).
149143
150144Расширенные примеры для кнопок (из файла promptdialog.inc)
151145
152146``` pascal
153147 [mrOk,mrCancel,'Cancel now',mrIgnore,300,'Do it','IsDefault']
154148```
155149
156150Это приведет к отображению 4 кнопок:
157151
158152- 'Ok' возвращает mrOk
159153- 'Cancel now' возвращает mrCancel
160154- 'Ignore' возвращает mrIgnore
161155- 'Do it' возвращает 300. Это будет кнопка по умолчанию (в фокусе)
162156
163157------------------------------------------------------------------------
164158
165159Прим.переводчика: для Darwin имеет значение порядок указания кнопок диалога. Этот код:
166160
167161``` pascal
168162 QuestionDlg('Caption',
169163 'Message',
170164 mtInformation,
171165 [mrOK,
172166 mrCancel,
173167 mrYes,
174168 mrNo],
175169 0);
176170```
177171
178172даст такое расположение кнопок диалога
179173
180-<figure>
181-<img src="scr_084.png" title="scr_084.png" />
182-<figcaption>scr_084.png</figcaption>
183-</figure>
174+![](/wiki-images/e/e6/Scr_084.png)
184175
185176а вот эти изменения кода
186177
187178``` pascal
188179 QuestionDlg('Caption',
189180 'Message',
190181 mtInformation,
191182 [mrCancel,
192183 mrOK,
193184 mrNo,
194185 mrYes],
195186 0);
196187```
197188
198189поменяют порядок расположения на более привычный
199190
200-<figure>
201-<img src="scr_085.png" title="scr_085.png" />
202-<figcaption>scr_085.png</figcaption>
203-</figure>
191+![](/wiki-images/b/b4/Scr_085.png)
204192
205193------------------------------------------------------------------------
206194
207195Обычно кнопки в диалогах Lazarus имеют значки. Для предотвращения отображения значков можно использовать нестандартизированные значения для результатов сообщения. В настоящее время наибольшее стандартизированное значение равно 11. Например:
208196
209197``` pascal
210198 case QuestionDlg ('Caption','Message',mtCustom,[20,'Positive', 21, 'Negative',22,'I do not know','IsCancel'],'') of
211199 20: QuestionDlg ('Caption','So you mean „Yes“',mtCustom,[20,'That is right'],'');
212200 21: QuestionDlg ('Caption','Oh, you mean „No“',mtCustom,[21,'Exactly'],'');
213201 22: QuestionDlg ('Caption','So, please find out!',mtCustom,[22,'Maybe'],'');
214202 end;
215203```
216204
217205Для облегчения работы можно определить константы. Например:
218206
219207``` pascal
220208const
221209 mrNoneNI= 20;
222210 mrOkNI= mrNoneNI+1;
223211 mrCancelNI= mrNoneNI+2;
224212 mrAbortNI= mrNoneNI+3;
225213 mrRetryNI= mrNoneNI+4;
226214 mrIgnoreNI= mrNoneNI+5;
227215 mrYesNI= mrNoneNI+6;
228216 mrNoNI= mrNoneNI+7;
229217 mrAllNI= mrNoneNI+8;
230218 mrYesToAllNI= mrNoneNI+10;
231219 mrCloseNI= mrNoneNI+11;
232220 mrLastNI= mrCloseNI;
233221begin
234222 case QuestionDlg ('Caption','Message',mtCustom,[mrYesNI,'Positive', mrNoNI, 'Negative',mrCancelNI,'I do not know','IsCancel'],'') of
235223 mrYesNI: QuestionDlg ('Caption','So you mean „Yes“',mtCustom,[mrYesNI,'That is right'],'');
236224 mrNoNI: QuestionDlg ('Caption','Oh, you mean „No“',mtCustom,[mrNoNI,'Exactly'],'');
237225 mrCancelNI: QuestionDlg ('Caption','So, please find out!',mtCustom,[mrCancelNI,'Maybe'],'');
238226 end; //case
239227end;
240228```
241229
242-<figure>
243-<img src="QuestionDlgNoButIcons.png" title="QuestionDlgNoButIcons.png" />
244-<figcaption>QuestionDlgNoButIcons.png</figcaption>
245-</figure>
230+![](/wiki-images/1/15/QuestionDlgNoButIcons.png)
246231
247232------------------------------------------------------------------------
248233
249234Прим.переводчика: Отображение значков на кнопках диалоговых окон зависит от системных настроек. Можно попытаться ими управлять из своего приложения, не меняя глобальных настроек, при помощи свойства [TApplicationShowGlyphs](https://dsiders.gitlab.io/lazdocsnext/lcl/forms/tapplicationshowglyphs.html) компонента [[TApplicationProperties/ru|TApplicationProperties]]. Но, как говорится, "есть нюансы" :)
250235
251236- Windows
252237 - для Win XP отображение значков ***зависит от*** значений этого свойства
253238 - для Win 7 и Win 10 значки ***не отображаются никогда*** вне зависимости от значений этого свойства
254239 - для Win 11 не проверял
255240
256241- Linux (проверялось для Debian GTK2 и Qt5)
257242 - значки ***отображаются всегда*** вне зависимости от значений этого свойства
258243
259-<figure>
260-<img src="scr_086.png" title="scr_086.png" />
261-<figcaption>scr_086.png</figcaption>
262-</figure>
244+![](/wiki-images/9/90/Scr_086.png)
263245
264-<figure>
265-<img src="scr_087.png" title="scr_087.png" />
266-<figcaption>scr_087.png</figcaption>
267-</figure>
246+![](/wiki-images/d/d4/Scr_087.png)
268247
269248- Darwin
270249 - отображение значков ***зависит от*** значений этого свойства
271250
272-<figure>
273-<img src="scr_081.png" title="scr_081.png" />
274-<figcaption>scr_081.png</figcaption>
275-</figure>
251+![](/wiki-images/c/c3/Scr_081.png)
276252
277-<figure>
278-<img src="scr_082.png" title="scr_082.png" />
279-<figcaption>scr_082.png</figcaption>
280-</figure>
253+![](/wiki-images/6/64/Scr_082.png)
281254
282-<figure>
283-<img src="scr_083.png" title="scr_083.png" />
284-<figcaption>scr_083.png</figcaption>
285-</figure>
255+![](/wiki-images/5/5f/Scr_083.png)
286256
287257## Диалоги ввода текста
288258
289259### InputBox
290260
291261Диалоги ввода текста: отображение сообщения и ожидание ввода текста пользователем
292262
293263``` pascal
294264function InputBox(const ACaption, APrompt, ADefault: String): String;
295265```
296266
297267Отображает поле с определенным заголовком и приглашением, и ожидает ввода пользователя в текстовом поле. По умолчанию строка может быть отображена в текстовом поле. Введенная пользователем строка или строка по умолчанию возвращается как результат функции.
298268
299269Пример:
300270
301271``` pascal
302272uses
303273 Forms, LCLType, Dialogs, Controls;
304274
305275procedure TryInputBox;
306276var
307277 UserString: string;
308278begin
309279 UserString := InputBox('Get some text input','Please type in some information', 'Some sample text');
310280 ShowMessage(UserString)
311281end;
312282```
313283
314284### InputQuery
315285
316286``` pascal
317287function InputQuery(const ACaption, APrompt : String; MaskInput : Boolean; var Value : String) : Boolean;
318288function InputQuery(const ACaption, APrompt : String; var Value : String) : Boolean;
319289```
320290
321291Две версии этой функции, которая отображает подсказку и ожидает ввода пользователем текстовых данных; первый включает в себя логический параметр MaskInput, который определяет, маскируется ли пользовательский ввод звездочками в поле ввода текста (например, при вводе пароля), а второй пропускает это свойство. Текст, введенный пользователем, возвращается в переменном параметре 'Value'(Значение); результатом функции является логическое значение, которое возвращает TRUE, если была нажата кнопка OK, или FALSE, если окно было закрыто любым другим механизмом (например, нажатием на значок 'Close'(Закрыть) в верхней строке заголовка). Пропуск параметра MaskInput эквивалентен установке его в значение FALSE.
322292
323293Пример:
324294
325295``` pascal
326296uses
327297 Forms, LCLType, Dialogs, Controls;
328298
329299procedure TryInputQuery;
330300var
331301 QueryResult: Boolean;
332302 UserString: string;
333303begin
334304 if InputQuery('Question', 'Type in some data', TRUE, UserString)
335305 then ShowMessage(UserString)
336306 else
337307 begin
338308 InputQuery('Don''t be silly', 'Please try again', UserString);
339309 ShowMessage(UserString);
340310 end
341311end;
342312```
343313
344314![](/wiki-images/d/d0/MessageDlgQuestion.png) ![](/wiki-images/c/ce/DontBeSillly.png)
345315
346316### PasswordBox
347317
348318``` pascal
349319Function PasswordBox(const ACaption, APrompt : String) : String;
350320```
351321
352322Ведет себя очень похоже на функцию InputQuery с MaskInput = TRUE; разница в том, что введенный пароль возвращается как результат функции (как в InputBox).
353323
354324## Константы и типы, используемые в диалогах сообщений
355325
356326Несколько констант и типов, относящихся к использованию с диалоговыми окнами, предварительно определены в библиотеке LCL:
357327
358328целочисленные константы для определения типов кнопок и иконки для отображения в MessageBox
359329
360330``` pascal
361331const { Defined in LCLType.pp }
362332
363333MB_OK = $00000000;
364334MB_OKCANCEL = $00000001;
365335MB_ABORTRETRYIGNORE = $00000002;
366336MB_YESNOCANCEL = $00000003;
367337MB_YESNO = $00000004;
368338MB_RETRYCANCEL = $00000005;
369339
370340
371341MB_ICONHAND = $00000010;
372342MB_ICONQUESTION = $00000020;
373343MB_ICONEXCLAMATION = $00000030;
374344MB_ICONASTERICK = $00000040;
375345MB_ICONWARNING = MB_ICONEXCLAMATION;
376346MB_ICONERROR = MB_ICONHAND;
377347MB_ICONINFORMATION = MB_ICONASTERICK;
378348```
379349
380350целочисленные константы, определяющие возвращаемое значение из MessageBox в зависимости от того, какая кнопка была нажата
381351
382352``` pascal
383353IDOK = 1; ID_OK = IDOK;
384354IDCANCEL = 2; ID_CANCEL = IDCANCEL;
385355IDABORT = 3; ID_ABORT = IDABORT;
386356IDRETRY = 4; ID_RETRY = IDRETRY;
387357IDIGNORE = 5; ID_IGNORE = IDIGNORE;
388358IDYES = 6; ID_YES = IDYES;
389359IDNO = 7; ID_NO = IDNO;
390360IDCLOSE = 8; ID_CLOSE = IDCLOSE;
391361IDHELP = 9; ID_HELP = IDHELP;
392362```
393363
394364определяет, будет ли первая, вторая или третья кнопка по умолчанию
395365
396366``` pascal
397367MB_DEFBUTTON1 = $00000000;
398368MB_DEFBUTTON2 = $00000100;
399369MB_DEFBUTTON3 = $00000200;
400370MB_DEFBUTTON4 = $00000300;
401371```
402372
403373Параметр Flags MessageBox создается путем добавления константы кнопки \[MB_OK..MB_RETRYCANCEL\], необязательной константы значка \[MB_ICONHAND..MB_ICONINFORMATION\] и необязательной постоянной кнопки по умолчанию \[MB_DEFBUTTON1..MB_DEFBUTTON3\]
404374
405375Типы для использования в MessageDlg, для которого требуются параметры AType TMsgDlgType и AButtons of TMSgDlgButtons
406376
407377``` pascal
408378{ Defined in Dialogs.pp }
409379type
410380 TMsgDlgType = (mtWarning, mtError, mtInformation, mtConfirmation,
411381 mtCustom);
412382 TMsgDlgBtn = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore,
413383 mbAll, mbNoToAll, mbYesToAll, mbHelp, mbClose);
414384 TMsgDlgButtons = set of TMsgDlgBtn;
415385
416386
417387const
418388 mbYesNoCancel = [mbYes, mbNo, mbCancel];
419389 mbOKCancel = [mbOK, mbCancel];
420390 mbAbortRetryIgnore = [mbAbort, mbRetry, mbIgnore];
421391
422392
423393 MsgDlgBtnToBitBtnKind: array[TMsgDlgBtn] of TBitBtnKind = (
424394 bkYes, bkNo, bkOK, bkCancel, bkAbort, bkRetry, bkIgnore,
425395 bkAll, bkNoToAll, bkYesToAll, bkHelp, bkClose
426396 );
427397
428398
429399 BitBtnKindToMsgDlgBtn: array[TBitBtnKind] of TMsgDlgBtn = (
430400 mbOk, mbOK, mbCancel, mbHelp, mbYes, mbNo,
431401 mbClose, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToALl, mbYesToAll
432402 );
433403
434404
435405{ Defined in Controls.pp }
436406const
437407 mrNone = 0;
438408 mrOK = mrNone + 1;
439409 mrCancel = mrNone + 2;
440410 mrAbort = mrNone + 3;
441411 mrRetry = mrNone + 4;
442412 mrIgnore = mrNone + 5;
443413 mrYes = mrNone + 6;
444414 mrNo = mrNone + 7;
445415 mrAll = mrNone + 8;
446416 mrNoToAll = mrNone + 9;
447417 mrYesToAll = mrNone + 10;
448418 mrLast = mrYesToAll;
449419```
450420
451421---
452422*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