Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 При создании MDIChild все приложение пропадает с экрана  [new]
Devillio
Member

Откуда: Волгоград
Сообщений: 264
Добрый день!

Понимаю как глупо звучит ) но, может, кто сталкивался, помогите, пож-та :)
Есть несколько разных MDI окон. Перед их созданием делаю LockWindowUpdate(Self.Handle);, после окончания всех чтений делаю (0) - все нормально красиво без хлюпаний открывается.
Блин, при открытии одного из MDI на долю секунды исчезает все приложение (с экрана и с панели задач), по окончании создания окна появляется обратно. Остальные MDI (других типов) открываются нормально, "красиво". На всех окнах dxLayoutControl с кучей элементов.
Путем отсеканий выяснил, что происходит сие в момент создания окна:
  try
    LockDrawing;
    ProgressBarPostMessage('Пожалуйста, подождите...', 'Переходим к замечаниям', 100, 0);
    Application.CreateForm(TMDIExpertise, MDIExpertise);
    Sleep(2000); // - тут лицезрею пустой экран
    (MainForm.ActiveMDIChild as TMDIExpertise).IDStatement := IDState;
    (MainForm.ActiveMDIChild as TMDIExpertise).IDContract := IDContr;

    (MainForm.ActiveMDIChild as TMDIExpertise).ReadData;

  finally
    UnLockDrawing;
    ProgressBarClose();
  end;

В TMDIExpertise.OnCreate, TMDIExpertise.OnShow все убрал для проверки - все равно приложение исчезает.
Может я где-то какую-то галочку включил?

Спасибо!
14 сен 18, 11:20    [21674495]     Ответить | Цитировать Сообщить модератору
 Re: При создании MDIChild все приложение пропадает с экрана  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5064
Что такое LockDrawing?
14 сен 18, 11:22    [21674503]     Ответить | Цитировать Сообщить модератору
 Re: При создании MDIChild все приложение пропадает с экрана  [new]
Devillio
Member

Откуда: Волгоград
Сообщений: 264
Квейд,

+ это типа чтобы не шморгало когда прорисовывается
procedure TMainForm.LockDrawing;
begin
//1 вариант:
    LockWindowUpdate(Self.Handle);

//2 вариант:
//    SendMessage(ClientHandle, WM_SETREDRAW, 0, 0);

//3 вариант:
//  Application.ProcessMessages; // finish any pending updates
//  SendMessage(self.ClientHandle, WM_SETREDRAW, 0, 0);
end;

procedure TMainForm.UnLockDrawing;
begin
//перенос в таймер
  TimerUnlockDrawing.Enabled := False;
  TimerUnlockDrawing.Enabled := True;
end;

procedure TMainForm.TimerUnlockDrawingTimer(Sender: TObject);
begin
//1 вариант
  TimerUnlockDrawing.Enabled := False;
  LockWindowUpdate(0);

//2 вариант
//    SendMessage(ClientHandle, WM_SETREDRAW, 1, 0);
//    RedrawWindow(ClientHandle, nil, 0, RDW_FRAME
//      or RDW_INVALIDATE or RDW_ALLCHILDREN
//      or RDW_NOINTERNALPAINT or RDW_UPDATENOW);

//3 вариант
//  SendMessage(self.ClientHandle, WM_SETREDRAW, 1, 0);
//  RedrawWindow(self.ClientHandle, nil, 0,
//    RDW_FRAME or RDW_INVALIDATE or RDW_ALLCHILDREN or RDW_UPDATENOW);
end;
14 сен 18, 11:44    [21674533]     Ответить | Цитировать Сообщить модератору
 Re: При создании MDIChild все приложение пропадает с экрана  [new]
Devillio
Member

Откуда: Волгоград
Сообщений: 264
Квейд, пробовал отключать
 try
//    LockDrawing;
//    ProgressBarPostMessage('Пожалуйста, подождите...', 'Переходим к замечаниям', 100, 0);

тоже пропадает
14 сен 18, 11:46    [21674534]     Ответить | Цитировать Сообщить модератору
 Re: При создании MDIChild все приложение пропадает с экрана  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 53452
Блог
Devillio
procedure TMainForm.LockDrawing;
begin
//1 вариант:
    LockWindowUpdate(Self.Handle);


Уже есть повод оторвать руки. Фрагмент нереентерабелен и Unlock имеет все шансы снять чужую блокировку.

Devillio
Application.CreateForm(TMDIExpertise, MDIExpertise);

Такая строчка для MDI-окна - мягко говоря, крайне подозрительна. MDI окна идеологически существуют в нескольких экземплярах. Переменная MDIExpertise физически существует в одном экземпляре. Использование глобальных переменных форм - плохой путь вообще, а в случае MDI - прямой путь к многочисленным ошибкам.

Devillio
Путем отсеканий выяснил, что происходит сие в момент создания окна:

Лично я посоветовал бы уйти от проблемы в принципе, обойдя дельфово-виндовый идиотизм:

Form := TSomeForm.Create(Application); // создадим нормальное окно
Form.Setup(...); // инициализируем его как нам нужно
Form.Style := fsMDIChild; // и только после этого выпихнем в MDI и сделаем видимым
14 сен 18, 13:10    [21674647]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить