powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / При создании MDIChild все приложение пропадает с экрана
5 сообщений из 5, страница 1 из 1
При создании MDIChild все приложение пропадает с экрана
    #39702506
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Понимаю как глупо звучит ) но, может, кто сталкивался, помогите, пож-та :)
Есть несколько разных MDI окон. Перед их созданием делаю LockWindowUpdate(Self.Handle);, после окончания всех чтений делаю (0) - все нормально красиво без хлюпаний открывается.
Блин, при открытии одного из MDI на долю секунды исчезает все приложение (с экрана и с панели задач), по окончании создания окна появляется обратно. Остальные MDI (других типов) открываются нормально, "красиво". На всех окнах dxLayoutControl с кучей элементов.
Путем отсеканий выяснил, что происходит сие в момент создания окна:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  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 все убрал для проверки - все равно приложение исчезает.
Может я где-то какую-то галочку включил?

Спасибо!
...
Рейтинг: 0 / 0
При создании MDIChild все приложение пропадает с экрана
    #39702512
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что такое LockDrawing?
...
Рейтинг: 0 / 0
При создании MDIChild все приложение пропадает с экрана
    #39702532
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Квейд,

это типа чтобы не шморгало когда прорисовывается
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
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;

...
Рейтинг: 0 / 0
При создании MDIChild все приложение пропадает с экрана
    #39702533
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Квейд, пробовал отключать
Код: pascal
1.
2.
3.
 try
//    LockDrawing;
//    ProgressBarPostMessage('Пожалуйста, подождите...', 'Переходим к замечаниям', 100, 0);


тоже пропадает
...
Рейтинг: 0 / 0
При создании MDIChild все приложение пропадает с экрана
    #39702609
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Devillio
Код: pascal
1.
2.
3.
4.
procedure TMainForm.LockDrawing;
begin
//1 вариант:
    LockWindowUpdate(Self.Handle);



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

Devillio
Код: pascal
1.
Application.CreateForm(TMDIExpertise, MDIExpertise);


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

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

Код: pascal
1.
2.
3.
Form := TSomeForm.Create(Application); // создадим нормальное окно
Form.Setup(...); // инициализируем его как нам нужно
Form.Style := fsMDIChild; // и только после этого выпихнем в MDI и сделаем видимым
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / При создании MDIChild все приложение пропадает с экрана
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]