Aplikacja typu MDI
Z aplikacją MDI mamy do czynienia, gdy w projekcie występuje jeden formularz nadrzędny i wiele formularzy podrzędnych - wszystkie tego samego typu. Przykładem takiej organizacji jest Word, Paint, WordPad itp.
Ćwiczenie 3.3 .
Zadanie aplikacji
Ćwiczenie wstępne do aplikacji Edytor - dostosowanie szablonu typu MDI do własnych potrzeb.
Nowe umiejętności
Tworzenie aplikacji typu MDI przy wykorzystaniu szablonu z Repozytorium.
Rysunek 1 - Aplikacja typu MDI
Wybierz z menu File→New, następnie kartę Projects i w oknie element MDI Application. Wybierz katalog do zapamiętywania plików aplikacji (najlepiej utwórz własny gdzieś w folderze Moje dokumenty). W wyniku tych działań zostaną wygenerowane podstawowe formularze aplikacji: formularz z elementami sterowania, formularz z oknem O programie i formularz podrzędny.
Uruchom aplikacje i sprawdź działanie podstawowych opcji zawartych w menu.
Wciskając klawisze Shift+F12, przejdź do okna wyboru formularza; wybierz About i sprawdź, jakie komponenty zawiera. Zmień napisy na etykietach, właściwość Caption formularza i wybierz logo dla aplikacji.
Wybierz formularz Main Form, przejdź do edycji menu i zmień nazwy angielskie na polskie. Ustaw dla każdej opcji menu we właściwości Hint krótkie wyjaśnienie funkcji opcji. Będzie ono treścią linii stanu.
Wybierz formularz MDIChild. Wprowadź pole RichEdit. Klikając myszą w polu właściwości Lines ...TStrings, wejdź do edycji linii i wykasuj napis RichEdit1.
Ustaw właściwość:
Align AlClient
Posługując się poznanymi wiadomościami, spróbuj napisać prosty edytor tekstu.
(Delphi 5.0 wprowadza szablon aplikacji z polem Memo na formularzu MDIChild).
Rozbudowa aplikacji MDI - edytor tekstu
Ćwiczenie 3.4
Zadanie aplikacji
Rozbudowa aplikacji MDI z poprzedniego ćwiczenia, dodanie dodatkowych możliwości: otwarcia istniejącego pliku, tak by po wyborze pliku z opcji Otwórz zawartość pliku wpisywała się do pola RichEdit, a także zachowywania pliku itp.
Nowe umiejętności
Opisanie zawartości pliku do pola RichEdit formularza podrzędnego.
W poprzednio utworzonej aplikacji wyselekcjonuj formularz MainForm i wprowadź komponent SaveDialog.
Wpisz procedury obsługujące podopcje menu Edycja:
dla opcji Wytnij:
procedure TMainForm.CutItemClick(Sender: TObject);
var
Form:TMDIChild; //deklaracja zmiennej do przechwycenia aktywnego formularza
begin
If ActiveMDIChild <> nil then
begin
//przechwycenie aktywnego formularza od właściwości ActiveMDIChild, zastosowano tu rzutowanie typów z typu TForm na typ TMDlChild
Form:=TMDIChild(MainForm.ActiveMDIChild);
// wycinanie do schowka zawartości pola Memo aktywnego formularza
Form.RichEdit1.CutToClipboard;
end;
end;
w podobny sposób utwórz pozostałe procedury obsługujące opcje Kopiuj i Wklej.
Wprowadź w module ChildWin.pas rozszerzenie klasy TMDIChild, dodając po o słowie Public zmienną publiczną AktualnaNazwa :String[80]. Zadaniem zmiennej będzie pamiętanie aktualnej nazwy otwartego pliku. Dla nowego okna zmienna przyjmuje nazwę okna.
W module Main dla metody TMainForm.CreateMDIChild dodaj przed sło wem end:
Child.AktualnaNazwa:=Name.
Przejdź do edytowania procedur podopcji menu Plik:
dla opcji Nowy zmień treść procedury na następującą:
procedure TMainForm.FileNewItemClick(Sender: TObject);
begin
CreateMDIChild('NOWY' + IntToStr( MDIChildCount+1) );
end;
dla opcji Otwórz zmień treść procedury na następującą:
procedure TMainForm.FileOpenItemClick(Sender: TObject);
var
Form: TMDIChild; // deklaracja formularza typu MDIChild
Nazwa: String[80]; // zmienna do zapamiętania nazwy pliku
begin
If OpenDialog.Execute then
begin
Nazwa:= OpenDialog.FileName:
//utworzenie nowego formularza podrzędnego o nazwie takiej jak nazwa pliku
CreateMDIChild(Nazwa);
//przechwycenie aktywnego formularza pod zmienną Form
Form:=TMDIChild(MainForm.ActiveMDIChild);
Form.AktualnaNazwa:=nazwa; //wpisanie zawartości pliku do pola Memo
Form.RichEdit1.Lines.LoadFromFile(Nazwa);
end;
end;
dla opcji Zachowaj jako zmień procedurę na następującą:
procedure TMainForm.FileSaveAsItemClick(Sender: TObject);
var
Form:TMDIChild;
sOverwrite:Integer;
nazwa:String[80];
begin
if SaveDia1ogl.Execute then
begin
if FileExists(SaveDialogl.FileName) then
if MessageDlg(FmtLoadStr(sOverwrite,[SaveD1alogl.FileName]),
mtConfirmation.mbYesNoCancel,0) <> idYes
then exit;
//wyjście, gdy przycisk wciśnięty w oknie dialogowym jest różny od Yes
Form:=TMDIChild (MainForm.ActiveMDIChild);
//przechwycenie nazwy aktywnego formularza
Form.RichEditl.Lines.SąvetoFile(SaveDialogl.FileName);
Form.RichEditl.Modified:=False;
Form.Caption:=SaveDialog1.FileName;
end:
end;
dla opcji Zachowaj zmień procedurę na następującą:
procedure TMainForm.FileSaveItemClick(Sender: TObject);
var
Form:TMDIChild;
Begin
Form:=TMDIChild(MainForm.ActiveMDIChild);
If copy(Form.AktualnaNazwa,l,4)='NOWY'
Then FileSaveAsItemClick(Sender)
else Form.RichEdit1.Lines.SaveToFile(Form.AktualnaNazwa);
end;
Rozbuduj edytor i jako procedury obsługi przycisków z pasków narzędziowych wybierz procedury z opcji menu, na przykład
procedure TMainForm.CutBtnClick(Sender:Tobject);
begin
CutItemClick(Sender);
end;
We właściwości Hint przycisków z pasków narzędziowych zmień podpowiedz na polską.
Rozbuduj edytor dodając możliwość korzystania z drukarki.
Uwagi do ćwiczenia dla wersji 5.0 i nowszych.
W wersji 5.0 szablon aplikacji MDI jest wzbogacony o komponent ActionList i procedury obsługi zdarzeń. Formularz MDIChild wyposażony jest w pole Memo i wykonywane na tekście operacje dotyczą tego pola. Poniżej przedstawione są czynności związane z zamianą pola Memo na RichEdit oraz oprogramowaniem listy akcji.
Przejdź do formularza MDIChild i zamień komponent Memo na RichEdit.
Wyselekcjonuj komponent Action na formularzu MainForm. Zmień angielskie etykiety akcji (Caption) i podpowiedz (Hint) na polskie.
Do formularza MainForm wprowadź komponent SaveDialog.
W grupie akcji File przeprogramuj akcje według wskazówek poprzedniego opisu. Zmień etykiety akcji i podpowiedz (Hint).
Rozbuduj edytor definiując nowe akcje i odpowiednio nowe opcje menu i przyciski narzędziowe.
1