Mainmenu na fomach mdichild

0

Witam,
czy ktoś wie jak zrobić aby mainmenu na formach mdichild na nich pozostało i nie podmieniało mainmenu na formie głównej?

2

Chyba nie do końca rozumiesz jak działają mdi :)

MDIChild to nic innego jak forma tylko zarządzanie nimi z poziomu runtime jest nieco inne. Zatem nie ma czegoś takiego jak "podmiana mainmenu na formie głównej" bo operujesz w ramach aktualnej formy, na której jesteś (MDIChild) a jedynie wyświetla się jej menu w miejscu menu "głównej formy" :) a to tylko dlatego, że zmieniłeś style danej formy :)

5

A ja zapytam przewrotnie - ale dlaczego MDI?
Chyba już nikt tego nie używa (no dobra, poza ERPami, ale i tam się to zmienia).

Oczywiście nie proponuję okien modalnych, bo takie rozwiązanie dla aplikacji która tych okien ma więcej niż trzy, to IMO chory pomysł.
Jak muszę zamknąć aktualne okno, aby wejść w jakieś szczegóły innego to mnie naprawdę szlag trafia.

Ale zamiast tego rzucasz TPageControl (lub jego odpowiednik) na formę główną, a każde okno child dokujesz (poszukaj sobie metody ManualDock) na tym PageControl.
Działa to i wygląda jak przeglądarka internetowa prezentująca strony na zakładkach, ale wymaga napisania odrobiny kodu do zarządzania takim mechanizmem.

0
woolfik napisał(a):

Chyba nie do końca rozumiesz jak działają mdi :)

MDIChild to nic innego jak forma tylko zarządzanie nimi z poziomu runtime jest nieco inne. Zatem nie ma czegoś takiego jak "podmiana mainmenu na formie głównej" bo operujesz w ramach aktualnej formy, na której jesteś (MDIChild) a jedynie wyświetla się jej menu w miejscu menu "głównej formy" :) a to tylko dlatego, że zmieniłeś style danej formy :)

Zgadza się: nie do końca rozumiem, jakieś proste różne mdichild z listview i buttonami mi wystarczało, ale wysypałem się jak chciałem mieć różne osobne menu dla okna głównego i child

wloochacz napisał(a):

A ja zapytam przewrotnie - ale dlaczego MDI?

Chyba już nikt tego nie używa (no dobra, poza ERPami, ale i tam się to zmienia).

Oczywiście nie proponuję okien modalnych, bo takie rozwiązanie dla aplikacji która tych okien ma więcej niż trzy, to IMO chory pomysł.
Jak muszę zamknąć aktualne okno, aby wejść w jakieś szczegóły innego to mnie naprawdę szlag trafia.

Ale zamiast tego rzucasz TPageControl (lub jego odpowiednik) na formę główną, a każde okno child dokujesz (poszukaj sobie metody ManualDock) na tym PageControl.
Działa to i wygląda jak przeglądarka internetowa prezentująca strony na zakładkach, ale wymaga napisania odrobiny kodu do zarządzania takim mechanizmem.

Dzięki za podpowiedź, muszę przemyśleć bo to mi zmieni całkowicie pomysł na funkcjonalność programu. Faktycznie przyzwyczajony jestem do programów erp i intuicyjnie w tą stronę funkcjonalności chciałem iść

2
Julius napisał(a):

Dzięki za podpowiedź, muszę przemyśleć bo to mi zmieni całkowicie pomysł na funkcjonalność programu. Faktycznie przyzwyczajony jestem do programów erp i intuicyjnie w tą stronę funkcjonalności chciałem iść

Tia, to podobnie jak ja.
Znam ich sporo, widziałem jeszcze więcej (taka praca) nawet wdrożeniami się zajmowałem i mam pewne swoje przemyślanie na temat ergonomii...
MDI mówię zdecydowanie nie, tak jak i oknom modalnym.
Ja mam to zrobione właśnie w ten sposób + do tego mam okna modalne lokalnie.
Takie okno ModalLocal zachowuje się tak, że blokuje okno rodzica (czyli konkretną zakładkę trzymając się przykładu przeglądarek), ale pozwala na uruchomienie dowolnej innej funkcji czy innego okna niezależnie od siebie.
Mega wygodne.

0

Testuje sobie ManualDock, ale z frame'sami.
Tak jak w przypadku form mogę sobie sprawdzić wcześniej czy ich nie utworzyłem, utworzyć i "zadokować".

 if not Assigned (Form2) then
    begin
      Form2 := TForm2.Create(Self);
      Form2.ManualDock(Form1);
    end;

tak w przypadku Frames mam problem.

 if not Assigned (Frame2) then
    begin
      Frame2 := TFrame2.Create(Self);
      Frame2.ManualDock(Form1);
    end;

Assign(Frame2) zwraca mi jako true zanim go utworzyłem.
Jak sprawdzić czy frame został już utworzony i "zadokowany"?

1
Julius napisał(a):

Assign(Frame2) zwraca mi jako true zanim go utworzyłem.

Bo ramki w Delphi to jest taki poroniony pomysł IMO.
Da się tego używać w IDE, klikając wizualnie ramki i tworząc formatki z klocków.
Pomysł z początku wydaje się fajny, ale takim nie jest.

IIRC to instancja TFrame jest tworzona z automatu w pliku projektu DPR.
Sprawdź, a jeśli tak jest to usuń ten kod.
Inaczej wszystkie ramki utworzą się od razu, a ich instancja zostanie przypisana do zmiennej globalnej zdefiniowanej w module z ramką.

Dlatego Assigned zwraca True, co jest poprawne.

Jak sprawdzić czy frame został już utworzony i "zadokowany"?

Już sprawdzasz czy został utworzony, przez Assigned.
Jeśli chcesz sprawdzić czy został zadokowany, to najprościej dodaj sobie flagę do ramki i ustawiaj ją przy dokowaniu.

Możesz napisać nawet własną metodę dokowania.
Możesz tez utworzyć bazowy typ ramki, tam umieścić flagę o dokowaniu, a każdą ramkę dziedziczyć z własnego typu bazowego.

0
wloochacz napisał(a):

IIRC to instancja TFrame jest tworzona z automatu w pliku projektu DPR.
Sprawdź, a jeśli tak jest to usuń ten kod.

Chyba nie jest

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

Mam tylko formę główną w dpr.

Problem rozwiązałem na razie w taki sposób:

if not Assigned (FindComponent('Frame2') as Tframe) then
    begin
      Frame2 := TFrame2.Create(Self);
      Frame2.ManualDock(Form1);
    end;

Nie tworzy, gdy jest już utworzona, ale teraz szukam pomysłu innego. Gdy mam np kilka framesów, a ostatni przykrywa wszystkie poprzednie (onClient), jak wyrzucić wskazany frames na górę?

0
Julius napisał(a):
wloochacz napisał(a):

IIRC to instancja TFrame jest tworzona z automatu w pliku projektu DPR.
Sprawdź, a jeśli tak jest to usuń ten kod.

Chyba nie jest

Gdyby nie była, to Assigned zwróciłby False.
A jak napisałeś zwraca to True.
To albo zapomniałeś że już ją utworzyłeś, albo tworzona jest inaczej.
Nie wiem jak czy są tworzone z automatu, ponieważ nie dotykam tego cuda zwanego TFrame.

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

Mam tylko formę główną w dpr.

Problem rozwiązałem na razie w taki sposób:

if not Assigned (FindComponent('Frame2') as Tframe) then
    begin
      Frame2 := TFrame2.Create(Self);
      Frame2.ManualDock(Form1);
    end;

To nie jest rozwiązanie, tylko drutowanie.

Nie tworzy, gdy jest już utworzona,

Nie.
Nie tworzy, jeśli nie istnieje Frame2 na oknie z którego wywołujesz kod.
Ale jeśli będzie ta ramka istniała gdziekolwiek indziej, to będziesz miał ją utworzoną po raz kolejny.
Tak ma być?

ale teraz szukam pomysłu innego.

Napisałem o jednym z możliwych rozwiązań.

Gdy mam np kilka framesów, a ostatni przykrywa wszystkie poprzednie (onClient), jak wyrzucić wskazany frames na górę?

Frame.BringToFront powinno zadziałać.
Tylko po co mieć kilka ramek, które przykrywają inne i tym samym pozostałe nie są widoczne?
Tego nie rozumiem w ogóle...

0
wloochacz napisał(a):

ale teraz szukam pomysłu innego.

Napisałem o jednym z możliwych rozwiązań.

Gdy mam np kilka framesów, a ostatni przykrywa wszystkie poprzednie (onClient), jak wyrzucić wskazany frames na górę?

Frame.BringToFront powinno zadziałać.
Tylko po co mieć kilka ramek, które przykrywają inne i tym samym pozostałe nie są widoczne?
Tego nie rozumiem w ogóle...

Wiem, chciałem sprawdzić czy z framami jest tak samo jak z formami.

1 użytkowników online, w tym zalogowanych: 0, gości: 1