2015-12-12 2 views
1

Я думаю, что это вопрос, который время от времени появляется здесь, но я просмотрел множество вопросов и не нашел для меня правильного ответа.Ребенок всегда на вершине родителя

У меня есть родительская форма со всеми «нормальными» атрибутами, и теперь я просто создал дочернюю форму с «нормальными» атрибутами. В моей родительской форме у меня есть ListView, когда я нажимаю на какой-то элемент в моем ListView, я открываю дочернюю форму.

Теперь мне нужно сохранить эту дочернюю форму поверх основной формы, а когда я минимизирую ребенка, верх также минимизируется, когда я максимизирую программу, я вижу только дочернюю форму, пока не закрою ее форма. Таким образом, основная форма с ListView будет недоступна, пока я не закрою дочернюю форму. Если я выберу другой элемент из списка ListView, я снова открою дочернюю форму с тем же поведением.

Я не знаю, трудно ли этого достичь, но я не нашел его в Google. Вот мой простой демонстрационный код:

unit Unit1; 

var 
    Form1: TForm1; 


implementation 

uses Desktop; 

procedure TForm1.RemoteDesktop1Click(Sender: TObject); 
var 
    DesktopForm: TForm2; 
begin 
    DesktopForm:= TForm2.Create(Self); 
    DesktopForm.Show; 
end; 

И блок Desktop просто VCL Form, без какого-либо кода.

+0

Настоящая проблема заключается в том, что вы позволяете минимизировать модальную форму. –

ответ

2

Использование showModal , Чтобы свести к минимуму MainWindow (все окна, минимизировать приложение на самом деле), вы должны переопределить WMSysCommand в дочерней форме:

procedure WMSyscommand(var Msg: TWmSysCommand); message WM_SYSCOMMAND; 

. 
. 
. 
procedure TForm2.WMSysCommand(var Msg: TWmSysCommand); 
begin 
    case (Msg.CmdType and $FFF0) of 
    SC_MINIMIZE: begin 
        Msg.Result := 0; 
        EnableWindow(Application.Handle, True); 
        Aplication.Minimize; 
        end; 
    else inherited; 
    end; 
end; 

Также Форма события WindowStateChange может использоваться на не Windows.

Я проверил простой тест без обработки этого события на LXDE Fedora23 (Lazarus), все формы были минимизированы при использовании модальных данных.

+0

Я положил объявление процедуры на приватное в TForm1 (основная форма) и использовал ShowModal для отображения дочерней формы, но при минимизации основная форма все еще открыта, она не сводится к минимуму вместе ... – LessStress

+0

Это работает, если я ставлю ваша процедура в модальной форме, а не в основной форме. Я согласен с ответом, но подумайте над добавлением этого изменения. – LessStress

+0

использовать его в дочерней форме – kwarunek

1

Это звучит, как вы хотите модальную форму

DesktopForm.ShowModal; 

вместо

DesktopForm.Show; 

вы, вероятно, захотите установить

Application.ModalPopupModel к pmAuto также

+0

Я пробовал это прямо сейчас, но когда я минимизирую модальную форму, я до сих пор вижу основную форму. Мне нужно, чтобы он был свернут вместе. – LessStress

Смежные вопросы