Difference between revisions of "Dialog Examples/ru"

From Lazarus wiki
Jump to navigationJump to search
 
(12 intermediate revisions by 3 users not shown)
Line 2: Line 2:
  
 
= Несколько полезных диалогов=
 
= Несколько полезных диалогов=
Вот некоторые полезные диалоги, которых нет в палитре компонентов:
+
Вот некоторые полезные диалоги, которых нет в [[Component Palette/ru|палитре компонентов]]:
  
* procedure ShowMessage (const Msg: string);
+
* <syntaxhighlight lang="pascal" inline>procedure ShowMessage (const Msg: string);</syntaxhighlight>
* function MessageBox (Text, Caption : PChar; Flags: Word): Integer;
+
* <syntaxhighlight lang="pascal" inline>function MessageBox (Text, Caption : PChar; Flags: Word): Integer;</syntaxhighlight>
* function MessageDlg (const Msg: string; AType: TMsgDlgType; AButtons: TMsgDlgButtons; HelpCtx: LongInt): Word;
+
* <syntaxhighlight lang="pascal" inline>function MessageDlg (const Msg: string; AType: TMsgDlgType; AButtons: TMsgDlgButtons; HelpCtx: LongInt): Word;</syntaxhighlight>
* function InputBox (const ACaption, APrompt, ADefault: string); string;
+
* <syntaxhighlight lang="pascal" inline>function InputBox (const ACaption, APrompt, ADefault: string); string;</syntaxhighlight>
* function InputQuery (const ACaption, APrompt: string; var Value: string): Boolean;
+
* <syntaxhighlight lang="pascal" inline>function InputQuery (const ACaption, APrompt: string; var Value: string): Boolean;</syntaxhighlight>
* function PasswordBox(const ACaption, APrompt : String) : String;
+
* <syntaxhighlight lang="pascal" inline>function PasswordBox(const ACaption, APrompt : String) : String;</syntaxhighlight>
  
 
Каждый из этих компонентов приводит к отображению небольшого всплывающего окна, которое содержит некоторую информацию и требует ответа пользователя: либо нажатия кнопки, либо ввода текста, либо и то и другое. Программист практически не контролирует формат, размер или положение этих всплывающих окон, но может влиять на их текстовое содержимое.
 
Каждый из этих компонентов приводит к отображению небольшого всплывающего окна, которое содержит некоторую информацию и требует ответа пользователя: либо нажатия кнопки, либо ввода текста, либо и то и другое. Программист практически не контролирует формат, размер или положение этих всплывающих окон, но может влиять на их текстовое содержимое.
Line 20: Line 20:
  
 
===ShowMessage===
 
===ShowMessage===
<syntaxhighlight>{ Определено в Dialogs.pp }
+
<syntaxhighlight lang="pascal">
 
procedure ShowMessage(const Msg: string);</syntaxhighlight>
 
procedure ShowMessage(const Msg: string);</syntaxhighlight>
+
{ Определено в Dialogs.pp }
Простейшее диалоговое окно сообщения: принимает в качестве параметра простую строку, отображает ее в стереотипном поле и ожидает события щелчка мышью или клавиши ввода, прежде чем вернуться к вызывающей подпрограмме или программе.  
+
 
 +
Простейшее диалоговое окно сообщения: принимает в качестве параметра простую строку, отображает ее в стереотипном поле и ожидает события щелчка мышью или клавиши ввода, прежде чем вернуться к вызывающей [[Routine/ru|подпрограмме]] или [[Program/ru|программе]].  
  
 
Это модальный вызов процедуры, то есть окно отображается, получает фокус и не оставляет фокус, пока не будет нажата кнопка ОК или не выбрано что-либо иное.
 
Это модальный вызов процедуры, то есть окно отображается, получает фокус и не оставляет фокус, пока не будет нажата кнопка ОК или не выбрано что-либо иное.
Line 29: Line 30:
 
Пример:
 
Пример:
  
<syntaxhighlight>program LazMessage;
+
<syntaxhighlight lang="pascal">program LazMessage;
 
uses  
 
uses  
 
   Dialogs;
 
   Dialogs;
Line 39: Line 40:
 
*sLineBreak
 
*sLineBreak
 
*LineEnding
 
*LineEnding
*или код символьный код: #13#10
+
*или символьный код: #13#10(Windows)/#10(Linux)/#13(macOS)
  
 
'''Пример из нескольких строк:'''
 
'''Пример из нескольких строк:'''
  
<syntaxhighlight>program LazMessage;
+
<syntaxhighlight lang="pascal">program LazMessage;
 
uses  
 
uses  
 
   Dialogs;
 
   Dialogs;
Line 51: Line 52:
  
 
===MessageBox===
 
===MessageBox===
<syntaxhighlight>function Application.MessageBox(Text, Caption: PChar; Flags: LongInt): Integer;</syntaxhighlight>
+
<syntaxhighlight lang="pascal">{ Определено в Forms.pp как часть TApplication; следовательно, должно вызываться как Application.Messagebox()  
 +
или с использованием конструкции 'with Application do ...'}
  
{ Defined in Forms.pp as part of TApplication; hence must be called as Application.Messagebox () or using the 'with Application do ...' construct }
+
function Application.MessageBox(Text, Caption: PChar; Flags: LongInt): Integer;</syntaxhighlight>
  
Parameters include
+
Параметры включают
  
* Text: the string that is displayed as a prompt or instruction in the Box;
+
* Text: строка, которая отображается как приглашение или инструкция в поле;
* Caption: the string label at the top of the message box;
+
* Caption: строка заголовка в верхней части окна сообщения;
* Flags: longint - an integer constructed by adding together various constants to define the contents and behaviour of the box, for example MB_ABORTRETRYIGNORE + MR_ICONQUESTION will cause the application to display a query (?) icon in a box with three buttons: ABORT RETRY IGNORE.
+
* Flags: longint - целое число, построенное путем сложения различных констант, для определения содержимого и поведения блока, например, MB_ABORTRETRYIGNORE + MR_ICONQUESTION заставит приложение отображать значок запроса (?) в поле с тремя кнопками: ABORT RETRY IGNORE.
  
The function returns an integer value corresponding to the button that was pressed; its value can be determined by reference to the constants [IDOK..IDHELP]
+
Функция возвращает целочисленное значение, соответствующее нажатой кнопке; его значение может быть определено с помощью констант[IDOK..IDHELP]
 +
Она может быть вызвана как вызов процедуры (то есть как оператор 'MessageBox()', а не как вызов функции 'Variable:= MessageBox()' - см. Пример ниже)
  
It can be invoked like a procedure call (ie as a 'MessageBox()' statement rather than as a 'Variable := MessageBox()' function call - see example below)
+
Пример:
 
 
Example:
 
  
<syntaxhighlight>uses  
+
<syntaxhighlight lang="pascal">uses  
 
   Forms, Dialogs, LCLType;
 
   Forms, Dialogs, LCLType;
 
   
 
   
Line 80: Line 81:
 
end;</syntaxhighlight>
 
end;</syntaxhighlight>
  
Notice that in this example the 'Yes' and 'No' strings have been padded out with spaces; otherwise the box would not be wide enough to display the caption properly
+
Обратите внимание, что в этом примере строки 'Yes' и 'No' были дополнены пробелами; в противном случае поле не будет достаточно широким, чтобы правильно отображать заголовок
  
<center> [[image:MessageBoxDemo.png]]  [[image:ReplyYes.png]]
+
[[image:MessageBoxDemo.png|bottom]]   
</center>
+
[[image:ReplyYes.png|bottom]]
  
 
===MessageDLG===
 
===MessageDLG===
  
<syntaxhighlight>function MessageDlg(const aMsg: string; DlgType: TMsgDlgType;  
+
<syntaxhighlight lang="pascal">function MessageDlg(const aMsg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
  Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
+
function MessageDlg(const aCaption, aMsg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;</syntaxhighlight>
function MessageDlg(const aCaption, aMsg: string; DlgType: TMsgDlgType;  
 
  Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;</syntaxhighlight>
 
  
Two versions of this function, ie first 'Caption' parameter is optional; if omitted, caption is missing from box
+
Две версии этой функции, то есть первый параметр 'Caption' является необязательным; если пропущено, заголовок отсутствует в поле
  
This is the most complete and elaborate of the message dialogs, and allows the programmer considerable control over the appearance of the dialog box.
+
Это наиболее полный и продуманный диалог сообщений, который позволяет программисту значительно контролировать внешний вид диалогового окна.
The parameters defining the kind of box and its icon are types rather than integer constants, and the buttons can be specified as a set in square brackets eg [mbRetry, mbIgnore, mbAbort, mbCancel].
+
Параметры, определяющие тип поля и его значка, являются типами, а не целочисленными константами, и кнопки можно указывать в виде набора в квадратных скобках, например [mbRetry, mbIgnore, mbAbort, mbCancel].
The HelpCtx parameter is not currently implemented and should be set to zero.
+
Параметр HelpCtx в настоящее время не реализован и должен быть установлен в ноль.
The return value from the Function is the identity of the button pressed, expressed as an integer (see the definitions below, [mrNone..mrAll]).
+
Возвращаемое значение из функции - это идентификатор нажатой кнопки, выраженный в виде целого числа (см. определения ниже, [mrNone..mrAll]).
  
Example:
+
Пример:
  
<syntaxhighlight>uses  
+
<syntaxhighlight lang="pascal">uses  
 
   Forms, Dialogs, LCLType, Controls;
 
   Forms, Dialogs, LCLType, Controls;
 
   
 
   
 
procedure TryMessageDlg;
 
procedure TryMessageDlg;
 
begin
 
begin
   if MessageDlg('Question', 'Do you wish to Execute?', mtConfirmation,  
+
   if MessageDlg('Question', 'Do you wish to Execute?', mtConfirmation, [mbYes, mbNo, mbIgnore],0) = mrYes
  [mbYes, mbNo, mbIgnore],0) = mrYes
+
   then { выполнить оставшуюся часть программы };
   then { Execute rest of Program };
 
 
end;</syntaxhighlight>
 
end;</syntaxhighlight>
  
<center> [[image:Question.png]]  
+
[[image:Question.png|bottom]]
</center>
 
  
 +
=== QuestionDlg ===
 +
Диалог вопросов позволяет изменять заголовки кнопок и устанавливать кнопки по умолчанию и отмены.
  
=== QuestionDlg ===
+
Пример:
Question dialog allows changing button captions and setting default and cancel buttons.
+
<syntaxhighlight lang="pascal">
Example:
 
<syntaxhighlight>
 
 
     case QuestionDlg ('Caption','Message',mtCustom,[mrYes,'Positive', mrNo, 'Negative', 'IsDefault'],'') of
 
     case QuestionDlg ('Caption','Message',mtCustom,[mrYes,'Positive', mrNo, 'Negative', 'IsDefault'],'') of
 
         mrYes: QuestionDlg ('Caption','So you mean „Yes“',mtCustom,[mrOK,'That is right'],'');
 
         mrYes: QuestionDlg ('Caption','So you mean „Yes“',mtCustom,[mrOK,'That is right'],'');
Line 125: Line 122:
 
     end;  
 
     end;  
 
</syntaxhighlight>
 
</syntaxhighlight>
<center> [[image:QuestionDlg.png]]
 
</center>
 
  
{{Note|If the user cancels the dialog and there is no 'IsCancel' button defined, mrCancel is returned! If you want to redirect ESC/close to a defined button use the 'IsCancel' parameter just after the cancel button.}}
+
[[image:QuestionDlg.png|bottom]]
{{Note|Using letters of the local alphabet in UnicodeString type as button captions may raise errors (found in v1.6.4).}}
+
 
 +
{{Note|Если пользователь отменяет диалог, и кнопка 'IsCancel' не определена, возвращается mrCancel! Если вы хотите перенаправить ESC/закрыть на определенную кнопку, используйте параметр 'IsCancel' сразу после кнопки отмены}}
 +
{{Note|Использование букв местного алфавита в типе UnicodeString в качестве заголовков кнопок может привести к ошибкам (замечено в V1.6.4).}}
  
Advanced examples for buttons (from promptdialog.inc)
+
Расширенные примеры для кнопок  (из файла promptdialog.inc)
<syntaxhighlight>
+
<syntaxhighlight lang="pascal">
 
     [mrOk,mrCancel,'Cancel now',mrIgnore,300,'Do it','IsDefault']
 
     [mrOk,mrCancel,'Cancel now',mrIgnore,300,'Do it','IsDefault']
 
</syntaxhighlight>
 
</syntaxhighlight>
This will result in 4 buttons:
+
Это приведет к отображению 4 кнопок:
* 'Ok' returning mrOk
+
* 'Ok' возвращает mrOk
* 'Cancel now' returning mrCancel
+
* 'Cancel now' возвращает mrCancel
* 'Ignore' returning mrIgnore
+
* 'Ignore' возвращает mrIgnore
* 'Do it' returning 300. This will be the default button (focused)
+
* 'Do it' возвращает 300. Это будет кнопка по умолчанию (в фокусе)
 +
 
 +
----
 +
[[user:zoltanleo|Прим.переводчика:]] для Darwin имеет значение порядок указания кнопок диалога. Этот код:
 +
<syntaxhighlight lang="pascal">
 +
  QuestionDlg('Caption',
 +
              'Message',
 +
              mtInformation,
 +
              [mrOK,
 +
              mrCancel,
 +
              mrYes,
 +
              mrNo],
 +
              0);
 +
</syntaxhighlight>
 +
 
 +
даст такое расположение кнопок диалога
 +
 
 +
[[File:scr_084.png]]
 +
 
 +
а вот эти изменения кода
 +
<syntaxhighlight lang="pascal">
 +
  QuestionDlg('Caption',
 +
              'Message',
 +
              mtInformation,
 +
              [mrCancel,
 +
              mrOK,
 +
              mrNo,
 +
              mrYes],
 +
              0);
 +
</syntaxhighlight>
 +
 
 +
поменяют порядок расположения на более привычный
 +
 
 +
[[File:scr_085.png]]
 +
----
  
Usually buttons in Lazarus dialogs have icons. In order to prevent icons from being shown non standardize values for message results can be used. Currently highest standardized value is 11. For example:
+
Обычно кнопки в диалогах Lazarus имеют значки. Для предотвращения отображения значков можно использовать нестандартизированные значения для результатов сообщения. В настоящее время наибольшее стандартизированное значение равно 11. Например:
  
<syntaxhighlight>
+
<syntaxhighlight lang="pascal">
 
   case QuestionDlg ('Caption','Message',mtCustom,[20,'Positive', 21, 'Negative',22,'I do not know','IsCancel'],'') of
 
   case QuestionDlg ('Caption','Message',mtCustom,[20,'Positive', 21, 'Negative',22,'I do not know','IsCancel'],'') of
 
     20: QuestionDlg ('Caption','So you mean „Yes“',mtCustom,[20,'That is right'],'');
 
     20: QuestionDlg ('Caption','So you mean „Yes“',mtCustom,[20,'That is right'],'');
Line 150: Line 181:
 
   end;
 
   end;
 
</syntaxhighlight>
 
</syntaxhighlight>
In order to facilitate work, constants can be defined. For example:
 
  
<syntaxhighlight>
+
Для облегчения работы можно определить константы. Например:
 +
<syntaxhighlight lang="pascal">
 
const
 
const
 
   mrNoneNI=      20;
 
   mrNoneNI=      20;
Line 174: Line 205:
 
end;
 
end;
 
</syntaxhighlight>
 
</syntaxhighlight>
<center> [[File:QuestionDlgNoButIcons.png]] </center>
+
[[File:QuestionDlgNoButIcons.png|bottom]]
 +
 
 +
----
 +
[[user:zoltanleo|Прим.переводчика:]] Отображение значков на кнопках диалоговых окон зависит от системных настроек. Можно попытаться ими управлять из своего приложения, не меняя глобальных настроек, при помощи свойства [https://dsiders.gitlab.io/lazdocsnext/lcl/forms/tapplicationshowglyphs.html TApplicationShowGlyphs] компонента [[TApplicationProperties/ru|TApplicationProperties]]. Но, как говорится, "есть нюансы" :)
 +
* Windows
 +
** для Win XP отображение значков '''''зависит от''''' значений этого свойства
 +
** для Win 7 и Win 10 значки '''''не отображаются никогда''''' вне зависимости от значений этого свойства
 +
** для Win 11  не проверял
 +
 
 +
* Linux (проверялось для Debian GTK2 и Qt5)
 +
** значки '''''отображаются всегда''''' вне зависимости от значений этого свойства
 +
 
 +
[[File:scr_086.png]]
 +
 
 +
[[File:scr_087.png]]
 +
 
 +
* Darwin
 +
** отображение значков '''''зависит от''''' значений этого свойства
 +
 
 +
[[File:scr_081.png]]
 +
 
 +
[[File:scr_082.png]]
 +
 
 +
[[File:scr_083.png]]
  
== Text input Dialogs==
+
== Диалоги ввода текста ==
  
 
===InputBox===
 
===InputBox===
Text input Dialogs: display a message and await user text input
+
Диалоги ввода текста: отображение сообщения и ожидание ввода текста пользователем
  
<syntaxhighlight>function InputBox(const ACaption, APrompt, ADefault: String): String;</syntaxhighlight>
+
<syntaxhighlight lang="pascal">function InputBox(const ACaption, APrompt, ADefault: String): String;</syntaxhighlight>
  
Displays a box with defined title and prompt, and expects user input in a text box. A default string can optionally be displayed in the text box. The user-entered or default string is returned as the function result.
+
Отображает поле с определенным заголовком и приглашением, и ожидает ввода пользователя в текстовом поле. По умолчанию строка может быть отображена в текстовом поле. Введенная пользователем строка или строка по умолчанию возвращается как результат функции.
  
Example:
+
Пример:
  
<syntaxhighlight>uses  
+
<syntaxhighlight lang="pascal">uses  
 
   Forms, LCLType, Dialogs, Controls;
 
   Forms, LCLType, Dialogs, Controls;
 
   
 
   
Line 194: Line 248:
 
   UserString: string;
 
   UserString: string;
 
begin
 
begin
   UserString := InputBox('Get some text input',  
+
   UserString := InputBox('Get some text input','Please type in some information', 'Some sample text');
    'Please type in some information', 'Some sample text');
 
 
   ShowMessage(UserString)
 
   ShowMessage(UserString)
 
end;</syntaxhighlight>
 
end;</syntaxhighlight>
  
 
===InputQuery===
 
===InputQuery===
<syntaxhighlight>function InputQuery(const ACaption, APrompt : String;
+
<syntaxhighlight lang="pascal">function InputQuery(const ACaption, APrompt : String; MaskInput : Boolean; var Value : String) : Boolean;
  MaskInput : Boolean; var Value : String) : Boolean;
+
function InputQuery(const ACaption, APrompt : String; var Value : String) : Boolean;</syntaxhighlight>
function InputQuery(const ACaption, APrompt : String;
 
  var Value : String) : Boolean;</syntaxhighlight>
 
  
Two versions of this function which displays a prompt and expects user input of textual data; the first includes a MaskInput boolean parameter which determines whether the user input is masked out by asterisks in the text-input box (like during entry of a password), while the second omits this property. The text entered by the user is returned in the variable parameter 'Value'; the function result is a boolean which returns TRUE if the OK button was pressed, or FALSE if the box was closed by any other mechanism (such as clicking the 'Close' icon on the top title bar). Omitting the MaskInput parameter is equivalent to setting it FALSE.
+
Две версии этой функции, которая отображает подсказку и ожидает ввода пользователем текстовых данных; первый включает в себя логический параметр MaskInput, который определяет, маскируется ли пользовательский ввод звездочками в поле ввода текста (например, при вводе пароля), а второй пропускает это свойство. Текст, введенный пользователем, возвращается в переменном параметре 'Value'(Значение); результатом функции является логическое значение, которое возвращает TRUE, если была нажата кнопка OK, или FALSE, если окно было закрыто любым другим механизмом (например, нажатием на значок 'Close'(Закрыть) в верхней строке заголовка). Пропуск параметра MaskInput эквивалентен установке его в значение FALSE.
  
Example:
+
Пример:
  
<syntaxhighlight>uses  
+
<syntaxhighlight lang="pascal">uses  
 
   Forms, LCLType, Dialogs, Controls;
 
   Forms, LCLType, Dialogs, Controls;
 
   
 
   
Line 226: Line 277:
 
end;</syntaxhighlight>
 
end;</syntaxhighlight>
  
<center> [[image:MessageDlgQuestion.png]]  </center>
+
[[image:MessageDlgQuestion.png|bottom]]   
 +
[[image:DontBeSillly.png|bottom]]
  
<center> [[image:DontBeSillly.png]] </center>
+
===PasswordBox===
 +
<syntaxhighlight lang="pascal">Function PasswordBox(const ACaption, APrompt : String) : String;</syntaxhighlight>
  
===PasswordBox===
+
Ведет себя очень похоже на функцию InputQuery с MaskInput = TRUE; разница в том, что введенный пароль возвращается как результат функции (как в InputBox).
<syntaxhighlight>Function PasswordBox(const ACaption, APrompt : String) : String;</syntaxhighlight>
 
  
Behaves very similarly to the InputQuery function with MaskInput = TRUE; the difference is that the password that was typed in is returned as the result of the function (like InputBox).
+
==Константы и типы, используемые в диалогах сообщений==
  
==Constants and Types used in message dialogs==
+
Несколько констант и типов, относящихся к использованию с диалоговыми окнами, предварительно определены в библиотеке LCL:
  
Several constants and types relevant for use with the dialog boxes are pre-defined in the LCL library:
+
целочисленные константы для определения типов кнопок и иконки для отображения в MessageBox
  
 +
<syntaxhighlight lang="pascal">
 
const { Defined in LCLType.pp }
 
const { Defined in LCLType.pp }
  
integer constants for defining the types of buttons
+
MB_OK = $00000000;
and the icon for display in MessageBox
 
 
 
<syntaxhighlight>MB_OK = $00000000;
 
 
MB_OKCANCEL = $00000001;
 
MB_OKCANCEL = $00000001;
 
MB_ABORTRETRYIGNORE = $00000002;
 
MB_ABORTRETRYIGNORE = $00000002;
Line 260: Line 310:
 
MB_ICONINFORMATION = MB_ICONASTERICK;</syntaxhighlight>
 
MB_ICONINFORMATION = MB_ICONASTERICK;</syntaxhighlight>
  
integer constants defining the return value from MessageBox according to which button was pressed
+
целочисленные константы, определяющие возвращаемое значение из MessageBox в зависимости от того, какая кнопка была нажата
  
<syntaxhighlight>IDOK = 1; ID_OK = IDOK;
+
<syntaxhighlight lang="pascal">
 +
IDOK = 1; ID_OK = IDOK;
 
IDCANCEL = 2; ID_CANCEL = IDCANCEL;
 
IDCANCEL = 2; ID_CANCEL = IDCANCEL;
 
IDABORT = 3; ID_ABORT = IDABORT;
 
IDABORT = 3; ID_ABORT = IDABORT;
Line 272: Line 323:
 
IDHELP = 9; ID_HELP = IDHELP;</syntaxhighlight>
 
IDHELP = 9; ID_HELP = IDHELP;</syntaxhighlight>
  
define whether first, second or third button is default
+
определяет, будет ли первая, вторая или третья кнопка по умолчанию
  
<syntaxhighlight>MB_DEFBUTTON1 = $00000000;
+
<syntaxhighlight lang="pascal">
 +
MB_DEFBUTTON1 = $00000000;
 
MB_DEFBUTTON2 = $00000100;
 
MB_DEFBUTTON2 = $00000100;
 
MB_DEFBUTTON3 = $00000200;
 
MB_DEFBUTTON3 = $00000200;
 
MB_DEFBUTTON4 = $00000300;</syntaxhighlight>
 
MB_DEFBUTTON4 = $00000300;</syntaxhighlight>
  
The Flags parameter of MessageBox is constructed by adding a button constant [MB_OK..MB_RETRYCANCEL],
+
Параметр Flags MessageBox создается путем добавления константы кнопки [MB_OK..MB_RETRYCANCEL], необязательной константы значка [MB_ICONHAND..MB_ICONINFORMATION] и необязательной постоянной кнопки по умолчанию [MB_DEFBUTTON1..MB_DEFBUTTON3]
an optional icon constant [MB_ICONHAND..MB_ICONINFORMATION]
 
and an optional default button constant [MB_DEFBUTTON1..MB_DEFBUTTON3]
 
 
 
Types for use in MessageDlg, which needs parameters
 
AType of TMsgDlgType and AButtons of TMSgDlgButtons
 
 
 
  
<syntaxhighlight>{ Defined in Dialogs.pp }
+
Типы для использования в MessageDlg, для которого требуются параметры AType TMsgDlgType и AButtons of TMSgDlgButtons
 +
<syntaxhighlight lang="pascal">
 +
{ Defined in Dialogs.pp }
 
type
 
type
 
   TMsgDlgType    = (mtWarning, mtError, mtInformation,  mtConfirmation,
 
   TMsgDlgType    = (mtWarning, mtError, mtInformation,  mtConfirmation,

Latest revision as of 21:42, 19 August 2022

Deutsch (de) English (en) español (es) suomi (fi) français (fr) 日本語 (ja) polski (pl) русский (ru) slovenčina (sk) 中文(中国大陆)‎ (zh_CN)

Несколько полезных диалогов

Вот некоторые полезные диалоги, которых нет в палитре компонентов:

  • procedure ShowMessage (const Msg: string);
  • function MessageBox (Text, Caption : PChar; Flags: Word): Integer;
  • function MessageDlg (const Msg: string; AType: TMsgDlgType; AButtons: TMsgDlgButtons; HelpCtx: LongInt): Word;
  • function InputBox (const ACaption, APrompt, ADefault: string); string;
  • function InputQuery (const ACaption, APrompt: string; var Value: string): Boolean;
  • function PasswordBox(const ACaption, APrompt : String) : String;

Каждый из этих компонентов приводит к отображению небольшого всплывающего окна, которое содержит некоторую информацию и требует ответа пользователя: либо нажатия кнопки, либо ввода текста, либо и то и другое. Программист практически не контролирует формат, размер или положение этих всплывающих окон, но может влиять на их текстовое содержимое.

Причина, по которой часто существует несколько очень похожих альтернатив, заключается в том, что разные методы могут вызывать компонент и получать данные обратно из процедуры или функции. Эти диалоги могут быть «платформозависимыми», то есть они могут отображаться по-разному. Например, строки, которые полностью отображаются в Windows XP, могут быть усечены в Windows 7.

Диалоги сообщений

Диалоги сообщений отображают сообщение и ждут реакции [пользователя в виде] нажатия клавиши или щелчка мыши.

ShowMessage

procedure ShowMessage(const Msg: string);

{ Определено в Dialogs.pp }

Простейшее диалоговое окно сообщения: принимает в качестве параметра простую строку, отображает ее в стереотипном поле и ожидает события щелчка мышью или клавиши ввода, прежде чем вернуться к вызывающей подпрограмме или программе.

Это модальный вызов процедуры, то есть окно отображается, получает фокус и не оставляет фокус, пока не будет нажата кнопка ОК или не выбрано что-либо иное.

Пример:

program LazMessage;
uses 
  Dialogs;
begin
  ShowMessage('Это сообщение от Lazarus');
end.

У вас есть возможность создавать многострочные сообщения, используя следующие разделители строк, все они будут работать:

  • sLineBreak
  • LineEnding
  • или символьный код: #13#10(Windows)/#10(Linux)/#13(macOS)

Пример из нескольких строк:

program LazMessage;
uses 
  Dialogs;
begin
  ShowMessage('Это - многострочное' + sLineBreak + 'сообщение!' );
end.

MessageBox

{ Определено в Forms.pp как часть TApplication; следовательно, должно вызываться как Application.Messagebox() 
или с использованием конструкции 'with Application do ...'}

function Application.MessageBox(Text, Caption: PChar; Flags: LongInt): Integer;

Параметры включают

  • Text: строка, которая отображается как приглашение или инструкция в поле;
  • Caption: строка заголовка в верхней части окна сообщения;
  • Flags: longint - целое число, построенное путем сложения различных констант, для определения содержимого и поведения блока, например, MB_ABORTRETRYIGNORE + MR_ICONQUESTION заставит приложение отображать значок запроса (?) в поле с тремя кнопками: ABORT RETRY IGNORE.

Функция возвращает целочисленное значение, соответствующее нажатой кнопке; его значение может быть определено с помощью констант[IDOK..IDHELP] Она может быть вызвана как вызов процедуры (то есть как оператор 'MessageBox()', а не как вызов функции 'Variable:= MessageBox()' - см. Пример ниже)

Пример:

uses 
  Forms, Dialogs, LCLType;
 
procedure DisplayMessageBox;
var 
  Reply, BoxStyle: Integer;
begin
  BoxStyle := MB_ICONQUESTION + MB_YESNO;
  Reply := Application.MessageBox('Press either button', 'MessageBoxDemo', BoxStyle);
  if Reply = IDYES then Application.MessageBox('Yes       ', 'Reply',MB_ICONINFORMATION)
    else Application.MessageBox('No         ', 'Reply', MB_ICONHAND);
end;

Обратите внимание, что в этом примере строки 'Yes' и 'No' были дополнены пробелами; в противном случае поле не будет достаточно широким, чтобы правильно отображать заголовок

MessageBoxDemo.png ReplyYes.png

MessageDLG

function MessageDlg(const aMsg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
function MessageDlg(const aCaption, aMsg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;

Две версии этой функции, то есть первый параметр 'Caption' является необязательным; если пропущено, заголовок отсутствует в поле

Это наиболее полный и продуманный диалог сообщений, который позволяет программисту значительно контролировать внешний вид диалогового окна. Параметры, определяющие тип поля и его значка, являются типами, а не целочисленными константами, и кнопки можно указывать в виде набора в квадратных скобках, например [mbRetry, mbIgnore, mbAbort, mbCancel]. Параметр HelpCtx в настоящее время не реализован и должен быть установлен в ноль. Возвращаемое значение из функции - это идентификатор нажатой кнопки, выраженный в виде целого числа (см. определения ниже, [mrNone..mrAll]).

Пример:

uses 
  Forms, Dialogs, LCLType, Controls;
 
procedure TryMessageDlg;
begin
  if MessageDlg('Question', 'Do you wish to Execute?', mtConfirmation, [mbYes, mbNo, mbIgnore],0) = mrYes
  then { выполнить оставшуюся часть программы };
end;

Question.png

QuestionDlg

Диалог вопросов позволяет изменять заголовки кнопок и устанавливать кнопки по умолчанию и отмены.

Пример:

    case QuestionDlg ('Caption','Message',mtCustom,[mrYes,'Positive', mrNo, 'Negative', 'IsDefault'],'') of
        mrYes: QuestionDlg ('Caption','So you mean „Yes“',mtCustom,[mrOK,'That is right'],'');
        mrNo:  QuestionDlg ('Caption','Oh, you mean „No“',mtCustom,[mrOK,'Exactly'],'');
        mrCancel: QuestionDlg ('Caption','You canceled the dialog with ESC or close button.',mtCustom,[mrOK,'Exactly'],'');
    end;

QuestionDlg.png

Light bulb  Примечание: Если пользователь отменяет диалог, и кнопка 'IsCancel' не определена, возвращается mrCancel! Если вы хотите перенаправить ESC/закрыть на определенную кнопку, используйте параметр 'IsCancel' сразу после кнопки отмены
Light bulb  Примечание: Использование букв местного алфавита в типе UnicodeString в качестве заголовков кнопок может привести к ошибкам (замечено в V1.6.4).

Расширенные примеры для кнопок (из файла promptdialog.inc)

    [mrOk,mrCancel,'Cancel now',mrIgnore,300,'Do it','IsDefault']

Это приведет к отображению 4 кнопок:

  • 'Ok' возвращает mrOk
  • 'Cancel now' возвращает mrCancel
  • 'Ignore' возвращает mrIgnore
  • 'Do it' возвращает 300. Это будет кнопка по умолчанию (в фокусе)

Прим.переводчика: для Darwin имеет значение порядок указания кнопок диалога. Этот код:

  QuestionDlg('Caption',
              'Message',
              mtInformation,
              [mrOK,
              mrCancel,
              mrYes,
              mrNo],
              0);

даст такое расположение кнопок диалога

scr 084.png

а вот эти изменения кода

  QuestionDlg('Caption',
              'Message',
              mtInformation,
              [mrCancel,
              mrOK,
              mrNo,
              mrYes],
              0);

поменяют порядок расположения на более привычный

scr 085.png


Обычно кнопки в диалогах Lazarus имеют значки. Для предотвращения отображения значков можно использовать нестандартизированные значения для результатов сообщения. В настоящее время наибольшее стандартизированное значение равно 11. Например:

  case QuestionDlg ('Caption','Message',mtCustom,[20,'Positive', 21, 'Negative',22,'I do not know','IsCancel'],'') of
     20: QuestionDlg ('Caption','So you mean „Yes“',mtCustom,[20,'That is right'],'');
     21:  QuestionDlg ('Caption','Oh, you mean „No“',mtCustom,[21,'Exactly'],'');
     22:  QuestionDlg ('Caption','So, please find out!',mtCustom,[22,'Maybe'],'');
  end;

Для облегчения работы можно определить константы. Например:

const
  mrNoneNI=      20;
  mrOkNI=        mrNoneNI+1;
  mrCancelNI=    mrNoneNI+2;
  mrAbortNI=     mrNoneNI+3;
  mrRetryNI=     mrNoneNI+4;
  mrIgnoreNI=    mrNoneNI+5;
  mrYesNI=       mrNoneNI+6;
  mrNoNI=        mrNoneNI+7;
  mrAllNI=       mrNoneNI+8;
  mrYesToAllNI=  mrNoneNI+10;
  mrCloseNI=     mrNoneNI+11;
  mrLastNI=      mrCloseNI; 
begin
  case QuestionDlg ('Caption','Message',mtCustom,[mrYesNI,'Positive', mrNoNI, 'Negative',mrCancelNI,'I do not know','IsCancel'],'') of
    mrYesNI: QuestionDlg ('Caption','So you mean „Yes“',mtCustom,[mrYesNI,'That is right'],'');
    mrNoNI:  QuestionDlg ('Caption','Oh, you mean „No“',mtCustom,[mrNoNI,'Exactly'],'');
    mrCancelNI:  QuestionDlg ('Caption','So, please find out!',mtCustom,[mrCancelNI,'Maybe'],'');
  end; //case
end;

QuestionDlgNoButIcons.png


Прим.переводчика: Отображение значков на кнопках диалоговых окон зависит от системных настроек. Можно попытаться ими управлять из своего приложения, не меняя глобальных настроек, при помощи свойства TApplicationShowGlyphs компонента TApplicationProperties. Но, как говорится, "есть нюансы" :)

  • Windows
    • для Win XP отображение значков зависит от значений этого свойства
    • для Win 7 и Win 10 значки не отображаются никогда вне зависимости от значений этого свойства
    • для Win 11 не проверял
  • Linux (проверялось для Debian GTK2 и Qt5)
    • значки отображаются всегда вне зависимости от значений этого свойства

scr 086.png

scr 087.png

  • Darwin
    • отображение значков зависит от значений этого свойства

scr 081.png

scr 082.png

scr 083.png

Диалоги ввода текста

InputBox

Диалоги ввода текста: отображение сообщения и ожидание ввода текста пользователем

function InputBox(const ACaption, APrompt, ADefault: String): String;

Отображает поле с определенным заголовком и приглашением, и ожидает ввода пользователя в текстовом поле. По умолчанию строка может быть отображена в текстовом поле. Введенная пользователем строка или строка по умолчанию возвращается как результат функции.

Пример:

uses 
  Forms, LCLType, Dialogs, Controls;
 
procedure TryInputBox;
var 
  UserString: string;
begin
  UserString := InputBox('Get some text input','Please type in some information', 'Some sample text');
  ShowMessage(UserString)
end;

InputQuery

function InputQuery(const ACaption, APrompt : String; MaskInput : Boolean; var Value : String) : Boolean;
function InputQuery(const ACaption, APrompt : String; var Value : String) : Boolean;

Две версии этой функции, которая отображает подсказку и ожидает ввода пользователем текстовых данных; первый включает в себя логический параметр MaskInput, который определяет, маскируется ли пользовательский ввод звездочками в поле ввода текста (например, при вводе пароля), а второй пропускает это свойство. Текст, введенный пользователем, возвращается в переменном параметре 'Value'(Значение); результатом функции является логическое значение, которое возвращает TRUE, если была нажата кнопка OK, или FALSE, если окно было закрыто любым другим механизмом (например, нажатием на значок 'Close'(Закрыть) в верхней строке заголовка). Пропуск параметра MaskInput эквивалентен установке его в значение FALSE.

Пример:

uses 
  Forms, LCLType, Dialogs, Controls;
 
procedure TryInputQuery;
var 
  QueryResult: Boolean;
  UserString: string;
begin
  if InputQuery('Question', 'Type in some data', TRUE, UserString)
  then ShowMessage(UserString)
  else 
  begin
    InputQuery('Don''t be silly', 'Please try again', UserString);
    ShowMessage(UserString);
  end
end;

MessageDlgQuestion.png DontBeSillly.png

PasswordBox

Function PasswordBox(const ACaption, APrompt : String) : String;

Ведет себя очень похоже на функцию InputQuery с MaskInput = TRUE; разница в том, что введенный пароль возвращается как результат функции (как в InputBox).

Константы и типы, используемые в диалогах сообщений

Несколько констант и типов, относящихся к использованию с диалоговыми окнами, предварительно определены в библиотеке LCL:

целочисленные константы для определения типов кнопок и иконки для отображения в MessageBox

const { Defined in LCLType.pp }

MB_OK = $00000000;
MB_OKCANCEL = $00000001;
MB_ABORTRETRYIGNORE = $00000002;
MB_YESNOCANCEL = $00000003;
MB_YESNO = $00000004;
MB_RETRYCANCEL = $00000005;

 
MB_ICONHAND = $00000010;
MB_ICONQUESTION = $00000020;
MB_ICONEXCLAMATION = $00000030;
MB_ICONASTERICK = $00000040;
MB_ICONWARNING = MB_ICONEXCLAMATION;
MB_ICONERROR = MB_ICONHAND;
MB_ICONINFORMATION = MB_ICONASTERICK;

целочисленные константы, определяющие возвращаемое значение из MessageBox в зависимости от того, какая кнопка была нажата

IDOK = 1; 	ID_OK = IDOK;
IDCANCEL = 2;	ID_CANCEL = IDCANCEL;
IDABORT = 3;	ID_ABORT = IDABORT;
IDRETRY = 4;	ID_RETRY = IDRETRY;
IDIGNORE = 5;	ID_IGNORE = IDIGNORE;
IDYES = 6;	ID_YES = IDYES;
IDNO = 7;	ID_NO = IDNO;
IDCLOSE = 8;	ID_CLOSE = IDCLOSE;
IDHELP = 9;	ID_HELP = IDHELP;

определяет, будет ли первая, вторая или третья кнопка по умолчанию

MB_DEFBUTTON1 = $00000000;
MB_DEFBUTTON2 = $00000100;
MB_DEFBUTTON3 = $00000200;
MB_DEFBUTTON4 = $00000300;

Параметр Flags MessageBox создается путем добавления константы кнопки [MB_OK..MB_RETRYCANCEL], необязательной константы значка [MB_ICONHAND..MB_ICONINFORMATION] и необязательной постоянной кнопки по умолчанию [MB_DEFBUTTON1..MB_DEFBUTTON3]

Типы для использования в MessageDlg, для которого требуются параметры AType TMsgDlgType и AButtons of TMSgDlgButtons

{ Defined in Dialogs.pp }
type
  TMsgDlgType    = (mtWarning, mtError, mtInformation,  mtConfirmation,
                    mtCustom);
  TMsgDlgBtn     = (mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore,
                   mbAll, mbNoToAll, mbYesToAll, mbHelp, mbClose);
  TMsgDlgButtons = set of TMsgDlgBtn;
  
 
const
  mbYesNoCancel = [mbYes, mbNo, mbCancel];
  mbOKCancel = [mbOK, mbCancel];
  mbAbortRetryIgnore = [mbAbort, mbRetry, mbIgnore];
  
 
  MsgDlgBtnToBitBtnKind: array[TMsgDlgBtn] of TBitBtnKind = (
   bkYes, bkNo, bkOK, bkCancel, bkAbort, bkRetry, bkIgnore,
    bkAll, bkNoToAll, bkYesToAll, bkHelp, bkClose
   );
 
 
  BitBtnKindToMsgDlgBtn: array[TBitBtnKind] of TMsgDlgBtn = (
    mbOk, mbOK, mbCancel, mbHelp, mbYes, mbNo,
    mbClose, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToALl, mbYesToAll
    );
 
 
{ Defined in Controls.pp }
const
  mrNone = 0;
  mrOK = mrNone + 1;
  mrCancel = mrNone + 2;
  mrAbort = mrNone + 3;
  mrRetry = mrNone + 4;
  mrIgnore = mrNone + 5;
  mrYes = mrNone + 6;
  mrNo = mrNone + 7;
  mrAll = mrNone + 8;
  mrNoToAll = mrNone + 9;
  mrYesToAll = mrNone + 10;
  mrLast = mrYesToAll;