Dialog Examples/pl

From Free Pascal wiki
Revision as of 10:19, 17 April 2018 by Slawek (talk | contribs) (dodanie podpisu)
Jump to navigationJump to search

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

Kilka przydatnych okien dialogowych

Oto kilka przydatnych okien dialogowych, których nie znajdziesz w palecie komponentów:

  • 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;

Każdy z tych komponentów powoduje wyświetlenie małego okna dialogowego, które zawiera informacje wymagające reakcji użytkownika: naciśnięcie przycisku, wprowadzenie tekstu lub obydwa razem. Programista ma niewielką kontrolę nad formatem, wielkością lub położeniem tych okien dialogowych, ale może wpływać na ich treść tekstową.
Powodem, dla którego istnieje kilka bardzo podobnych okien dialogowych, jest umożliwienie wywoływania tego komponentu różnymi metodami i odbieranie danych z powrotem do procedury lub funkcji. Te okna dialogowe mogą być zależne od platformy, tzn. mogą być wyświetlane inaczej na różnych systemach operacyjnych. Na przykład teksty, które są w pełni wyświetlane w systemie Windows XP, mogą zostać obcięte w systemie Windows 7.

Dialogi wiadomości

Dialogi wiadomości wyświetlają komunikat i czekają na naciśnięcie jakiegoś klawisza lub na kliknięcie myszą.

ShowMessage

procedure ShowMessage(const Msg: string);

{ Zdefiniowany jest w pliku Dialogs.pp }

Najprostsze okno dialogowe wiadomości: pobiera prosty ciąg znaków jako parametr, wyświetla go w stereotypowym oknie i czeka na naciśnięcie klawisza myszy lub klawisza Enter, po czym powraca do programu wywołującego lub programu.
Jest to modalne wywołanie procedury, to znaczy, że okno jest wyświetlane, otrzymuje fokus i utrzymuje aktywność, dopóki nie zostanie kliknięte pole OK lub nie zostanie wybrana inna opcja.

Przykład:

program LazMessage;
uses 
  Dialogs;
begin
  ShowMessage('To jest wiadomość od Lazarusa');
end.

Masz też możliwość tworzenia komunikatów w wielu wierszach tekstu za pomocą następujących separatorów linii, wszystkie one będą działać:

  • sLineBreak
  • LineEnding
  • lub za pomocą sekwencji kodów: #13#10

Przykład użycia dialogu z wieloma wierszami tekstu:

program LazMessage;
uses 
  Dialogs;
begin
  ShowMessage('To jest wielowierszowy' + sLineBreak + 'komunikat!' );
end.

MessageBox

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

{ Zdefiniowany jest w pliku Forms.pp jako część TApplication; w związku z tym musi być wywoływana jako Application.Messagebox () lub przy użyciu konstrukcji with Application do ...' }

Opis parametrów

  • Text: ciąg znaków, który jest wyświetlany jako monit lub instrukcja w ramce;
  • Caption: etykieta tekstowa występująca u góry okna, jako tytuł okna dialogowego;
  • Flags: longint - liczba całkowita, na którą składa się kilka różnych stałych w celu zdefiniowania zawartości i zachowania okna dialogowego, na przykład MB_ABORTRETRYIGNORE + MR_ICONQUESTION spowodują, że aplikacja wyświetli ikonę znaku zapytania (?) w oknie z trzema przyciskami: ABORT RETRY IGNORE.

Funkcja ta zwraca też wartość całkowitą odpowiadającą przyciskowi, który został naciśnięty; jej znaczenie można określić przez porównanie do stałych [IDOK..IDHELP]

Można go wywołać jak wywołanie procedury (np. jako instrukcję "MessageBox()", albo lepiej jako wywołanie funkcji "Variable := MessageBox()" - patrz przykład poniżej)

Przykład:

uses 
  Forms, Dialogs, LCLType;
 
procedure DisplayMessageBox;
var 
  Reply, BoxStyle: Integer;
begin
  BoxStyle := MB_ICONQUESTION + MB_YESNO;
  Reply := Application.MessageBox('Naciśnij wybrany przycisk', 'MessageBoxDemo', BoxStyle);
  if Reply = IDYES then Application.MessageBox('Yes       ', 'Odpowiedź',MB_ICONINFORMATION)
    else Application.MessageBox('No         ', 'Odpowiedź', MB_ICONHAND);
end;

Zauważ, że w tym przykładzie łańcuchy "Tak" i "Nie" zostały sztucznie uzupełnione spacjami; w przeciwnym razie skrzynka nie będzie wystarczająco szeroka, aby prawidłowo wyświetlić napis

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;

Istnieją dwie wersje tej funkcji, gdzie pierwszy parametr 'Caption', jest opcjonalny; jeśli pominięto, w polu brakuje tego napisu

Jest to najbardziej kompletny i rozbudowany dialog komunikatów i umożliwia programistom znaczną kontrolę nad wyglądem okna dialogowego. Parametry określające rodzaj pola i jego ikony są określonego typu, a nie liczbami całkowitymi, a przyciski można określić jako zbiór w nawiasach kwadratowych, np. [MbRetry, mbIgnore, mbAbort, mbCancel]. Parametr HelpCtx nie jest obecnie zaimplementowany i powinien być ustawiony na zero. Wartość zwracana przez funkcję odpowiada naciśniętemu przyciskowi wyrażona jako liczba całkowita (patrz definicje poniżej, [mrNone..mrAll]).

Przykład:

uses 
  Forms, Dialogs, LCLType, Controls;
 
procedure TryMessageDlg;
begin
  if MessageDlg('Pytanie', 'Czy chcesz wykonać?', mtConfirmation, 
   [mbYes, mbNo, mbIgnore],0) = mrYes
  then { Wykonaj dalszą częś programu };
end;
Question.png


QuestionDlg

Okno dialogowe pytania umożliwia zmianę napisów przycisków oraz ustawienie przycisków domyślnych i anulowania. Przykład:

    case QuestionDlg ('Nagłówek','Wiadomość',mtCustom,[mrYes,'Pozytywny', mrNo, 'Negatywny', 'IsDefault'],'') of
        mrYes: QuestionDlg ('Nagłówek','Masz na myśli „Tak“',mtCustom,[mrOK,'To prawda'],'');
        mrNo:  QuestionDlg ('Nagłówek','Och, masz na myśli „Nie“',mtCustom,[mrOK,'Dokładnie'],'');
        mrCancel: QuestionDlg ('Nagłówek','Anulowałeś dialog za pomocą ESC lub przycisku zamykania.',mtCustom,[mrOK,'Zgadza się'],'');
    end;
QuestionDlg.png

Template:Uwaga Template:Uwaga

Zaawansowane przykłady użycia przycisków (z promptdialog.inc)

    [mrOk,mrCancel,'Anuluj teraz',mrIgnore,300,'Zrób to','IsDefault']

Ten przykład pokazuje 4 przyciski:

  • 'Ok' zwraca mrOk
  • 'Anuluj teraz' zwraca mrCancel
  • 'Ignore' zwraca mrIgnore
  • 'Zrób to' zwraca liczbę 300. To będzie domyślny przycisk (aktywny)

Zwykle przyciski w oknach dialogowych lazarusa mają ikony. Aby zapobiec wyświetlaniu ikon, można użyć niestandardowych wartości dla wyników wiadomości. Obecnie najwyższa ustandaryzowana wartość to 11. Na przykład:

  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;

Aby ułatwić pracę, można zdefiniować stałe. Na przykład:

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

Dialogi do wprowadzania tekstu

InputBox

Dialogi do wprowadzania tekstu: wyświetlają wiadomość i oczekują na wprowadzanie tekstu przez użytkownika

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

Wyświetla okno dialogowe z określonym tytułem oraz podpowiedzią i oczekuje, że użytkownik wprowadzi dane w polu tekstowym. Domyślny ciąg może być opcjonalnie wyświetlany w polu tekstowym. Jako wynik funkcji zwracany jest ciąg znaków wprowadzony przez użytkownika lub ciąg domyślny.

Przykład:

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;

Istnieją dwie wersje tej funkcji, która wyświetla monit i oczekuje wprowadzenia danych tekstowych przez użytkownika; pierwsza zawiera parametr MaskInput typu boolean, który określa, czy dane wejściowe użytkownika są maskowane gwiazdkami w polu wprowadzania tekstu (np. podczas wpisywania hasła), podczas gdy drugie pomija tę właściwość. Tekst wprowadzony przez użytkownika jest zwracany w parametrze zmiennym "Wartość"; wynik funkcji jest wartością logiczną, która zwraca wartość TRUE, jeśli został naciśnięty przycisk OK, lub FALSE, jeśli pole zostało zamknięte w inny sposób (taki jak kliknięcie ikony "Zamknij" na górnym pasku tytułu). Pominięcie parametru MaskInput jest równoznaczne z ustawieniem FALSE.

Przykład:

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;

Zachowuje się bardzo podobnie do funkcji InputQuery z MaskInput = TRUE; różnica polega na tym, że hasło, które zostało wpisane, jest zwracane w wyniku działania funkcji (tak jak InputBox).

Stałe i typy używane w oknach dialogowych

Kilka stałych i typów istotnych do użycia w oknach dialogowych jest wstępnie zdefiniowanych w bibliotece LCL:

const { Zdefiniowane w LCLType.pp }

stałe całkowitoliczbowe do definiowania typów przycisków i ikon do wyświetlania w MessageBox

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;

stałe całkowitoliczbowe określające wartość zwracaną z MessageBox zgodnie z naciśniętym przyciskiem

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;

Określa, czy pierwszy, drugi czy trzeci przycisk jest domyślny

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

Parametr Flags MessageBox jest konstruowany przez dodanie stałej przycisku [MB_OK..MB_RETRYCANCEL], opcjonalna stała ikony [MB_ICONHAND..MB_ICONINFORMATION] i opcjonalna stała przycisku domyślnego [MB_DEFBUTTON1..MB_DEFBUTTON3]

Typy używane w MessageDlg, które wymagają parametrów AType TMsgDlgType i 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
    );
 
 
{ Zdefiniowane w 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;

--Sławomir Załęcki (talk) 11:19, 17 April 2018 (CEST)