// файл ИМЯ_ПРОЕКТА.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(); // Запускаем приложение (открывается главное окно)
}
Отловить момент полной загрузки всего
Хочу отловить момент, когда уже все контролы, формы проинициализированы, загружены и появились на экране в ожидании пользовательских действий. Пробывал события OnShow, OnActivate, OnCreate, все не то. Они, гады, вызываются перед событием. А мне нужно - после :(
Например события OnActivate и OnMessage.
OnMessage с проверкой
Msg.message == WM_ACTIVATEAPP
Msg.message == WM_QUERYOPEN
Msg.message == WM_ENABLE
Два варианта разной степени сложности:
1. Application->OnIdle.
В обработчике OnShow формы устанавливаем значение указателя OnIdle. После того, как форма отобразится программа перейдёт в режим ожидания дальнейших действий пользователя - то, что вам надо.
А в обработчике ожидания можно обнулить указатель события и выполнить требуемое действие
2. Timer->OnTimer
Указываем величину задержки в 500 мс. В OnShow формы активируем таймер - и через указанный промежуток времени он сработает.
В обработчике таймера останавливаем его, а затем выполняем требуемое действие.
Спасибо.
Цитата:
У меня еще вся сложность в том, что перед показом основной формы создается форма с выбором пользователя. И только после выбора делается Show основной.
Блииин, что - и это вся проблема? Здесь она решается совсем по-другому. Просто, как два пальца об асфальт :D
Код:
Цитата: el scorpio
Просто, как два пальца об асфальт :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(); // Запускаем приложение (открывается главное окно)
}
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(); // Запускаем приложение (открывается главное окно)
}
Спасибо за этот вариант выбора пользователя. Я просто боялся лезть в этот кусок кода. Но тема о другом. Есть просто свойство прозрачности у формы AlphaBlend, когда она полностью загружается - я хочу из полной прозрачности сделать ее видимой, т.е. просто сделать анимашку при загрузки основной формы.
Попробуй вот это TCustomForm::FormState
fsCreating The form’s constructor is currently executing.
правда это ничем не поможет. так же можно и таймер поставить :)
Вот, так у меня работает
Код:
void __fastcall TForm1::FormActivate(TObject *Sender)
{
AlphaBlend = true;
for(int i(0) ; i < 255 ; i++)
{
AlphaBlendValue = i;
Application->ProcessMessages();
Sleep(2);
}
AlphaBlend = false;
}
{
AlphaBlend = true;
for(int i(0) ; i < 255 ; i++)
{
AlphaBlendValue = i;
Application->ProcessMessages();
Sleep(2);
}
AlphaBlend = false;
}
Правда форму нельзя закрыть, пока цыкл работает. Но можно объявить глобальную переменную и ...
У меня тогда окно программы представляет собой черный квадрат малевича, не видно вообще никаких контролов.
Цитата: 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);
}
}
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);
}
}
У меня всё супер прокатывает.
А почему такой код в бесконечный цикл впадает ?
Код:
for (AlphaBlendValue = 0; AlphaBlendValue < 255; AlphaBlendValue += 10)
{
Application->ProcessMessages();
Sleep(2);
}
{
Application->ProcessMessages();
Sleep(2);
}
Пытался добавить такой код в FormHide,FormDeactivate, OnMinimize. Ничего не работает, хотел чтобы окно также плавно исчезало перед сворачиванием.
Код:
AlphaBlend = true;
for(int i=255; i >= 0; i-=10)
{
AlphaBlendValue = i;
Sleep(2);
}
AlphaBlend = false;
for(int i=255; i >= 0; i-=10)
{
AlphaBlendValue = i;
Sleep(2);
}
AlphaBlend = false;
Цитата: SABROG
А почему такой код в бесконечный цикл впадает ?
for (AlphaBlendValue = 0; AlphaBlendValue < 255; AlphaBlendValue += 10)
{
Application->ProcessMessages();
Sleep(2);
}
for (AlphaBlendValue = 0; AlphaBlendValue < 255; AlphaBlendValue += 10)
{
Application->ProcessMessages();
Sleep(2);
}
Хы :D
Так ведь переменная AlphaBlendValue имеет тип byte. Она может только от 0 до 255 меняться.
Цитата: Sara
Хы :D
Так ведь переменная AlphaBlendValue имеет тип byte. Она может только от 0 до 255 меняться.
Так ведь переменная AlphaBlendValue имеет тип byte. Она может только от 0 до 255 меняться.
А for уже с байтами перестал работать ?
Код:
for (AlphaBlendValue = 0; AlphaBlendValue < 255; AlphaBlendValue += 10)
Цитата: Sara
А ты посмотри внимательно вот на это условие:
И подумай: какие значения будет принимать переменная AlphaBlendValue? Ясно, что она всегда будет меньше 255. Поэтому получится бесконечный цикл.
Код:
for (AlphaBlendValue = 0; AlphaBlendValue < 255; AlphaBlendValue += 10)
Да, забыл что по 10 прибавляю :P
Так работает отлично (хоть и пришлось увеличить шаг):
Код:
void __fastcall TForm1::FormActivate(TObject *Sender)
{
for(AlphaBlendValue=0; AlphaBlendValue < 255 ; AlphaBlendValue+=16-1 )
{
Application->ProcessMessages();
Sleep(2);
}
AlphaBlend = false;
}
{
for(AlphaBlendValue=0; AlphaBlendValue < 255 ; AlphaBlendValue+=16-1 )
{
Application->ProcessMessages();
Sleep(2);
}
AlphaBlend = false;
}