![]() |
Событие полсе запуска приложения.
Какое событие мне бы обрабатывать, чтобы начинать работу срразу после того, как приложение запущено, форма создано.
OnCreate -> OnShow -> OnActivate -> OnPaint -> OnResize -> OnPaint я последовательность то знаю, но ни одно не подходит же, как мне кажется. Так как OnCreate елис буду обрабатывать, то измение лейблов, скажем на форме будет не видно. А все остальные могут по несколько раз происходить во время работы с приложением. =( Что подскажете? |
Ты сплэш-скрин (заставку) что-ли хочешь сделать?
Может тебе будет просто достаточно в нужном событии установить флаг что ты уже выполнил действие один раз? Объясни подробнее цель, действия которые собираешься выполнять. |
Уточни, что ты собрался делать... если тебе важно, чтобы отображалось (прорисовывалось) в окне что-то, те же лейблы на пример, то естественно - onPaint, тока не забывай репейнт делать принудительный...
|
Я делаю вебапдейт. На форме лейбл, в котром будет написан ход обновления.
Типа подключаюсь, скачиваю файл такой-то, и т.п. Вмысле репейнт принудительный? Я если делаю он пейнт то лейбл еще не появляется, только форма. |
а зачем так рачно то? что нельзя отдельным тредом пустить обновление этой лейблы через синхронизацию? как это она не появляется в онпейнте? у тя в родителе если он пейнт происходит, то у всех чайлдов он тоже срабатывает... или я опять тебя не понял... популярнее можно?
ПыСы принудительно - это дергать метод репейнт |
Я с threadami не работал, можно поподробнее.
Я если в онпейнт делаю Form1->Label1->Cation = "Тут текущее сотояние обновления"; for (;;) тут эмуляция работы то эта лабла так и не проявляется; |
решил сделать через сообщения послать форме сообщения. Когда приложение запустится приедт время обработки сообщений. Тогда мое сообщение и обработается. Обработчик сообщения написал, но вот досада, у меня не посылается ообщение.
Application->CreateForm(__classid(TForm1), &Form1); PostMessage(Form1->Handle,WM_RUNUPDATE,0,0); Application->Run(); Я вставил послыку сообщения после create и перед раном. форма уже поидее создана, а он мне ошибку: [C++ Error] webupd.cpp(15): E2315 'Handle' is not a member of 'TForm1', because the type is not yet defined Как н создана? перед этим же create стоит =( |
добавь #include "Unit1.h" ( или где эта форма описана )
|
Цитата:
|
dyr_farot, если я добавлю, мне скажет потом при компиляции, что повтороне деклалирование класса TForm1, так что ничего там боавлять не надо.
Al-x, я что-то не понял. |
ничего он не скажет ( на то #ifndef Unit1H ) написано.
|
dyr_farot, я прежде чем написать, попробовал.
|
э... я тоже проверил...
ты, случайно из файла заголовка строки #ifndef Unit1H #define Unit1H не вытер? |
Цитата:
Код:
void __fastcall TForm1::Button1Click(TObject *Sender) Или это не то, что ты описывал в #4 и #6 постах? |
Цитата:
ты дебажить попробуй и проверь :) то что вы тут делаете - это изврат полнейший.... треды это очень просто, но объяснять долго... вот произошло у тя событие обновления (не важно какое, на пример нажали кнопку "обновить") мы открываем тред, в котором делаем все вычисления и пр.пр.пр.... на формочке у тя есть метод синхронизированный чтото типа setLabelCaption - который ты сам пишешь ессесно, но фишка в том, что он синхронизированный, а делает метод простую весчь - ставит лейбле кепшн по входному парамеру... в ходе вычислений в своем тредике просто выдергиваем в нужных местах этот метод и все будет чики пуки... :yees: |
/7y3uK, я так понимаю, это через TThread делать предлагаешь. Хм. Пойду поищу-почитаю. Ты бы ссылку дал =) Не читать же мне хелп на английском =)
|
|
Сделал класс поток. В нем есть функция синхронизации, котрая должна обновлять кепшн на форме. Функция потока вызывает функцию, которая как параметр - указатель на функцию харнится вв ее свойствах.
typedef void (*MyFunc)(AnsiString); class TUpdThread : public TThread { private: protected: void __fastcall Execute(); void __fastcall UpdateCaption(); void __fastcall GetRegistryVals(); public: __fastcall TUpdThread(bool CreateSuspended); void __fastcall SetUpdProc(MyFunc NewUpdProc); }; void __fastcall TUpdThread::SetUpdProc(MyFunc NewUpdProc){ UpdateFunc = NewUpdProc; } void __fastcall TUpdThread::UpdateCaption(){ UpdateFunc(Message); Sleep(1); } У формы сделал функцию: __fastcall TMainForm::SetCaption(AnsiString Value){ Report->Caption = Value; } Но опять встает та же проблема: Application->Initialize(); Application->CreateForm(__classid(TMainForm), &MainForm); TUpdThread *UpdateThread = new TUpdThread(true); UpdateThread->SetUpdProc(MainForm->SetCaption); // UpdateThread->Resume; Application->Run(); не могу я этот метод там указывать как параметр эту функцию передать, говорит, что еще класса нет =( ТАК! Вписал #include <formunit.h>, ошибку не выдает, но! Теперь ему не нравится вот что: Cannot convert 'void (* (_closure )(AnsiString))(AnsiString)' to 'void (*)(AnsiString)' |
Dragon31337
Запихни создание потока в конструктор главной формы. А метод для обновления Caption из потока надо вызывать с помощью Synchronize. |
А ьеперь самое главное. Как мне узнать об окончании процесса и закрыть приложение.
|
в конце Execute() потока сам закрывай приложение.
если нужно еще что-то -- пошли главной форме сообщения и в его обработчике выполняй все что нужно |
Цитата:
|
Писать там Application->Terminate как-то не красиво =(
|
А зачем Application->Terminate? Достаточно Close() ;)
OnTerminate выполняется когда поток уже завершил свою работу, и выполняется в контексте главного потока приложения. |
Часовой пояс GMT +4, время: 14:40. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.