Лена |
Отправлено: 14.11.2006, 14:20 |
|
Мастер участка
Группа: Участник
Сообщений: 501
|
Подскажите, как правильно добавить форму созданную в другом проекте в другой проект? Какие точно файлы надо скопировать в другой проект?
Если в добавляемой форме описана карта сообщений, будут ли ловиться эти сообщения, если эта форма не будет главной в новом проекте? Форма будет вызываться по нажатию на кнопку. Мне надо чтобы код карты сообщений отрабатывал на форме, даже когда форма не показана.
Карта сообщений в добовляемой форме:
CODE |
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_DEVICECHANGE, TMessage, OnDeviceChange);
END_MESSAGE_MAP(TComponent)
| |
|
exp |
Отправлено: 14.11.2006, 15:00 |
|
Мастер участка
Группа: Участник
Сообщений: 304
|
<имя_формы>.CPP
<имя_формы>.H
<имя_формы>.DFM
После этого делаешь Add to project... и выбираешь unit.
Всё будет точно так же, как и в исходном проекте
Отредактировано exp — 14.11.2006, 15:02
|
|
Лена |
Отправлено: 14.11.2006, 15:24 |
|
Мастер участка
Группа: Участник
Сообщений: 501
|
Спасибо, все получилось. |
|
AVC |
Отправлено: 14.11.2006, 15:25 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE (Лена @ 14.11.2006, 13:20) | Если в добавляемой форме описана карта сообщений, будут ли ловиться эти сообщения, если эта форма не будет главной в новом проекте?
|
Карта сообщений отрабатывается когда форма имеет фокус ввода (активна). Это просто замена WndProc.
Что бы отлаливать сообщения при неактивной форме можно их ловить на уровне приложения. Например так
CODE |
class TF_Main : public TForm {...
private: void __fastcall AppMessage (tagMSG &msg, bool &handled);
...}
__fastcall TF_Main::TF_Main(TComponent* Owner) : TForm(Owner)
{
Application->OnMessage = AppMessage;
...
}
void __fastcall TF_Main::AppMessage (tagMSG &msg, bool &handled)
{
if (msg.message != WM_KEYDOWN) return;
if (msg.wParam != VK_F1) return;
...
}
| |
|
Лена |
Отправлено: 14.11.2006, 15:59 |
|
Мастер участка
Группа: Участник
Сообщений: 501
|
У меня почему-то (и это хорошо) сообщения обрабатываются, когда нет фокуса ввода. Например, запустила приложения. Дополнительной формы, содержащей карту сообщения, нет на экране, она вызывается кнопкой. Вынимаю флеш носитель, получаю свой ShowMessage который описан в функции которая используется в карте сообщений этой дополнительной не видимой формы. |
|
AVC |
Отправлено: 15.11.2006, 11:03 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE (Лена @ 14.11.2006, 14:59) | У меня почему-то (и это хорошо) сообщения обрабатываются, когда нет фокуса ввода. Например, запустила приложения. Дополнительной формы, содержащей карту сообщения, нет на экране, она вызывается кнопкой. Вынимаю флеш носитель, получаю свой ShowMessage который описан в функции которая используется в карте сообщений этой дополнительной не видимой формы. |
Ну не знаю, не знаю... Сегодня специально сделал тестовый пример — пока форма не активна сообщения не доходят и её Dispatch не вызывается. Может это зависит от сообщения? |
|
Лена |
Отправлено: 15.11.2006, 12:01 |
|
Мастер участка
Группа: Участник
Сообщений: 501
|
Наверное это завист от сообщения. Мое сообщение это WM_DEVICECHANGE оно возникает когда в сисему вставить флеш, СD или DVD.
Обработка WM_DEVICECHANGE в Main_OnDeviceChange :
CODE |
char FirstDriveFromMask (ULONG unitmask)
{
char i;
for (i = 0; i < 26; ++i)
{
if (unitmask & 0x1)
break;
unitmask = unitmask >> 1;
}
return (i + 'A');
}
void Main_OnDeviceChange (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;
char szMsg[80];
switch(wParam)
{
case DBT_DEVICEARRIVAL:
// Check whether a CD or DVD was inserted into a drive.
if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
//if (lpdbv -> dbcv_flags & DBTF_MEDIA)
//{
wsprintf (szMsg, "%c:",
FirstDriveFromMask(lpdbv ->dbcv_unitmask));
//блок моего кода
//поиск самого нового файла на флеш носителе
PathFolder = szMsg;
TDateTime dt = 0;
AnsiString S = "";
LookInDir(PathFolder, dt, S);
if(S!="")
{
FormFoto->AdvPicture1->Picture->LoadFromFile(S);
}
//конец блока моего кода
//MessageBox (hwnd, szMsg, "WM_DEVICECHANGE", MB_OK);
//}
}
break;
case DBT_DEVICEREMOVECOMPLETE:
// Check whether a CD or DVD was removed from a drive.
if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
//if (lpdbv -> dbcv_flags & DBTF_MEDIA)
//{
wsprintf (szMsg, "Äèñê %c: èçâëå÷åí\n",
FirstDriveFromMask(lpdbv ->dbcv_unitmask));
MessageBox (hwnd, szMsg, "Èçâëå÷åíèå äèñêà", MB_OK); //вижу это сообщение, при вынимании флешки, а форма не видима
//}
}
break;
default:
//Process other WM_DEVICECHANGE notifications for other
//devices or reasons.
;
}
}
|
Отредактировано Лена — 15.11.2006, 12:03 |
|
AVC |
Отправлено: 15.11.2006, 13:42 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE (Лена @ 15.11.2006, 11:01) | Наверное это завист от сообщения. |
Точно. |
|