MessageDlg

Mammoth
MessageDlg
Moduł: Dialogs
```delphi function MessageDlg(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: LongInt): Word; ``` Funkcja `MessageDlg` służy do wyświetlania komunikatów na środku ekranu monitora. Jest ona bardzo podobna do funkcji [[WinAPI/MessageBox]]. Obydwie służą do komunikacji użytkownik ? program. Różnica jest taka, że `MessageBox` daje większe możliwości redagowania komunikatów, podczas gdy przy pomocy `MessageDlg` mamy ograniczoną swobodę ich tworzenia. `MessageDlg` nie jest również składnikiem [[WinAPI]]. Z tego powodu używa się w niej typowych dla Delphi typów danych. By móc uzyć `MessageDlg` w programie, powinieneś dodać [[Delphi/Moduły/Dialogs]] do sekcji [[Delphi/uses]].

Objaśnienie definicji funkcji MessageDlg

const Msg: string
  • treść komunikatu (typ String).
DlgType: TMsgDlgType
  • określa typ wyświetlanego komunikatu. Tabela 2 przedstawia możliwe wartości oraz ich działanie.
Buttons: TMsgDlgButtons
  • określa, jakie przyciski mają znajdować się w okienku dialogu (patrz Tabela 3).
HelpCtx: Longint
  • określa id treści pomocy.

MessageDlg jest funkcją, dlatego zwraca wartość po wykonaniu. Jest ona typu Word. Mimo to funkcję można przypisać każdej zmiennej typu całkowitego (Integer, Cardinal, Byte itd.). Wartość, jaką zwraca funkcja to identyfikator naciśniętego przycisku (tak jak w MessageBox). Za pomocą tej właściwości możemy dostosować działanie programu do decyzji, jaką podjął użytkownik w związku z wywołanym komunikatem. Dla przykładu.

Listing #1: Wykonywanie programu w zależności od przycisku naciśniętego w komunikacie.

procedure ShowMessageDlg;
var 
  x: Integer;
begin
  x := MessageDlg('Treść komunikatu', mtConfirmation, mbYesNo, 0);
  if x  = mrYes then
    //zdarzenie, jakie wykona się, jeżeli w komunikacie naciśnięto przycisk Tak
  else
    //zdarzenie, jakie wykona się, gdy nie zostanie naciśnięty przycisk Tak (jeżeli nie naciśnięto Tak to na pewno naciśnięto Nie ? komunikat ma dwa przyciski);
end;

Procedura przypisuje zmiennej x wartość zwrotną funkcji MessageDlg (to znaczy informację, który przycisk został naciśnięty). Takie wywołanie spowoduje najpierw wyświetlenie komunikatu i zatrzymanie wykonywania procedury do czasy, gdy komunikat zostanie zamknięty (zwróci wartość). Następnie sprawdzana jest wartość, jaką zwrócił komunikat (tj. zmiennej x). Jeżeli naciśnięto przycisk Tak wykonane zostaną odpowiednie czynności, w przeciwnym razie zostaną wykonane inne (dialog ma tylko dwa przyciski, dlatego istnieją dwa warianty ? zostanie zatwierdzony lub nie).

Komunikat, jaki zostanie wyświetlony w tej procedurze będzie treści ?Treść komunikatu?. Jego tytuł będzie brzmiał ?Confirmation?, będzie zawierał obrazek dymka ze znakiem zapytania po lewej stronie (patrz Tabela 2). Komunikat będzie miał wspomniane dwa przyciski ? Tak i Nie (patrz Tabela 3).

Zauważ, że wartość x nie jest typu Word (jak podpowiada definicja funkcji), ale Integer. Oczywiście nie ma w tym żadnego błędu ? obydwa typy wartości to liczba całkowita.

Tabela 1
Wartości zwrotne MessageDlg są takie same jak MessageBox. Zauważ przy tym, że mogą być ?stałe? lub ?liczbowe?. W istocie między obiema nie istnieje żadna różnica. Nie ważne jest czy w warunku sprawdzającym wartość zwrotną podanym 1, czy mrOK. Wartości zwrotne ?stałe? zostały zapewne umieszczone dla ułatwienia ? prościej zapamiętać, że wartość zwrotna morze mieć postać mr + nazwa przycisku niż 4, czy 6.

PrzyciskWartość zwrotna (stała)Wartość zwrotna (liczbowa)
OKmrOk1
AnulujmrCancel2
TakmrYes6
NiemrNo7
PrzerwijmrAbort3
PowtórzmrRetry4
IgnorujmrIgnore5

Tabela 2
Poniższe wartości ustawiają takie parametry dialogu jak tytuł okienka oraz motyw graficzny znajdujący się po lewej stronie komunikatu. W MessageBox natomiast obydwa parametry możemy ustawić oddzielnie.

WartośćTytuł okienkaObrazek
mtCustomnazwa programubrak
mtInformationInformationdymek z literą I
mtWarningWarningTrójkącik z wykrzyknikiem
mtErrorErrorKółeczko z X
mtConfirmationConfirmationdymek ze znakiem zapytania

Tabela 3
W MessageDlg nie możemy zadeklarować pojedynczych przycisków tak jak w MessageBox (zawsze będzie ich trzy lub dwa). Z tego powodu funkcja ta jest używana raczej do ?konsultacji? programu z użytkownikiem.

WartośćGuziki w okienku
mbYesNoCancelTak, Nie, Anuluj
mbYesNoTak, Nie
mbOKCancelOK, Anuluj
mbAbortRetryIgnorePrzerwij, Powtórz, Ignoruj

Zauważ, że funkcja będzie mogła zwrócić takie wartości, jak 6, 7, 2, jeżeli zadeklarujemy mbYesNoCancle w parametrze Buttons. W takim przypadku MessageDlg nie będzie mógł zwrócić na przykład 10, czy 1.

Funkcja posiada przycisk zamknięcia (przycisk z x?em na belce). Jeżeli komunikat zostanie zamknięty za pomocą tego przycisku wartość zwrotna wyniesie, 2 co równoznaczne będzie z naciśnięciem przycisku Anuluj. W opisie Listing 1 podaliśmy, że komunikat może mieć dwie wartości zwrotne. Nie jest to do końca prawda, gdyż, jeżeli komunikat nie został zamknięty przy pomocy przycisku Tak to mógł on być zamknięta za pomocą przycisku z x?em lub Nie.

Dialogi tworzone za pomocą funkcji MessageDlg mają zawsze więcej niż dwie wartości zwrotne (nawet, jeżeli mają dwa przyciski). Do sprawdzania wartości zwrotnych najlepiej posłużyć się składnią Case Of. Poniżej znajduje się poprawiona wersja Listingu 1.

Listing 2: Poprawiona wersja Listingu 1

procedure ShowMessageDlg;
begin
  case MessageDlg('Treść komunikatu', mtConfirmation, mbYesNo, 0) of
    6: {w przypadku, gdy naciśnięto Tak};
    7: {w przypadku, gdy naciśnięto Nie};
    2: {w przypadku, gdy naciśnięto X};
  end;
end;

Okna dialogowe stworzone przy pomocy funkcji MessageDlg mają bardzo ciekawą właściwość. Otóż, gdy komunikat jest aktywny i wciśniemy kombinację [Ctrl] + [C], jego treść zostanie skopiowana do schowka w postaci tekstu.

Zobacz też:

6 komentarzy

Tak dla ścisłości, to w MessageDlg można deklarować pojedyncze przyciski :-D

np. MessageDlg('Twój tekst', mtInformation, [mbOK], 0);

nie wiem czy wiesz, ale "może"" pisze się przez "ż" :D

Jeżeli chodzi o ten niepotrzebne sprawy to sparałem się, żeby artykuł był przyjazny dla początkujących programistów. Wychodze z założenia, że Ci bardziej doświadczeni weszli by po prostu do systemu pomocy Delphi, jeżeli potrzebowali by informacji na ten temat.

Wicie, pierwszy artykół... :-)
Następnym razem postaram się żeby było lepiej.

IMVHO ten artykuł jest trochę przydługi i opisuje niepotrzebne sprawy, np.

Mammoth napisał(a)

Zauważ, że wartość x nie jest typu Word (jak podpowiada definicja funkcji), ale Integer. Oczywiście nie ma w tym żadnego błędu ? obydwa typy wartości to liczba całkowita.

Tekst fajny, ale na przyszlosc, prosze zajrzyj do dzialu "Pomoc". Tam znajdziesz tekst o zasadach tworzenia artykulow w tym dziale.
Kodu juz nie mialem sily poprawiac.