Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Отловить момент полной загрузки всего

1.9K
06 марта 2007 года
SABROG
242 / / 26.01.2006
Хочу отловить момент, когда уже все контролы, формы проинициализированы, загружены и появились на экране в ожидании пользовательских действий. Пробывал события OnShow, OnActivate, OnCreate, все не то. Они, гады, вызываются перед событием. А мне нужно - после :(
19K
06 марта 2007 года
Termi_uc
33 / / 13.02.2007
Ты пробовал ApplicationEvents?
Например события OnActivate и OnMessage.
OnMessage с проверкой
Msg.message == WM_ACTIVATEAPP
Msg.message == WM_QUERYOPEN
Msg.message == WM_ENABLE
309
06 марта 2007 года
el scorpio
1.1K / / 19.09.2006
Если не нравится TForm::OnShow, то сложно :(
Два варианта разной степени сложности:
1. Application->OnIdle.
В обработчике OnShow формы устанавливаем значение указателя OnIdle. После того, как форма отобразится программа перейдёт в режим ожидания дальнейших действий пользователя - то, что вам надо.
А в обработчике ожидания можно обнулить указатель события и выполнить требуемое действие

2. Timer->OnTimer
Указываем величину задержки в 500 мс. В OnShow формы активируем таймер - и через указанный промежуток времени он сработает.
В обработчике таймера останавливаем его, а затем выполняем требуемое действие.
1.9K
06 марта 2007 года
SABROG
242 / / 26.01.2006
У меня еще вся сложность в том, что перед показом основной формы создается форма с выбором пользователя. И только после выбора делается Show основной. Пробывал перехватывать сообщения ApplicationEvents ловит ограниченное количество сообщений, в них нет ни WM_SHOWWINDOW, ни WM_ACTAVATEAPP ни некоторых других. До этого было реализовано по таймеру как и предложил el scorpio. Не очень красиво, но похоже делать нечего :(

Спасибо.
309
07 марта 2007 года
el scorpio
1.1K / / 19.09.2006
Цитата:
У меня еще вся сложность в том, что перед показом основной формы создается форма с выбором пользователя. И только после выбора делается Show основной.


Блииин, что - и это вся проблема? Здесь она решается совсем по-другому. Просто, как два пальца об асфальт :D

Код:
// файл ИМЯ_ПРОЕКТА.cpp
// функция WinMain - запуск программы
Application->Initialize();
Application->CreateForm(__classid(TForm_Select), &Form_Select);
TModalResult Res = Form_Select->ShowModal(); // Выбираем пользователя
if (Res == mrOk) // Если выбрали удачно, то...
{
    Application->CreateForm(__classid(TForm_Main), &Form_Main);
    Application->MainForm = Form_Main; // Выбираем главное окно программы
    Application->Run(); // Запускаем приложение (открывается главное окно)
}
10
07 марта 2007 года
Freeman
3.2K / / 06.03.2004
Цитата: el scorpio
Просто, как два пальца об асфальт :D


Код нерабочий - невооружённым глазом две ошибки нашёл в таком кусочке.

309
07 марта 2007 года
el scorpio
1.1K / / 19.09.2006
Во-первых, код я писал "в уме" :D
Во-вторых, конечно, изменить значение Application->MainForm нельзя :(
В-третьих, код нужно приводить сразу

 
Код:
Application->Initialize();
Application->CreateForm(__classid(TForm_Main), &Form_Main);
Application->CreateForm(__classid(TForm_Editing), &Form_Editing);
TModalResult Res = Form_Editing->ShowModal(); // Выбираем пользователя
if (Res == mrOk) // Если выбрали удачно, то...
{
    Form_Main->Initialize(); // Собственный метод настройки параметров
//  delete Form_Editing; // Удаляем форму запроса (по желанию)
    Application->Run(); // Запускаем приложение (открывается главное окно)
}
1.9K
07 марта 2007 года
SABROG
242 / / 26.01.2006
Спасибо за этот вариант выбора пользователя. Я просто боялся лезть в этот кусок кода. Но тема о другом. Есть просто свойство прозрачности у формы AlphaBlend, когда она полностью загружается - я хочу из полной прозрачности сделать ее видимой, т.е. просто сделать анимашку при загрузки основной формы.
25K
07 марта 2007 года
Bobbie
5 / / 07.03.2007
На вскидку :)
Попробуй вот это TCustomForm::FormState

fsCreating The form’s constructor is currently executing.

правда это ничем не поможет. так же можно и таймер поставить :)
19K
09 марта 2007 года
Termi_uc
33 / / 13.02.2007
А чем тебя FormActivate не устроило?
Вот, так у меня работает
Код:
void __fastcall TForm1::FormActivate(TObject *Sender)
{
 AlphaBlend = true;
 for(int i(0) ; i < 255 ; i++)
 {
  AlphaBlendValue = i;
  Application->ProcessMessages();
  Sleep(2);
 }
 AlphaBlend = false;
}

Правда форму нельзя закрыть, пока цыкл работает. Но можно объявить глобальную переменную и ...
1.9K
09 марта 2007 года
SABROG
242 / / 26.01.2006
У меня тогда окно программы представляет собой черный квадрат малевича, не видно вообще никаких контролов.
19K
09 марта 2007 года
Termi_uc
33 / / 13.02.2007
Цитата: SABROG
У меня тогда окно программы представляет собой черный квадрат малевича, не видно вообще никаких контролов.


1. Ты Application->ProcessMessages(); точно написал?
2. В дизайнере поставь у формы AlphaBlend = true и AlphaBlendValue = 0; для пущего эффекта, и пиши:

Код:
bool IsClose(false);
int ALPHA_MAX(0);
void __fastcall TForm1::FormActivate(TObject *Sender)
{
 for( ; ALPHA_MAX < 255 && !IsClose ; ALPHA_MAX+=2)
 {
  AlphaBlendValue = ALPHA_MAX;
  Application->ProcessMessages();
  Sleep(2);
 }
}

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
 IsClose = true;
 for( ; ALPHA_MAX > 0 ; ALPHA_MAX-=2)
 {
  AlphaBlendValue = ALPHA_MAX;
  Application->ProcessMessages();
  Sleep(2);
 }
}

У меня всё супер прокатывает.
1.9K
09 марта 2007 года
SABROG
242 / / 26.01.2006
Да, действительно работает. Глюк чтоль какой-то.
А почему такой код в бесконечный цикл впадает ?

 
Код:
for (AlphaBlendValue = 0; AlphaBlendValue < 255; AlphaBlendValue += 10)
 {
  Application->ProcessMessages();
  Sleep(2);
 }


Пытался добавить такой код в FormHide,FormDeactivate, OnMinimize. Ничего не работает, хотел чтобы окно также плавно исчезало перед сворачиванием.
 
Код:
AlphaBlend = true;
 for(int i=255; i >= 0; i-=10)
 {
  AlphaBlendValue = i;
  Sleep(2);
 }
 AlphaBlend = false;
15K
10 марта 2007 года
Sara
79 / / 04.01.2007
Цитата: SABROG
А почему такой код в бесконечный цикл впадает ?

for (AlphaBlendValue = 0; AlphaBlendValue < 255; AlphaBlendValue += 10)
{
Application->ProcessMessages();
Sleep(2);
}


Хы :D
Так ведь переменная AlphaBlendValue имеет тип byte. Она может только от 0 до 255 меняться.

1.9K
10 марта 2007 года
SABROG
242 / / 26.01.2006
Цитата: Sara
Хы :D
Так ведь переменная AlphaBlendValue имеет тип byte. Она может только от 0 до 255 меняться.



А for уже с байтами перестал работать ?

15K
10 марта 2007 года
Sara
79 / / 04.01.2007
А ты посмотри внимательно вот на это условие:
 
Код:
for (AlphaBlendValue = 0; AlphaBlendValue < 255; AlphaBlendValue += 10)
И подумай: какие значения будет принимать переменная AlphaBlendValue? Ясно, что она всегда будет меньше 255. Поэтому получится бесконечный цикл.
1.9K
12 марта 2007 года
SABROG
242 / / 26.01.2006
Цитата: Sara
А ты посмотри внимательно вот на это условие:
 
Код:
for (AlphaBlendValue = 0; AlphaBlendValue < 255; AlphaBlendValue += 10)
И подумай: какие значения будет принимать переменная AlphaBlendValue? Ясно, что она всегда будет меньше 255. Поэтому получится бесконечный цикл.



Да, забыл что по 10 прибавляю :P

Так работает отлично (хоть и пришлось увеличить шаг):

 
Код:
void __fastcall TForm1::FormActivate(TObject *Sender)
{
 for(AlphaBlendValue=0; AlphaBlendValue < 255 ; AlphaBlendValue+=16-1 )
 {
  Application->ProcessMessages();
  Sleep(2);
 }
 AlphaBlend = false;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог