Jak mogę zrobić, aby w Delphi utworzyć okno MDI, a następnie wszystkie operacje, które wykonam na głównym oknie, odniosły się do aktywnego okna?
W Delphi jest kilka przykładowa aplikacja MDI.
Tam możesz podejrzeć.
BTW Powiedź coś więcej: 8-O
Byłem w KS Ekspercie!
8-O
A nie możesz tutaj wytłumaczyć? Wiem, jak zrobić jedno okno MDI i jak zrobić, że jeżeli już jedno istnieje, to się drugie nie pojawi. Chciałbym zrobić tak, że mógłbym otworzyć dowolną ilość okienek MDI i potem wykonywałbym operacje na aktywnym okienku poprzez menu główne głównego okna.
P.S. Kliknij przycisk WWW, a następnie dział O autorze ;)
To może jakiś fragment kodu, jak wyświetlasz to okno czy coś w tym stylu, co chcesz robić itd.?
To jest kod przycisku, który otwiera nowe okno:
procedure TGlownaForma.Nowy1Click(Sender: TObject);
begin
OknoTekst := TOknoTekst.Create(GlownaForma);
OknoTekst.Show;
end;
Wiem, że jeśli chcę, aby można było otworzyć tylko jedno okno, to muszę użyć funkcji Assigned. Mi jednak chodzi o to, żeby było wiele okien MDI i żebym mógł pracować w takim oknie, jeżeli jest ono aktywne. Na razie okna się dobrze otwierają, ale niestety można pracować tylko na ostatnim utworzonym.
musisz podzielić sobie menu na dwie części
- odpowiedzialna za obsługę aplikacji
- odpowiedzialna za obsługę okna MDI
1 menu dajesz na formę główną MDIForm a 2 na formę MDIChild
wszystko to masz w przykładach do delphi :/
okno twórz przez:
var
Frm: TOknoTekst;
begin
Frm := TOknoTekst.Create(Self);
//Tu robisz co chcesz z formą, ale Show chyba nie ma sensu dla MDI, bo nie można ukryć/pokazać takiego okna :P
A odwołuj się do niego poprzez:
(ActiveMDIChild as TOknoTekst)
Misiekd, ja już coś takiego zrobiłem.
NeX, wielkie dzięki za pomoc. O to mi właśnie chodziło.
BTW: gdzie są te przykłady w Delphi? Dla mnie jest tam za duży bałagan ;)
W Delphi 5 masz:
File|New...|Projects|MDI Application.
Nie wiem jak w innych
W Delphi 7 jest tak:
-file
-new
-other
-projects
i tam znajdziesz MDI Application.
P.S Jeżeli oto Ci chodziło. :-)
A jak można zwolnić pamięć po tych oknach? Gdybym robił to pojedynczo, to wiem, jak to zrobić. Jednak przy wychodzeniu z całęgo programu nie wiem, jak zamknąć wszystkie okna naraz. Pracuję w Win32 (w .NET pamięć zwolniłaby się automatycznie).
Zrób pętlę po oknach a w niej:
(<zmienna> as TForm).Free;
Tak myślałem, ale sądziłem, że istnieje prostsze rozwiązanie ;) W każdym razie dzięki ;)
Pamiętaj, że często:
najlepsze = najprostsze
,ale często też:
najprostsze <> proste
:-D
Przy zamykaniu okna głównego, wszystkie pozostałe są zamykane "normalnie" a nie zabijane. Jeżeli masz w OnClose Action na caFree ustawioną, pamięć zwolni się automatycznie.
TurboXT napisał(a)
Pracuję w Win32 (w .NET pamięć zwolniłaby się automatycznie).
Nop, w Win32 też ;-P
Akurat w moim przypadku przydało się "ręczne" zamykanie okien :D
Ręczne? Wystarczy
ActiveMDIChild.Close;
lub MDIChildren[{Indeks okna}].Close;
.
Mam problem. Przy zdarzeniu OnClose okna MDI program ma wykonać to:
procedure TOknoTekst.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
OknoTekst := NIL;
end;
No i zamiast zamknąć okno, on je minimalizuje. Co jest nie tak?
Dodano:
Problem rozwiązany. Wystarczy było zreBuildować projekt :P