Programowanie w języku Delphi » Gotowce

Aplikacje MDI - wielookienkowy edytor tekstu

  • 2008-05-06 18:17
  • 15 komentarzy
  • 1413 odsłon
  • Oceń ten tekst jako pierwszy
<center>Aplikacja MDI - Przykładowy edytor tekstu</center>




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

kazik70 2007-05-29 19:19

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

kazik70 2007-05-29 19:16

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

Jasiek 2007-04-10 19:57

Wszystko robiłem wg. punktów, a kiedy chcę skompilować program pojawia się błąd:Unit1.pas(8): File not found: 'MDIChild.dcu'

Dlaczego??

max071 2006-12-24 01:00

dla mnie bomba =D

tomalla 2006-11-10 21:00

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

Coldpeer 2006-06-28 14:43

jakubkrol: nieprawda.

jakubkrol 2006-04-15 11:04

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

jakubkrol 2006-04-15 11:03

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

berl 2006-01-04 14:54

Widocznie jesteś o wiele bardziej zaawansowany od tych, na których robi wrażenie :)
Ten tekst jest raczej dla początkujących.

Piotrekdp 2005-12-31 14:51

NA MNIE TO WRAŻENIA NIE ROBI :)

berl 2005-03-13 10:44

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

AklimX 2005-02-25 18:47

od kiedy memo ma caption ?

Anonymous AdSoft 2004-12-14 16:46

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

daten 2003-02-08 13:15

Spoko artykół!!!

Sebek 2003-01-08 08:59

Nawet fajny arcki :) Dostajesz 5 :D