Migracja z Delphi - MDI w Lazarusie

0

0678e45411b95.jpg

Mam bardzo starą aplikację nie aktualizowaną przez lata, opartą na MDI, którą chcę przenieść z Delphi do Lazarusa i mam z tym duże trudności.

Aplikacja jest skonstruowana mniej więcej tak jak widać na zrzucie. Jest główne okno (MDIForm) które robi za tło :-) i na nim wyświetlane są właściwe okna aplikacji (MDIChild). Schemat jest taki że np. jakaś lista rekordów użytkownik wchodzi w rekord, okno z listą znika a pojawia się okno edycji, użytkownik zapisuje zmiany, okno edycji znika, lista pojawia się z powrotem. Oczywiście tych poziomów jest trochę więcej ale schemat jest ten sam.

W Lazarusie z tym jest problem bo MDI jest skopane, np jak kliknę na główne okno MDIForm to MDIChild się za nie chowa a w Delphi zawsze okna MDIChild były na wierzchu.

Kombinuje teraz co zrobić żeby to wyglądało podobnie ale technicznie bardziej nowocześnie/poprawnie. Próbowałem zrobić to na ramkach TFrames ale też były problemy. Można pewnie też na panelach TPanel ale to już duży bałagan się robi.

Rozpisałem się ale już przechodzę do sedna. Chciałbym porzucić ten kłopotliwy wygląd MDI i zrobić to że tak powiem "zgodnie ze sztuką" za pomocą zwykłych form TForm.

Proszę o jakieś rady jak to zrobić, tak by użytkownicy nie doznali szoku jak dostaną nową wersją i żeby aplikacja była łatwiejsza w utrzymaniu na przyszłość.

dodanie obrazka do załączników posta - @furious programming

1

W Lazarusie z tym jest problem bo MDI jest skopane, np jak kliknę na główne okno MDIForm to MDIChild się za nie chowa a w Delphi zawsze okna MDIChild były na wierzchu.

Formularz podrzędny (MDIChild) będzie znajdował się wewnątrz formularza rodzica, jeśli stworzy się go metodą CreateParented, podając w parametrze tego konstruktora uchwyt okna rodzica; Ale i tak to okno potomne działa dziwacznie;

Kombinuje teraz co zrobić żeby to wyglądało podobnie ale technicznie bardziej nowocześnie/poprawnie.

No to zrezygnuj z MDI;

Próbowałem zrobić to na ramkach TFrames ale też były problemy. Można pewnie też na panelach TPanel ale to już duży bałagan się robi.

Ramki służą raczej do czegoś innego, niż udawanie funkcjonalności MDI; Z resztą samo potomne okno MDI można zrobić ręcznie, tworząc zwykły komponent grupujący, dziedziczący z TWinControl; Wystarczy go wyposażyć w funkcje przesuwania i rozciągania; Tyle że to i tak nie będzie 100% funkcjonalności MDI;

Rozpisałem się ale już przechodzę do sedna. Chciałbym porzucić ten kłopotliwy wygląd MDI i zrobić to że tak powiem "zgodnie ze sztuką" za pomocą zwykłych form TForm.

No dobrze, ale z czym konkretnie masz problem, jeśli chodzi o obsługę zwyczajnych formularzy?

0
furious programming napisał(a):

Formularz podrzędny (MDIChild) będzie znajdował się wewnątrz formularza rodzica, jeśli stworzy się go metodą CreateParented, podając w parametrze tego konstruktora uchwyt okna rodzica; Ale i tak to okno potomne działa dziwacznie;

Dzięki za wskazanie metody CreateParented. Dlaczego mówisz że okno tak tworzone działa dziwacznie? Z moich pierwszych testów jestem zadowolony, niczego dziwnego nie zaobserwowałem.

1

A ja zaobserwowałem same dziwne rzeczy :]

Tuż po otwarciu testowego programu, w którym drugi formularz (ze stylem fsMDIChild) jest nieaktywny, ale ładnie należy do formularza rodzica; Zrzut poniżej:

run.png

Jeśli kliknę na formularz potomny, to jego belka nadal pozostaje blada, czyli nieaktywna; Wygląda tak jak na powyższym zrzucie, choć powinna przybrać kolory aktywnego okna; Najdziwniejsze jest przemalowywanie okna potomnego, po jego zmaksymalizowaniu; Formularz potomny maksymalizuje się poprawnie, ale fragment jego powierzchni nie zostaje odświeżony - efekt poniżej:

maximize.png

Schowanie aplikacji do paska zadań wiele nie pomaga, bo po przywróceniu aplikacji na pulpit nadal formularz-dziecko jest "niedomalowany"; Do tworzenia formularza potomnego używam kodu znalezionego na forum Free Pascala:

procedure TForm1.FormCreate(Sender: TObject);
begin
  Form2 := TForm2.CreateParented(Self.Handle);
  Form2.Left := 30;
  Form2.Top := 30;
  Form2.Show();
end;

Korzystam z Lazarusa 1.2.4 pod WinXP 32-bit; Nie wiem dlaczego tak jest, dlatego że nigdy namiętnie nie korzystałem z MDI, a tym bardziej pod Lazarusem - w Delphi7 takiego problemu nie zaobserwowałem.

0

Oba te problemy od razu zauważyłem ale w moim przypadku nie mają żadnego wpływu. Moi użytkownicy na pewno się nie zorientują że okno potomne wygląda jak nieaktywne a ci co to zauważą to pomyślą że tak ma być. Problem z odmalowywaniem okna po maksymalizacji jest dużo poważniejszy ale na szczęście ja już w starej wersji maksymalizację miałem zablokowaną a okna mają stałe rozmiary.

U mnie wyszło też że okna potomne nie zliczają się do MDIChildCount, cały czas jest 0. W starej wersji miałem też zrobione ukrywanie przycisków zminimalizowanych okien, w Lazarusie to nie działa i są one widoczne w lewym dolnym roku ale zasłania jest StatusBar.

Dzięki za pomoc furious programming.

1

MDI to wynalazek z którego wycofał się sam autor (MS - chyba).
Nie wiem po co ludzie to stosują - więcej problemów niż pożytku.

Zobacz:
http://blogs.adobe.com/acrobat/mdi_vs_sdi_in_acrobat/

Microsoft advised that to work as good as possible on Vista, applications should avoid MDI.

oraz:
http://pixelcentric.net/article-art=docs.html
http://en.wikipedia.org/wiki/Multiple_document_interface#Disadvantages

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