Aplikacje MDI - wielookienkowy edytor tekstu
Na początku napiszę, że do napisania tego programu użyłem Delphi 5 Enterprise.
Myślę, że da się to napisać także w Delphi 4 i może nawet Delphi 3.
Teraz trochę spraw organizacyjnych. Podczas pisania tego artykułu starałem się,
żeby następujące rzeczy wyglądały tak :
kod programu;
komponenty i rzeczy, które trzeba wybrać z menu;
właściwości i zdarzenia.
Przejdźmy zatem do konkretów.
Przed rozpoczęciem pisania programu trzeba sobie skądś zdobyć, albo
samemu narysować ikony, które później będą na przyciskach Nowy, Otwórz,
Zapisz, Kopiuj, Wklej, Wytnij, Cofnij, Ustaw okna kaskadowo,
Ustaw okna nad sobą, Ustaw okna obok siebie. Ikony takie w formacie bmp
są dołączone do przykładowego programu.
1. Tradycyjnie najpierw weźmiemy File|New Application.
2. Zmieniamy właściwości formularza :
a. Caption : Edytor tekstu
b. Color : clAppWorkSpace
c. FormStyle : fsMDIForm
3. Dodajemy na formularz komponent ImageList z zakładki Win32.
4. Klikamy na komponencie ImageList lewym klawiszem myszy, otwierając
tym samym menu podręczne, z którego wybieramy ImageList Editor.
5. Klikamy przycisk Add, i dodajemy wszystkie przygotowane wcześniej
obrazki.
6. Dodajemy na formularz komponent ToolBar z zakładki Win32.
7. Zmieniamy jego właściwości :
a. BorderWidth : 1
b. Color : clBtnFace
c. Height : 30
d. Images : ImageList1
8. Klikając prawym przyciskiem myszy na komponencie ToolBar otwieramy
menu podręczne, z którego wybieramy :
a. New Button
b. New Button
c. New Button
d. New Separator
e. New Button
f. New Button
g. New Button
h. New Button
i. New Separator
j. New Button
k. New Button
l. New Button
Ikony na przyciskach powinny się pojawić we właściwej kolejności, czyli
Nowy, Otwórz, Zapisz, Kopiuj, Wklej, Wytnij, Cofnij, Ustaw okna kaskadowo,
Ustaw okna nad sobą, Ustaw okna obok siebie. Jest ot w tej chwili
nieważne, ustawimy to i tak później.
W ten sposób udało się nam uzyskać belkę narzędziową.
9. Dodajemy na formularz komponent ActionList z zakładki Standard.
10. Klikamy na komponencie ActionList prawym przyciskiem myszy, z
menu podręcznego wybieramy Action List Editor.
11. Klikając trójkąt skierowany w dół, obok żółtego prostokąta, dodajemy akcję standardową
(New Standard Action).
12. Dodajemy następujące akcje : TEditCopy, TEditCut, TEditPaste,
TEditUndo, TWindowCascade, TWindowTileHorizontal, TWindowTileVertical,
i zamykamy Action List Editora.
13. Zmieniamy właściwości ToolButtonów.
a. ToolButton5
Action : EditCopy1
b. ToolButton6
Action : EditPaste1
c. ToolButton7
Action : EditCut1
d. ToolButton8
Action : EditUndo1
e. ToolButton10
Action : WindowCascade1
f. ToolButton11
Action : WindowTileHorizontal1
g. ToolButton12
Action : WindowTileVertical1
14. W razie potrzeby zmieniamy ikony na przyciskach, zmieniając właściwość
ImageIndex przycisku.
15. Dodajemy na formularz komponent MainMenu z zakładki Standard
16. Ustawiamy właściwości komponentu MainMenu :
a. Images : ImageList1
17. Klikając na komponencie MainMenu prawym przyciskiem myszy, otwieramy
menu podręczne, z którego wybieramy Menu Designer
18. Tworzymy menu Plik, w którym będą pozycje : Nowy, Otwórz, Zapisz,
-, Zakończ; Następnie menu Edycja, w której będą : Kopiuj, Wklej, Wytnij,
Cofnij; Następnie menu Okno, w którym będą : Ustaw okna kaskadowo,
Ustaw okna nad sobą, Ustaw okna obok siebie. Nie zamykamy jeszcze
Menu Designera.
19. Ustawiamy właściwość ImageIndex każdej pozycji z menu na odpowiednią
wartość. W ten sposób uzyskujemy ikony obok każdej pozycji z menu. Nie
zamykamy jeszcze Menu Designera.
20. Zmieniamy właściwości Action pozycji z menu, tak samo jak zmienialiśmy
na przyciskach w punkcie 13. W czasie zmieniania tejże właściwości,
zmienią się także właściwości Caption pozycji z menu na ich angielskie
odpowiedniki. Trzeba to oczywiście skorygować. Skróty klawiaturowe
zostawimy. Teraz już można zamknąć Menu Designera.
21. Teraz trzeba stworzyć okno, które będzie się pojawiać w oknie,
które właśnie stworzyliśmy, przy każdym kliknięciu przycisku Nowy.
W tym celu wybieramy File|New Form.
22. Zmieniamy jego właściwości :
a. FormStyle : fsMDIChild
23. Dodajemy na formularz MDIChild komponent Memo z zakładki Standard.
24. Zmieniamy właściwości komponentu Memo :
a. Align : alClient
b. Lines : (kasujemy wszystkie linie)
25. Piszemy obsługę do zamykania okienka podrzędnego :
<b>procedure</b> TForm2.FormClose(Sender: TObject; var Action: TCloseAction);<br>
<b>begin</b><br>
Action := caFree;<br>
<b>end</b>;<br>
26. Wracamy do formularza MDIForm.
27. W celu ułatwienia dalszych działań napiszemy sobie procedurkę,
która tworzy nowe okno na podstawie formularza MDIChild. Najpierw w
sekcji private dopisujemy linijkę :
<b>procedure</b> stworz_okno(tytul : string);<br>
potem w sekcji uses dopisujemy na końcu MDIChild, a następnie po
słowie implementation piszemy całą procedurę :
<b>procedure</b> TForm1.stworz_okno(tytul : string);<br>
<b>var</b><br>
Child : TForm2;<br>
<b>begin</b><br>
Child := TForm2.Create(Application);<br>
Child.Caption := tytul;<br>
if FileExists(tytul) then<br>
Child.memo1.Lines.LoadFromFile(tytul);<br>
<b>end</b>;<br>
28. Wybieramy z menu Plik tego formularza pozycję Nowy i piszemy dla
niego obsługę :
<b>procedure</b> TForm1.Nowy1Click(Sender: TObject);<br>
<b>begin</b><br>
stworz_okno('bez_nazwy'+inttostr(MDIChildCount + 1));<br>
<b>end</b>;<br>
29. Dodajemy na formularz MDIForm komponent OpenDialog i SaveDialog z
zakładki Dialogs.
30. Wybieramy z menu formularza MDIForm Plik|Otwórz i piszemy dla niego
obsługę :
<b>procedure</b> TForm1.Otwrz1Click(Sender: TObject);<br>
<b>begin</b><br>
if opendialog1.execute then <b>begin</b><br>
stworz_okno(opendialog1.filename);<br>
<b>end</b>;<br>
<b>end</b>;<br>
31. Wybieramy z menu formularza MDIForm Plik|Zapisz i piszemy dla niego
obsługę :
<b>procedure</b> TForm1.Zapisz1Click(Sender: TObject);<br>
<b>begin</b><br>
if assigned(ActiveMDIChild) then <b>begin</b><br>
savedialog1.FileName := (ActiveMDIChild as TForm2).caption;<br>
if savedialog1.execute then <b>begin</b><br>
(ActiveMDIChild as TForm2).memo1.Lines.SaveToFile(savedialog1.filename);<br>
<b>end</b>;<br>
<b>end</b>;<br>
<b>end</b>;<br>
32. Wybieramy z menu formularza MDIForm Plik|Zakończ i piszemy dla niego
obsługę :
<b>procedure</b> TForm1.Zakocz1Click(Sender: TObject);<br>
<b>begin</b><br>
application.terminate;<br>
<b>end</b>;<br>
33. Teraz do każdego z trzech pierwszych ToolButtonów dla zdarzenia
OnClick przypisujemy odpowiednie procedury :
a. ToolButton1 : Nowy1Click
b. ToolButton2 : Otwrz1Click
c. ToolButton3 : Zapisz1Click
W ten sposób uzyskaliśmy najbardziej podstawową z podstawowych aplikacji
MDI. Nie ma ona żadnych bajerów w stylu blokady zamykania okna, kiedy
jest ono niezapisane itp, ale nie powinniście mieć problemów z zakodowaniem
tego. W razie pytań piszcie, jeśli będę wiedział, to odpowiem, jeśli nie
będę, to też odpiszę, przyznając się do tego otwarcie. Przykładowy program
jest suto okraszony komentarzami, a nazywa się EdytorMDI i znajduje się w sekcji Download|Kody źródłowe|Delphi|Kody źródłowe.
Marcin Stodulski
15 komentarzy
No tak ale ale w delphi 7 nie wiem jak w innych
wystarczy wybrać file=>new=>other=>Projects=>MDIaplication
i uzyskujemy dokłądnie ten sam edytor :/ a całość trwa 5sek
Wszystko robiłem wg. punktów, a kiedy chcę skompilować program pojawia się błąd:Unit1.pas(8): File not found: 'MDIChild.dcu'
Dlaczego??
mam kilka pytanek -
1. jak zrobić, by przy starcie programu, ten MDIChild się nie pokazywał?
2. czy ten MDIChild może mieć MainMenu? Gdy daje komponent MainMenu, MDIChild w ogóle go nie wyświetla :?
heh
w kodzie nie pisz <b>blabla</b>
tylko [b]blabla[/b] chyba
heh
w kodzie nie pisz <b>blabla</b>
tylko [b]blabla[/b] chyba
Widocznie jesteś o wiele bardziej zaawansowany od tych, na których robi wrażenie :)
Ten tekst jest raczej dla początkujących.
Jasiek nie jestem pewien ale w uses zamiast MDIChild wpisz CHILDWIN powino pomuc :)