C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Добавить форму, с кодом
Лена
Отправлено: 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



Спасибо, все получилось. smile.gif
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 который описан в функции которая используется в карте сообщений этой дополнительной не видимой формы. rolleyes.gif
AVC
Отправлено: 15.11.2006, 11:03


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE (Лена @ 14.11.2006, 14:59)
У меня почему-то (и это хорошо) сообщения обрабатываются, когда нет фокуса ввода. Например, запустила приложения. Дополнительной формы, содержащей карту сообщения, нет на экране, она вызывается кнопкой. Вынимаю флеш носитель, получаю свой ShowMessage который описан в функции которая используется в карте сообщений этой дополнительной не видимой формы.  rolleyes.gif

Ну не знаю, не знаю... Сегодня специально сделал тестовый пример — пока форма не активна сообщения не доходят и её 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)
Наверное это завист от сообщения.

Точно.

Вернуться в Вопросы программирования в C++Builder