Перемещение информации между компонентами приложения

Буксировка данных между приложениями

Буксировку из других приложений можно разделить на буксировку файлов и перемещение выделенной инфрмации из других приложений.

В начало

Перемещение файлов из других приложений

Borland C++ Builder не предоставляет встроенных средств для буксировки файлов из других приложений, но это можно реализовать используя WinAPI.

Подготовка приложения к приему файла

Прежде всего необходимо сообщить Windows о том, что создаваемое приложение готово обрабатывать файлы, перемещенные методом буксировки из другого приложения. Для этого достаточно включить в обработчик события OnCreate формы функцию WinAPI:

DragAcceptFiles(Handle,true);

Когда перетаскивается файл на приложение и отпускаете кнопку мыши, Windows посылает окну приложения сообщение WM_DROPFILES. Сообщение содержит имя файла. Обработчик этого сообщения нужно включить в разрабатываемое приложение:

 public:
         __fastcall          TForm1(TComponent* Owner);
 private:
  void   __fastcall          Response(TWMDropFiles &Message);
 BEGIN_MESSAGE_MAP
  MESSAGE_HANDLER(WM_DROPFILES,TWMDropFiles,Response)
 END_MESSAGE_MAP(TForm);

Здесь предусмотрено, что когда перетаскивается файл на приложение и отпускается кнопка мыши, то приложение вызовет функцию Response(), то есть функцию ответа. Осталось обработать это сообщение.

void __fastcall
TForm1::Response(TWMDropFiles& Message)
{
 HDROP hdropHandle=(HDROP)Message.Drop;
 //Переменная для хранения имени файла
 char chName[MAX_PATH];
 //Число буксируемых файлов
 int viNumber=DragQueryFile(hdropHandle,-1,NULL,NULL);
 //Посмотрим, что это именно так
 Label1->Caption=viNumber;


 .... Здесь будем добавлять код ....

}

При перемещении файла на форму переменная viNumber будет содержать число буксируемых на форму файлов. Теперь можно делать с перетащенными файлами, что угодно.

Определение в приложеннии имен перемещенных файлов

Добавим код (предварительно поместив на форму компонент ТMemo):

Memo1->Lines->Clear();
for(int i=0;i < viNumber; i++)
{
 DragQueryFile(hdropHandle,i,chName,MAX_PATH);
 Memo1->Lines->Add(chName);
}

Просмор в приложеннии кода содержимого перемещенного файла

Для перетащенного на приложение файла (обычно в этом случае перетаскивается один файл) код для просмотра:

char chName[MAX_PATH];
Memo1->Lines->Clear();
DragQueryFile(hdropHandle,0,chName,MAX_PATH);
Memo1->Lines->LoadFromFile(chName);

При перетаскивание на форму более одного файла достаточно поместить на форму второй компонент TMemo и организовать цикл:

Memo1->Lines->Clear();
for(int i=0; i < viNumber; i++)
{
 Memo2->Lines->Clear();
 DragQueryFile(hdropHandle,i,chName,MAX_PATH);
 Memo2->Lines->LoadFromFile(chName);
 for(int j=0; j < Memo2->Lines->Count; j++)
   Memo1->Lines->Add(Memo2->Lines->Strings[j]);
}

Открытие в приложеннии содержимого перемещенного файла

Поместим на форму компонент TMediaPlayer из вкладки System и добавим ниже приведенный код и, как результат - сможем проигрывать медиа файлы, перетащенне на форму.

char chName[MAX_PATH];
DragQueryFile(hdropHandle,i,chName,MAX_PATH);
String strEx=ExtractFileExt(chName);
if((strEx == ".avi") || (strEx == ".wav") || (strEx == ".mid"))
{
 MediaPlayer1->FileName=chName;
 MediaPlayer1->Open();
 MediaPlayer1->Play();
}

Аналогично, поместив на форму компонент TImage, можно просматривать графические файлы:

if((strEx == ".bmp") || (strEx== ".ico") || (strEx == ".wmf"))
 Image1->Picture->LoadFromFile(chName);

Любые другие действия выполняются аналогично.

В начало

Перемещение текстовой информации из других приложений

В Borland C++ Builder комонент TRichtEdit в полной мере поддерживает прием перетаскиваемой текстовой информации из других приложений (Word, Excel, Notepad.. ). Используя этот компонент можно организовать транзит данных в другие приложения.

Поместим на форму компоненты TListBox, TRichEdit и создадим обработчик события OnChange (или OnMouseMove) для компонента TRichEdit. Следующий код позволяет принять выделенный текст из другого приложения в компонент TRichEdit и передать его без изменения в TListBox. Сам компонент TRichEdit не требует никаких обработчиков событий для приема текста в свое окно.

void __fastcall
TForm1::RichEdit1Change(TObject *Sender)
{
 for(int i=0; i < RichEdit1->Lines->Count; i++)
 {
  ListBox1->Items->Strings[i]=RichEdit1->Lines->Strings[i];
  //Или
  ListBox1->Items->Add(RichEdit1->Lines->Strings[i]);
 }
 RichEdit1->Lines->Clear();
}

В начало

На главную подраздела о буксировке

Домой


Сайт управляется системой uCoz