Announcement

Collapse
No announcement yet.

Child-Formulare

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Child-Formulare

    Hallo,

    ich möchte meine Child-Formulare (in sich fast zu 90% alleinige kleine Applikationen) im Hauptfenster anzeigen lassen.

    Folgendes sollten sie erfüllen:
    - immer auf "Maximized" offen sein (nicht veränderbar in der Grösse)
    - kein nachflimmern, wenn es erzeugt, resp. geöffnet wird.
    - sollte möglich sein, dass sie nicht bereits zu Programmstart geöffnet werden müssen.

    -> Idee: wie, wenn man mit dem guten alten TNotebook arbeiten würde

    Hat da jemand eine gute Idee, wie man dies am Besten angeht und löst.

    MfG Adi Emmenegger

  • #2
    Hallo,

    die folgenden Auszüge stammen aus einem Beispielprojekt aus meinem Buch <i>Client/Server-Datenbankentwicklung mit Delphi</i>. Beim Aufruf wird das Formular je nach dem verwendeten Constructor entweder als normales eigenständiges Fenster oder als im Hauptformular eingebettes Child-Fenster angezeigt:
    <pre>
    type
    TFormKundeExt = class(TForm)
    PanelTop: TPanel;
    ....
    private
    FAsChild: Boolean;
    FTempParent: TWinControl;
    protected
    procedure CreateParams(var Params: TCreateParams); override;
    procedure Loaded; override;
    public
    constructor Create(AOwner: TComponent); overload; override;
    constructor Create(AOwner: TComponent;
    AParent: TWinControl); reintroduce; overload;
    end;
    </pre>

    <pre>
    {---------------------------------------------------------------------}
    { Formular ist modaler Dialog oder auch nur ein Childfenster }
    {---------------------------------------------------------------------}

    constructor TFormKundeExt.Create(AOwner: TComponent);
    begin
    FAsChild := False;
    inherited Create(AOwner);
    end;

    constructor TFormKundeExt.Create(AOwner: TComponent; AParent: TWinControl);
    begin
    FAsChild := True;
    FTempParent := aParent;
    inherited Create(AOwner);
    end;

    procedure TFormKundeExt.Loaded;
    begin
    inherited;
    if FAsChild then
    begin
    Align := alClient;
    BorderStyle := bsNone;
    BorderIcons := [];
    Parent := FTempParent;
    Position := poDefault;
    end;
    end;

    procedure TFormKundeExt.CreateParams(var Params: TCreateParams);
    Begin
    Inherited CreateParams(Params);
    if FAsChild then
    Params.Style := Params.Style or WS_CHILD;
    end;
    </pre>

    Aufruf: Normal oder eingebettet

    <pre>
    procedure TFormMain.ActionFrmModalExecute(Sender: TObject);
    begin
    FormKundeExt := TFormKundeExt.Create(Application);
    try
    FormKundeExt.ShowModal;
    finally
    FormKundeExt.Release;
    end;
    end;

    procedure TFormMain.ActionFrmChildExecute(Sender: TObject);
    begin
    with TFormKundeExt.Create(Application, PanelMain) do
    Show;
    PrgIdle := False;
    Width := Width + 1;
    end;
    </pre&gt

    Comment


    • #3
      Hi

      Die Eigenschaft IsControl := True setzen, bei den Childformularen. Ansonsten gibt es bestimmte Nebeneffekte, wie falsche Focusreihenfolge etc.

      Gruß Hage

      Comment


      • #4
        Hallo Herr Kosch und Herr Reddmann,

        nun habe ich den Versuch gestartet, die von Ihnen vorgeschlagene Vorgehensweise anzuwenden, doch leider war ich nicht in der Lage, zu einem Ergebnis zu kommen. Auch die CD des Buches, aus dem der Vorschlag ja kam, brachte mich nicht weiter, da ich das Project mit Delphi 4 nicht öffnen konnte.

        Der Fehler beim Aufrufen T..Fenster.create(Application,Mainform) lautete, 'ein deaktiviertes oder nicht sichtbares Fenster kann nicht den Focus erhalten'. Die Eigenschaft Visible war aber True.
        Wenn ich das Programm dann weiter laufen (trotz des Fehlers) erscheint das Fenster zwar im Freien Childbereich des MainForm's, hat aber einen Offset.

        Wenn ich die Eigenschaft IsControl = True gemäß der Delphi-Dokumentation im Formular als Text setzte, dann kommt es zu einem Stream Fehler.

        Vielen Dank für Hilfe im Vorasus

        Gruß Thoma

        Comment


        • #5
          Hi Thomas

          Also bei mit klappt das wunderbar. Du legst ein TForm2 (Hauptformular) an. Auf dieses ein TPageControl mit zwei TabSheets. Nun, noch ein neues TForm3 mit verschiedenen Controls.

          TForm3.Visible := False; TForm3.FormStyle := fsNormal;
          TForm2.Visible := True; TForm2.FormStyle := fsNormal;

          nun noch von TForm2 das Event OnCreate;

          <pre>

          implementation<br>

          uses Unit3; // enthält TForm3<br>

          procedure TForm2.FormCreate(Sender: TObject);
          var
          F: TForm;
          begin
          F := TForm3.Create(Self);
          TForm2(F).IsControl := True;
          F.Parent := Self.TabSheet1;
          F.Align := alClient;
          F.BorderStyle := bsNone;
          F.Caption := '';
          F.Visible := True;

          F := TForm3.Create(Self);
          TForm2(F).IsControl := True;
          F.Parent := Self.TabSheet2;
          F.Align := alClient;
          F.BorderStyle := bsNone;
          F.Caption := '';
          F.Visible := True;
          end;<br>

          </pre>

          Gruß Hagen

          </pre&gt

          Comment


          • #6
            Hi Hagen,

            vielen Dank, ich bin begeistert!!!

            Danke

            Thoma

            Comment


            • #7
              Hallo,
              ich habe entsprechend den vorstehenden Anleitungen mehrere Child-Fenster in tabSheets eines PageControl-Elements eingefügt.

              Mein Problem dabei:
              Jedes dieser Fenster hat die gleichen Schaltflächen (TButton) Neu, Bearbeiten, Löschen...
              Ich möchte dabei für jeden Schalter einen Buchstaben als Accelerator festlegen (also &Neu usw).
              Da alle Fenster in das Hauptfenster eingefügt sind, kommt das Programm jetzt mit den Schaltfächen durcheinander, wenn der Nutzer z.B. Alt+N drückt. Es wird beim Umschalten zwischen den Fenstern nicht auf das neue Fenster umgeschalten.

              Kann jemand dieses Problem lösen?
              Danke
              Ger

              Comment


              • #8
                Hi

                Angenommen jedes Child-Form ist in seinem eigenen TabSheet platziert. Beim Umschalten (PageControl.OnChange) sollten ALLE nicht sichtbaren ChildForms.Enabled := False und NUR das ChildForm vom aktuellen TabSheet Enabled := True sein. Enabled := False und Vidible := False produzieren unterschiedliche Ergebnisse, da auch ein Nichtsichtbares Form unter Umständen auf ShortCuts reagieren soll, ein Disabled Form soll aber unter keinen Umständen mehr erreichbar sein.

                Gruß Hage

                Comment


                • #9
                  Danke, dass geht so.
                  Ger

                  Comment


                  • #10
                    Danke, war mir selber nicht so sicher, da viele Sachen nicht funktionieren die logisch gesehen funktionieren sollten

                    Gruß Hage

                    Comment

                    Working...
                    X