Aplikacje MDI - wielookienkowy edytor tekstu

berl

<font size="6">Aplikacja MDI - Przykładowy edytor tekstu
</span>

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 :

``` procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
```
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ę :

``` procedure stworz_okno(tytul : string);
``` potem w sekcji uses dopisujemy na końcu MDIChild, a następnie po słowie implementation piszemy całą procedurę :

``` procedure TForm1.stworz_okno(tytul : string);
var
Child : TForm2;
begin
Child := TForm2.Create(Application);
Child.Caption := tytul;
if FileExists(tytul) then
Child.memo1.Lines.LoadFromFile(tytul);
end;
```
28. Wybieramy z menu Plik tego formularza pozycję Nowy i piszemy dla niego obsługę :

``` procedure TForm1.Nowy1Click(Sender: TObject);
begin
stworz_okno('bez_nazwy'+inttostr(MDIChildCount + 1));
end;
```
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ę :

``` procedure TForm1.Otwrz1Click(Sender: TObject);
begin
if opendialog1.execute then begin
stworz_okno(opendialog1.filename);
end;
end;
```
31. Wybieramy z menu formularza MDIForm Plik|Zapisz i piszemy dla niego obsługę :

``` procedure TForm1.Zapisz1Click(Sender: TObject);
begin
if assigned(ActiveMDIChild) then begin
savedialog1.FileName := (ActiveMDIChild as TForm2).caption;
if savedialog1.execute then begin
(ActiveMDIChild as TForm2).memo1.Lines.SaveToFile(savedialog1.filename);
end;
end;
end;
```
32. Wybieramy z menu formularza MDIForm Plik|Zakończ i piszemy dla niego obsługę :

``` procedure TForm1.Zakocz1Click(Sender: TObject);
begin
application.terminate;
end;
```
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

Jasiek nie jestem pewien ale w uses zamiast MDIChild wpisz CHILDWIN powino pomuc :)

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??

dla mnie bomba =D

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 :?

jakubkrol: nieprawda.

heh
w kodzie nie pisz blabla
tylko [b]blabla[/b] chyba

heh
w kodzie nie pisz blabla
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.

NA MNIE TO WRAŻENIA NIE ROBI :)

Fakt, coś mi się pomieniało, już poprawiłem.

od kiedy memo ma caption ?

Art cool. Człowiek z mojego małego miasteczka ;)

Spoko artykół!!!

Nawet fajny arcki :) Dostajesz 5 :D