Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - TForm.Parent=Panel


ToZie - Mi 08.11.06 00:17
Titel: TForm.Parent=Panel
Huhu ihr Lieben,

ich möchte ein komplettes Formular in einem Panel eines anderen Formulars anzeigen. Ich setze dazu Borderstyle auf bsNone, Align auf alClient, den Parent auf das Panel und mache das Formular anschließend sichtbar - geht auch soweit.

Irgendwie bekomme ich es allerdings nicht hin danach ein Control auf dem Formular zu aktivieren. Versuche per ActiveControl=Edit1 werden mit dem lakonischen Hinweis abgetan das Control sei nicht sichtbar. Mit der Maus oder per Tab lässt es sich allerdings ansteuern.

Irgendwelche Hinweise?

Ziel soll es sein alle Formulare der Anwendung im gleichen 'Arbeitsbereich' des Hauptformulars anzuzeigen. Die gesamte Funktionalität in ein Formular zu packen und per sichbarmachen / verstecken von Panels den Effekt zu erreichen widerstrebt mir irgendwie. Gibt's dafür vielleicht andere Ansätze?

Vielen Dank schonmal

Torsten


Coder - Mi 08.11.06 01:08

Schau dir mal Frames an.

MfG


oldmax - Mi 08.11.06 06:48

Hi
Du kannst bspw. PageControls einsetzen, oder aber du setzt deine Fenster separat ein und aktivierst sie in der Form :

Delphi-Quelltext
1:
2:
3:
4:
Application.CreateForm(TMySecondForm,MySecondForm);
MySecondForm.Visible:= False;
MySecondForm.ShowModal;
MySecondForm.Free;

Diese Form erzeugst du zur Laufzeit und schiebst sie unter Projekt-> Optionen von automatisch erzeugte Formulare in verfügbare Formulare. Durch ShowModal muß der Anwender mach der Arbeit dieses Formular wieder schließen, um zur Hauptform zurückzukehren. Den Aufruf des Fensters kannst du bspw. über beliebige Ereignisse oder If-Bedingungen abhängig machen. Aber Vorsicht mit Timern, da solltest du den Timer vor Form-Aufruf auf False und nachher wieder auf True setzen.
Ok, vielleicht hilft's.
Gruß oldmax


ToZie - Mi 08.11.06 10:55

Ok, stupid me. Parent des zu aktivierenden Controls wird natürlich das Formular mit dem Panel. So geht's:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure SetWinControlActive(ThisControl: TWinControl);
var
  aParent: TWinControl;
begin
  aParent:=ThisControl; repeat aParent:=aParent.Parent until aParent.Parent=nil;
  if (aParent <> nil) and (aParent is TCustomForm) and ThisControl.Visible
    then with aParent as TCustomForm do ActiveControl:=ThisControl
    else raise EInvalidOperation.Create(SCannotFocus);
end;