Programowanie w języku Delphi » FAQ

Tworzenie aplikacji MDI

  • 2006-07-30 14:27
  • 5 komentarzy
  • 2010 odsłon
  • Oceń ten tekst jako pierwszy

Co to jest aplikacja MDI?


Aplikacja MDI (ang. Multi Document Interface) jest to aplikacja, która wykorzystuje wiele okienek do porozumiewania się z użytkownikiem. Istnieje w niej jedno główne okno, w którym znajdują się okna-dzieci. Przykładem aplikacji MDI jest Microsoft Word. Jej przeciwieństwem jest aplikacja SDI (ang. Single Document Interface), w którym pracę wykonuje się w jednym oknie (nawet jeżeli program posiada kilka form, to jednak tylko jedna forma służy do wykonywania głównego celu programu). Przykładem takiej aplikacji jest Notatnik.

Przygotowanie do tworzenia aplikacji


W głównej formie musimy zmienić właściwość FormStyle na fsMDIForm. Następnie tworzymy drugą formę, której właściwość FormStyle ustawiamy na fsMDIChild. Ponieważ okien-dzieci może być bardzo wiele, bez sensu byłoby tworzenie każdego okna ręcznie. Będziemy musieli tworzyć je dynamicznie. Dlatego stworzone okno-dziecko musimy ustawić jako formę tworzoną dynamicznie. W menu wybieramy pozycję Project, a następnie Options... . Wybieramy zakładkę Forms i okno-dziecko przenosimy z listy Auto-create forms na listę Available forms.

Tworzenie okien-dzieci


Aby utworzyć nowe okno-dziecko, musimy posłużyć się metodą:
OknoDziecko := TOknoDziecko.Create(GlownaForma)

W tym przypadku stworzyliśmy formę OknoDziecko, które należy do formy głównej GlownaForma. Możemy w ten sposób stworzyć nieskończenie wiele (teoretycznie) okien-dzieci. Aby je zamknąć, wystarczy w ich zdarzeniu OnClose napisać:
Action := caFree;
OknoDziecko := NIL;

Problemem jest jednak odwoływanie się do okien-dzieci.

Odwoływanie się do okien-dzieci


Istnieje kilka metod, dzięki którym możemy odwoływać się do poszczególnych okien dzieci. Poniżej postaram się je szczegółowo omówić.

property ActiveMDIChild: TForm

Jest to właściwość umożliwiająca odwołanie się do aktywnego okna-dziecka. Ponieważ zwykle chcemy skorzystać z właściwości i metod stworzonych przez nas (poprzez naniesienie obiektów na formatkę), musimy zasugerować kompilatorowi, że ActiveMDIChild jest oknem wybranego typu. Kompilator na poziomie pisania kodu nie wie, że nasze okna-dzieci mają jeszcze inne właściwości i metody niż domyślne. Dlatego do aktywnego okna musimy odwoływać się za pomocą słowa kluczowego as, które wskazuje kompilatorowi, że wybrany obiekt jest danego typu (czyli np. nasze aktywne okno-dziecko jest formatką typu TOknoDziecko). Przykład użycia:
(ActiveMDIChild as TOknoDziecko).Label.Caption := 'Hello World!'

Powyższa instrukcja dokonuje przypisania napisu Hello World! do właściwości Caption obiektu Label znajdującego się w aktywnym oknie-dziecku.
Jeżeli korzystamy ze standardowych metod i właściwości formatki, nie jest konieczne używanie słowa kluczowego as, np:
ActiveMDIChild.Caption := 'To jest tytuł okna!'

UWAGA! Jeśli mamy kilka rodzajów okien-dzieci, musimy najpierw sprawdzić, czy dane okna jest danego typu. W przeciwnym wypadku wystąpi błąd! Do sprawdzenia, czy wybrany obiekt jest danego typu, korzystamy ze słowa kluczowego is. Przykład:
if ActiveMDIChild is TOknoDzieckoPierwszyRodzaj then
(ActiveMDIChild as TOknoDzieckoPierwszyRodzaj).Label.Caption := 'To jest okno pierwszego rodzaju!';
if ActiveMDIChild is TOknoDzieckoDrugiRodzaj then
(ActiveMDIChild as TOknoDzieckoDrugiRodzaj).Edit.Text := 'To jest okno drugiego rodzaju!';



property MDIChildCount: Integer

Jest to właściwość podająca ilość utworzonych okien-dzieci, np.
if MDIChildCount > 0 then
ShowMessage('Istnieje minimum jedno okno-dziecko!') else
ShowMessage('Nie ma żadnych okien-dzieci!')



property MDIChildren[i: Integer]: TForm

Jest to właściwość, która pozwala odnieść się do dowolnego okna-dziecka. W nawiasach kwadratowych podajemy numer porządkowy okna. Numery okien zaczynają się od 0, nie od 1. Do takich okien odwołujemy się podobnie, jak we właściwości ActiveMDIChild, czyli za pomocą słów kluczowych as i is.
UWAGA! Przy zamykaniu okien, liczba okien i ich numery porządkowe zmieniają się! Dlatego jeżeli chcemy je zamknąć, musimy to robić od okna mającego największą liczbę porządkową (czyli od końca), np.
for i := MDIChildCount-1 downto 0 do
MDIChildren[i].Close

5 komentarzy

TurboXT 2006-07-31 17:44

Ale tamto to jest gotowiec, a tutaj jest tak jakby "mini artykuł" - tutaj masz samą teorię :P

Coldpeer 2006-07-30 19:41

1) OK, mysłałem, że np. pod tymi słowami rozumiesz coś a'la "kiedyś jak znajdę czas" ;)

TurboXT 2006-07-30 13:42

1) Zaraz dopiszę, musiałem na chwilę wyłączyć komputer
2) To mój pierwszy artykuł, nie wiedziałem nawet, o co chodzi z tą ścieżką
Ale dzięki za porady i sugestie

Dodane:
Już artykuł dokończyłem i poprawiłem. Teraz możecie go ocenić ;)

Coldpeer 2006-07-30 13:01

1) Eee.. jak dodajesz arty to napisz go porządnie, a nie "napiszę za jakiś czas"...
2) Podawaj pełną ścieżkę kategorii dla tekstu, np. jeśli ma się znaleźć w Delphi/FAQ to wpisz "Delphi/FAQ/Tworzenie_aplikacji_MDI", a nie samo "Tworzenie_aplikacji_MDI".