альтернатива ShowModal
есть функция, во время которой появляется окно сообщения (вопрос), ответ на который влияет на дальнейшее выполнение функции. Например:
{
Form2->Tag = iNumber;
Form2->ShowModal();
if (Form2->Tag == iNumber)
{Caption = "без изменений";}
else {Caption = "изменено";}
}
Амбула (задача):
Представим, что НЕЛЬЗЯ использовать вторую форму. Тогда создаём TPanel (поверх другиих объектов первой формы) с содержанием второй формы.
Теперь нужно выполнить функцию, где вместо Form2->ShowModal(); будет использоваться типа Panel1->Visible = 1; и [COLOR=red]ещё кое-что, что задержит выполнение функции до момента скрытия панели (ответа пользователя)[/COLOR].
ИТАК, всё же, как это кое-что выглядит?
Преамбула:
есть функция, во время которой появляется окно сообщения (вопрос), ответ на который влияет на дальнейшее выполнение функции. Например:
{
Form2->Tag = iNumber;
Form2->ShowModal();
if (Form2->Tag == iNumber)
{Caption = "без изменений";}
else {Caption = "изменено";}
}
Амбула (задача):
Представим, что НЕЛЬЗЯ использовать вторую форму. Тогда создаём TPanel (поверх другиих объектов первой формы) с содержанием второй формы.
Теперь нужно выполнить функцию, где вместо Form2->ShowModal(); будет использоваться типа Panel1->Visible = 1; и [COLOR=red]ещё кое-что, что задержит выполнение функции до момента скрытия панели (ответа пользователя)[/COLOR].
ИТАК, всё же, как это кое-что выглядит?
Для данных целей в билдере существует инструмент - такой как фреймы. Можно в принципе использовать и панель - это твое решение, правда не самое лучшее. Для обработки не обязательно использовать задержку, достаточно организовать цикл сообщений и обрабатывать результат при получении сообщения.
Для данных целей в билдере существует инструмент - такой как фреймы. Можно в принципе использовать и панель - это твое решение, правда не самое лучшее. Для обработки не обязательно использовать задержку, достаточно организовать цикл сообщений и обрабатывать результат при получении сообщения.
1. Если можно, дай ссылку на описание фрэймов (и есть ли они в ПЕРВОМ билдере?
2. Приведи пример ВМЕСТО задержки...
1. Если можно, дай ссылку на описание фрэймов (и есть ли они в ПЕРВОМ билдере?
2. Приведи пример ВМЕСТО задержки...
В первом - хз. Ты ж им пользуешься - посмотри. Если есть - в руководстве разработчика они должны быть описаны.
Цикл обработки сообщений - штука досточно стандартная, общая схема может выглядеть так:
1. В функцию, которая инициализирует твою форму(панель, фрейм, не важно), передается хендл окна, которое будет получать сообщения. Правда если это панель - необходимости в этом нет. Можно использовать хендл текущего окна.
2. Затем определяешь свое сообщение- можно использовать и стандартные - но воизбежание накладок, непоняток и т.д. - лучше определить свой мессадж. Делается так:
3. Объявляешь функцию которая выполнит все что необходимо, например обработает введенное и скроет панель:
void __fastcall MyFunction(TMessage&);
4. Рисуешь в заголовочном файле формы объявление цикла обработки сообщений:
MESSAGE_HANDLER(WM_MYMESSAGE,TMessage,MyFunction);
END_MESSAGE_MAP(TForm)
5. Определяешь функцию MyFunction:
switch(Msg.Msg){
case WM_MYMESSAGE:
....
Panel1->Visible = false;
break;
}
}
6. Кнопка на панели содержит такой код:
ну вобщем то и все. Конечно, в реальном коде, тебе необходимо обеспечивать потокобезопасность - т.е. позаботится что бы приложение не могло использовать переменные до того как форма скроется, если это возможно - надо использовать мьютексы, события и функции ожидания. Естественно надо реализовать сообщение о том что пользователь отменил операцию, но здесь уже простор для твоей фантазии. Если будешь юзать стандартные сообщения- не забывай использовать DispatchMessage - что бы окно могло их тоже получать.
З.Ы. Естественно, если объявляешь более чем одно сообщение, не забывай правильно указывать смещение:
//или
#define WM_MYMESSAGE2 WM_MYMESSAGE+100
1. Если можно, дай ссылку на описание фрэймов (и есть ли они в ПЕРВОМ билдере?
Фреймы кстати всвое время активно обсуждались на форуме - юзай поиск.
Кстати, я выяснил почему виснет вариант
Может как-то можно "поймать" эту ошибку или сделать что-то, чтобы подобных глюков не было?
Пока пытаюсь использовать
Способ интересный, но немного сложный. Ибо если я в нём запутаюсь - у проги будет много багов.
Кстати, я выяснил почему виснет вариант
Может как-то можно "поймать" эту ошибку или сделать что-то, чтобы подобных глюков не было?
Пока пытаюсь использовать
Возможно тебе необходимо вызывать PlaySound с флагом SND_ASYNC.
Возможно тебе необходимо вызывать PlaySound с флагом SND_ASYNC.
Дык так оно и есть. Вызываю звук из ресурса DLL`ки с флагом SND_ASYNC (если б я вызывал без этого флага, то и прога не могла бы в одно и то же время два потока запустить)....
Дык так оно и есть. Вызываю звук из ресурса DLL`ки с флагом SND_ASYNC (если б я вызывал без этого флага, то и прога не могла бы в одно и то же время два потока запустить)....
как второй вариант, пример из МСДН, вызов функции:
{
BOOL bRtn;
LPSTR lpRes;
HANDLE hResInfo, hRes;
// Find the WAVE resource.
hResInfo = FindResource(hInst, lpName, "WAVE");
if (hResInfo == NULL)
return FALSE;
// Load the WAVE resource.
hRes = LoadResource(hInst, hResInfo);
if (hRes == NULL)
return FALSE;
// Lock the WAVE resource and play it.
lpRes = LockResource(hRes);
if (lpRes != NULL) {
bRtn = sndPlaySound(lpRes, SND_MEMORY | SND_SYNC |
SND_NODEFAULT);
UnlockResource(hRes);
}
else
bRtn = 0;
// Free the WAVE resource and return success or failure.
FreeResource(hRes);
return bRtn;
}
lpRes = LockResource(hRes);
if (lpRes != NULL) {bRtn = sndPlaySound(lpRes, SND_MEMORY | SND_SYNC | SND_NODEFAULT);
UnlockResource(hRes); }
Судя по когду, музон играется СИНХРОННО. То есть не допускает продолжение работы приложении (в моём случае - анимация останавливается на время воспроизведения).
Какие есть ещё способы проигрывания звуковых файлов, загружаемых из ресурса DLL?
Инструкция по адресу "0x76b2594d" обратилась к памяти по адресу "0x01b2faa0". Память не может быть "read".
"OK" - завершение приложения
"Отмена" - отладка приложения
Причём я так и не понял, когда (из-за чего) возникает эта ошибка. Может кто-то знает???
Проблема больше в том, что прога после этого закрывается :(
Sleep(1);
и жизнь покажется раем :)
Sleep(1);
и жизнь покажется раем :)
А на дату последнего сообщения смотрим?Sleep!:D