Hi,
Mit normalen Panels wäre das zwar möglich, ich müßte dann aber bei jedem
Wechsel von Hand alle Panels bis auf das aktive unsichtbar schalten,
Du bräuchtest nur das eine gerade aktive unsichtbar schalten, alle anderen
sind bereits unsichtbar:
procedure TForm1.ActivatePanel(aPanel:TPanel);
begin
// Vorhang zu
if Assigned(FActivePanel) then
FActivePanel.Visible:=False;
// Bühne umbauen
FActivePanel:=aPanel:
// Vorhang auf
if Assigned(FActivePanel) then
FActivePanel.Visible:=True;
end;
Aber auch eine Schleife über alle Panels ist kein Problem. Ein Zugriff
auf Visible der nichts ändert kostet auch praktisch nix:
procedure TForm1.ActivatePanel(aPanelTag:integer);
var i:integer;
begin
for i:=Low(FPanels) to High(FPanels) do
FPanels[i].Visible:=(FPanels[i].Tag=aPanelTag);
end;
Ob das wirklich unelegant ist? Die Tag-Eigenschaft habe ich hier nur
verwendet weil es sie schon gibt, besser wäre ein eigener Typ der Deine
Panels aufzählt:
type TPanelType=(ptEingang,ptAusgang,ptHergang,ptGehoergang,..);
Und im Formular dann etwas wie:
private
FPanels:array[TPanelType] of TPanel;
Mit einer Methode, die sie beim Start alle einsammelt:
procedure TForm1.PopulatePanels;
begin
FPanels[ptEingang]:=pnEingang;
..
{$IFOPT ASSERTIONS}
for i:=Low(TPanelType) to High(TPanelType) do
Assert(FPanels[i]<>NIL,Format('Panel für Type %d nicht
zugewiesen.',[ord(i)]));
{$ENDIF}
end;
Außerdem ist das Arbeiten damit während der Entwurfszeit ein Krampf.
Das ist mit einem Formular mit vielen vielen Tabsheets und deshalb
zweimal vielen vielen Komponenten ohnehin ein Krampf.
Als Abhilfe kommt in Frage die Seiten jeweils als eigenes Formular
zu entwerfen und dann das große Formular erst zur Laufzeit
zusammenzubauen. Zum Beispiel so:
procedure TForm1.InitializePages;
function DockForm(aForm:TForm):TForm;
begin
aForm.Parent:=Self;
aForm.Align:=alClient;
aForm.BorderStyle:=bsNone;
Result:=aForm;
end;
begin
FPanels[ptEingang]:=DockForm(TfmEingang.Create(Self));
..
end;
Das lässt sich dann in zweierlei Weise dynamisieren. Erstens muss die
Anzahl und der Typ der einzelnen Seiten zur Übersetzungszeit noch gar
nicht feststehen. Das könnte sich erst zur Laufzeit ergeben - etwa aus
installierten und lizensierten Modulen. Und zweitens kann man die
Erzeugung einer solchen Seite verschieben bis sie das erste Mal
gebraucht wird, damit ist das Fenster schneller instanziiert und
angezeigt, die Zeit verteilt sich dann auf das Aufblättern der anderen
Seiten. Auch in der Summe ist die Zeit aber geringer, weil intern
weniger Notifications auftreten.
Nachteil der Methode ist, daß eine Seite nicht ohne weiteres auf die
Steuerelemente auf anderen Seiten zugreifen kann. Das muss dann jeweils
wohldefiniert und im Einzelfall zugelassen passieren. Ist das wirklich
ein Nachteil? Das kommt darauf an, wie Du es allgemein mit der Kapselung
hältst :-).
Vorteil: Du kannst statt die Seiten hintereinander anzuzeigen diese auch
wahlweise nebeneinander halten. Vielleicht will man eine Seite "abreissen"
und als freies Fenster darstellen?
Hat da jemand einen Tipp für mich?
Dutzende :-).
Ciao, MM
--
Marian Aldenhövel, Rosenhain 23, 53123 Bonn. +49 228 624013.
http://www.marian-aldenhoevel.de
"Flying an An-2 is like making love to a fat lady who's had too much to drink:
there's a lot to work with, it's unresponsive, you're never quite sure when
you're there, and it's big-time ugly."