2016-06-03 10 views
0

Ich habe eine Hauptform, mit mehreren Panels, von denen einige ausgeblendet sind. Wenn der Benutzer mit dem Hauptformular interagiert, muss ich einige der ausgeblendeten Bereiche sichtbar machen und sie in einer modalen Weise anzeigen, so dass der Benutzer nicht mit den anderen Teilen des Hauptformulars interagieren kann, bis sie mit dem Modal Panel abschließen .Anzeige TPanel als Modal

Gibt es eine Möglichkeit, ein vorhandenes Bedienfeld in einem Formular modal anzuzeigen?

Ich würde gerne nicht Zyklus durch die wichtigsten Formen Kontrollen und deaktivieren/verstecken alles außer für das eine Panel, das ist die gemeinsame Antwort Entwickler haben gegeben, wenn andere diese gleiche Frage gestellt haben.

Mein Ziel ist es, einfach ein vorhandenes Panel auf dem Hauptformular in einer modalen Weise anzuzeigen, ohne die anderen Steuerelemente auf dem Hauptformular zu manipulieren.

+0

Werfen Sie einen Blick auf [Wie lege ich eine halbtransparente Schicht auf mein Formular] (http://stackoverflow.com/questions/11867215/). Antworten zeigen, wie ein halbtransparentes modales Overlay über einem TForm angezeigt wird, während bestimmte Steuerelemente durch das Overlay angezeigt werden können. Sie könnten eine ähnliche Technik verwenden, aber das Overlay-TForm im Code erstellen, anstatt einen DFM zu verwenden. Dann können Sie das Bedienfeld anzeigen und dann das Overlay anzeigen, um die Interaktion mit dem Formular des Bedienfelds zu blockieren, bis das Bedienfeld ausgeblendet und das Overlay geschlossen ist. –

+0

Wie wechselt der Benutzer die Panels? Kannst du nicht einfach die Bedingungen kontrollieren, die es ihnen erlauben, sich hin und her zu bewegen? –

+0

@JohnKouraklis - Möglicherweise, aber in diesem Fall haben die versteckten Panels mehrere Teile, die sich ändern, wenn der Benutzer mit dem Rest des Formulars interagiert. Benutzer können auf eine Reihe von Schaltflächen klicken, um eines der ausgeblendeten Felder nach Bedarf zu aktivieren. Für unseren Anwendungsfall funktioniert das sehr gut. –

Antwort

1

Da ein TForm hat .ShowModal(), können wir leicht eine temporäre Form schaffen, die TPanel in das Formular verschieben, das Formular als modale anzuzeigen, für den Benutzer warten, um die Form zu schließen, dann bewegen Sie den TPanel wieder in seinen ursprünglichen Eltern vor Zerstörung der TForm.

Wenn Sie ein Formular mit einem versteckten TPanel genannt pnl und einen Knopf auf diesem Panel namens btnCloseModalPanel erstellen, dann wird der folgende Code zeigt pnl als modal, bis der Benutzer auf die Schaltfläche klickt.

begin 
    DisplayModalPanel(pnl); 
    // do something with 'pnl.data...' 
end; 

procedure TForm1.DisplayModalPanel(Panel: TPanel); 
var 
    frm: TForm; 
    old_top, old_left: Integer; 
    old_parent: TWinControl; 
    old_visible: Boolean; 
begin 
    frm := TForm.Create(Panel.Parent); 
    try 
    frm.BorderStyle := bsNone; 
    frm.Position := poOwnerFormCenter; 
    frm.Tag := 12921; // test in close button click, so we don't close the wrong form 

    // Rememer properties we can change and then restore them 
    old_top := Panel.Top; 
    old_left := Panel.Left; 
    old_parent := Panel.Parent; 
    old_visible := Panel.Visible; 

    // Move the panel to the modal form 
    Panel.Parent := frm; 
    Panel.Top := 0; 
    Panel.Left := 0; 
    Panel.Visible := True; 

    // Display the modal form 
    frm.AutoSize := True; 
    frm.ShowModal; 

    // Restore everything 
    Panel.Visible := old_visible; 
    Panel.Parent := old_Parent; 
    Panel.Left := old_left; 
    Panel.Top := old_top; 
    finally 
    FreeAndNil(frm); 
    end; 
end; 

procedure TForm1.btnCloseModalPanelClick(Sender: TObject); 
var 
    frm: TForm; 
begin 
    if pnl.Parent is TForm then 
    begin 
    frm := pnl.Parent as TForm; 
    if frm.Tag = 12921 then // don't close the wrong form 
     frm.Close; 
    end; 
end; 
+2

Anstatt alle Flip-Floping mit dem Panel "Eltern" (die Nebenwirkungen ruft), würde ich einfach das Panel auf ein TForm setzen und es dort die ganze Zeit. Halte das TForm verborgen, wenn es nicht benutzt wird, und zeige es modal bei Bedarf. –

+0

@RemyLebeau - Was sind die Nebenwirkungen beim Ändern der Eltern? Ich sehe OldForm.RemoveControl() und NewForm.InsertControl() und UpdateAnchorRules(), aber sonst nichts. Gibt es etwas, worüber ich mir Sorgen machen sollte? –

+0

Ich müsste es mir noch einmal ansehen, aber von meinem Kopf her scheint es sich zu erinnern, dass es Fensterreproduktionen verursacht und Neuausrichtungen steuert, usw. Wenn das Panel ausgeblendet wird, wenn sein Elternteil geändert wird, geschieht dieser Overhead sogar noch obwohl der Benutzer es visuell nicht wahrnimmt. –