Отрисовка формы во время OnShow
От: Northsoft  
Дата: 05.07.11 12:17
Оценка:
Создаю форму f_progress:=TF_Progress.Create() и показываю её с помощью ShowModal. В OnShow показываемой формы забита куча кода, которая делает очень много работы, и фактически форма лишь отображает процесс её выполнения. Однако в начале OnShow поставлены Self.Show() и Application.ProcessMessages(), также вызовы Application.ProcessMessages() выставлены везде после перерисовки формы. Но форма всё равно не показывается, пока не отработает весь обработчик OnShow. Что ещё нужно указать в OnShow, чтобы форма корректно отрисовалась и далее корректно отрисовывалась по Application.ProcessMessages() ?
Re: Отрисовка формы во время OnShow
От: dkotov  
Дата: 05.07.11 12:24
Оценка:
как вариант в OnShow запускать отдельный поток, в котором происходят все чудеса.

Здравствуйте, Northsoft, Вы писали:

N>Создаю форму f_progress:=TF_Progress.Create() и показываю её с помощью ShowModal. В OnShow показываемой формы забита куча кода, которая делает очень много работы, и фактически форма лишь отображает процесс её выполнения. Однако в начале OnShow поставлены Self.Show() и Application.ProcessMessages(), также вызовы Application.ProcessMessages() выставлены везде после перерисовки формы. Но форма всё равно не показывается, пока не отработает весь обработчик OnShow. Что ещё нужно указать в OnShow, чтобы форма корректно отрисовалась и далее корректно отрисовывалась по Application.ProcessMessages() ?
... << RSDN@Home 1.2.0 alpha 5 rev. 1526>>
Re: Отрисовка формы во время OnShow
От: Alex.Che  
Дата: 05.07.11 12:26
Оценка:
Hello, Northsoft!
You wrote on Tue, 05 Jul 2011 12:17:52 GMT:

> Что ещё нужно указать в OnShow, чтобы форма корректно отрисовалась и

> далее корректно отрисовывалась по Application.ProcessMessages() ?

выполняй "кучу кода" не в OnShow, а в OnActivate.

--
With best regards, Alex Cherednichenko.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Отрисовка формы во время OnShow
От: Northsoft  
Дата: 05.07.11 12:28
Оценка:
Здравствуйте, dkotov, Вы писали:

D>как вариант в OnShow запускать отдельный поток, в котором происходят все чудеса.


Вариант был бы хорош в Java, которая умеет вложенные классы. А так, плодить классы и потоки — нужно ли?
Re[2]: Отрисовка формы во время OnShow
От: Northsoft  
Дата: 05.07.11 12:29
Оценка:
Здравствуйте, Alex.Che, Вы писали:

AC>выполняй "кучу кода" не в OnShow, а в OnActivate.


OnActivate выполняется однократно?
Re[3]: Отрисовка формы во время OnShow
От: dkotov  
Дата: 05.07.11 12:36
Оценка:
Не спорю, но если лень возиться с классами, то можно же в голую CreateThread(...) и т.д.

Здравствуйте, Northsoft, Вы писали:

N>Здравствуйте, dkotov, Вы писали:


D>>как вариант в OnShow запускать отдельный поток, в котором происходят все чудеса.


N>Вариант был бы хорош в Java, которая умеет вложенные классы. А так, плодить классы и потоки — нужно ли?
... << RSDN@Home 1.2.0 alpha 5 rev. 1526>>
Re: Отрисовка формы во время OnShow
От: ASta Украина  
Дата: 05.07.11 12:47
Оценка:
Здравствуйте, Northsoft, Вы писали:

N>Создаю форму f_progress:=TF_Progress.Create() и показываю её с помощью ShowModal. В OnShow показываемой формы забита куча кода, которая делает очень много работы, и фактически форма лишь отображает процесс её выполнения. Однако в начале OnShow поставлены Self.Show() и Application.ProcessMessages(), также вызовы Application.ProcessMessages() выставлены везде после перерисовки формы. Но форма всё равно не показывается, пока не отработает весь обработчик OnShow. Что ещё нужно указать в OnShow, чтобы форма корректно отрисовалась и далее корректно отрисовывалась по Application.ProcessMessages() ?



Может быть попробовать что-то в духе:

const WM_DoFuckingWork = WM_USER + 1;

PostMessage(f_progress.Handle, WM_DoFuckingWork, 0, 0);

procedure DoDoFuckingWork(var AMessage: TMessage); message WM_DoFuckingWork;

?
Re[2]: Отрисовка формы во время OnShow
От: Northsoft  
Дата: 05.07.11 12:59
Оценка:
Здравствуйте, ASta, Вы писали:
AS>Может быть попробовать что-то в духе:
AS>const WM_DoFuckingWork = WM_USER + 1;
AS>PostMessage(f_progress.Handle, WM_DoFuckingWork, 0, 0);
AS>procedure DoDoFuckingWork(var AMessage: TMessage); message WM_DoFuckingWork;
AS>?
Не, забью всё в OnActivate, в конструкторе подыму флажок, перед запуском работы флажок проверю, и перед работой опущу его.
Костыль, конечно, но никто не говорил, что Delphi рулит. =(

// и какому умнику приходит в голову создавать базы данных в Excel?!
Re[3]: Отрисовка формы во время OnShow
От: hattab  
Дата: 05.07.11 13:12
Оценка:
Здравствуйте, Northsoft, Вы писали:

N> D>как вариант в OnShow запускать отдельный поток, в котором происходят все чудеса.


N> Вариант был бы хорош в Java, которая умеет вложенные классы.


Delphi умеет оное (вложенные классы) с версии 2005. Ужо шесть лет, как
avalon 1.0rc3 rev 419, zlib 1.2.3
Re[3]: Отрисовка формы во время OnShow
От: hattab  
Дата: 05.07.11 13:12
Оценка:
Здравствуйте, Northsoft, Вы писали:

N> Не, забью всё в OnActivate, в конструкторе подыму флажок, перед запуском работы флажок проверю, и перед работой опущу его.

N> Костыль, конечно, но никто не говорил, что Delphi рулит. =(

Да с таким подходом ничего рулить не будет Код в эвентах, расставление флажков... типичный говнокод
avalon 1.0rc3 rev 419, zlib 1.2.3
Re[2]: Отрисовка формы во время OnShow
От: Dimonka Верблюд  
Дата: 05.07.11 13:12
Оценка:
Здравствуйте, ASta, Вы писали:

AS>Может быть попробовать что-то в духе:


AS>const WM_DoFuckingWork = WM_USER + 1;


Ещё проще поставить таймер с задержкой в 1 и по срабатыванию таймер отключить.
Re[3]: Отрисовка формы во время OnShow
От: ASta Украина  
Дата: 05.07.11 13:13
Оценка:
Здравствуйте, Northsoft, Вы писали:

N>Здравствуйте, ASta, Вы писали:

AS>>Может быть попробовать что-то в духе:
AS>>const WM_DoFuckingWork = WM_USER + 1;
AS>>PostMessage(f_progress.Handle, WM_DoFuckingWork, 0, 0);
AS>>procedure DoDoFuckingWork(var AMessage: TMessage); message WM_DoFuckingWork;
AS>>?
N>Не, забью всё в OnActivate, в конструкторе подыму флажок, перед запуском работы флажок проверю, и перед работой опущу его.
Забей куда угодно, хозяин — барин. Но так как я предложил правильнее.

N>Костыль, конечно, но никто не говорил, что Delphi рулит. =(

Неумение и нежелание делать свою работу хорошо на Delphi пытаться свалить не надо, Delphi здесь ни при чем.

N>// и какому умнику приходит в голову создавать базы данных в Excel?!

Я про костыли, Delphi, Excel, умников и прочее при себе оставлю, хорошо?
Re[3]: Отрисовка формы во время OnShow
От: ASta Украина  
Дата: 05.07.11 13:18
Оценка:
Здравствуйте, Dimonka, Вы писали:

D>Здравствуйте, ASta, Вы писали:


AS>>Может быть попробовать что-то в духе:


AS>>const WM_DoFuckingWork = WM_USER + 1;


D>Ещё проще поставить таймер с задержкой в 1 и по срабатыванию таймер отключить.

А почему с задержкой 1, а не 2, не 10? А где форма в это время будет — успеет на экране появиться или нет?

Может лучше сразу делать правильно?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.