Witam !
Buduję aplikacje wielookienkową i stwierdziłem, że najlepszym rozwiązaniem będzie zastosowanie okien potomnych.
Potomnych, jasne - ale czy na pewno MDI? Prawie w ogóle się tego dziś nie używa...
A co to w ogóle za aplikacja, czyli jakie dane będą prezentowane na tych oknach?
Wszystko fajnie ale napotkałem jeden problem. Otóż:
Główne okno czyta port szeregowy. Po otrzymaniu danego ciągu danych wyszukuje odpowiednią formę i wywołuje jej procedurę która ma utworzyć wiadomość zwrotną.
Moim zdaniem, powinieneś rejestrować te okna w strukturze TDictionary
(lub podobnej, nawet w posortowanym TStringList i dodawać okna przez StringList.AddObject
), po to aby mieć szybki i pewny dostęp do ich instancji. Iteracja jest OK, ale taka jakaś krzywa...
Procedury z głównego okna wywołuje bezproblemowo jednak: Wywołane funkcje działają ale nie mają dostępu do zmiennych i właściwości swojej klasy. Procedury zdarzeniowe (np. kliknięcie btn) mają do nich dostęp ale gdy wywoła je główna forma to już nie.
Wyszukiwanie formy i uruchamianie procedury w danym oknie
Kopiuj
MdiIndex := -1;
for i:=0 to MDIChildCount-1 do
if TChildWin(MDIChildren[i]).Config.ID = SearchID then
MdiIndex := i;
if MdiIndex >= 0 then
TChildWin(MDIChildren[i]).AnalyzeFrame(RecvArr,RecvStep);
Czy coś mogłem przeoczyć ?
Tak, nie sprawdzasz czy okna są potomkiem klasy TChildWin, a więc:
Kopiuj
MdiIndex := -1;
for i:=0 to MDIChildCount-1 do
if (MDIChildren[i] is TChildWin) and (TChildWin(MDIChildren[i]).Config.ID = SearchID) then
MdiIndex := i;
if MdiIndex >= 0 then
TChildWin(MDIChildren[i]).AnalyzeFrame(RecvArr,RecvStep);
Ale nie podoba mi się ten kod, napisałbym go zupełnie inaczej.
Przede wszystkim wydzieliłbym funkcjonalność AnalyzeFrame
to osobnego interfejsu, który dana klasa (okna, ale nie może być dowolna) implementowałaby go przez delegację.
Dodatkowo rejestrowałbym takie interfejsy we własnej strukturze, tak aby był szybki i pewny dostęp do danych.
Całą interakcję z oknem zrobiłbym na zasadzie kontroloera, tak aby zajął się tylko obsługa danego interfejsu i powiadamianiem odpowiednich kontrolek o zmianie stanu.
Jeśli masz dostęp do Delphi od XE2 w górę, to można to zrobić o wiele łatwiej i szybciej korzystając z System.Generic.Collections
oraz LiveBindings
.