link3834 link3835 link3836 link3837 link3838 link3839 link3840 link3841 link3842 link3843 link3844 link3845 link3846 link3847 link3848 link3849 link3850 link3851 link3852 link3853 link3854 link3855 link3856 link3857 link3858 link3859 link3860 link3861 link3862 link3863 link3864 link3865 link3866 link3867 link3868 link3869 link3870 link3871 link3872 link3873 link3874 link3875 link3876 link3877 link3878 link3879 link3880 link3881 link3882 link3883 link3884 link3885 link3886 link3887 link3888 link3889 link3890 link3891 link3892 link3893 link3894 link3895 link3896 link3897 link3898 link3899 link3900 link3901 link3902 link3903 link3904 link3905 link3906 link3907 link3908 link3909 link3910 link3911 link3912 link3913 link3914 link3915 link3916 link3917 link3918 link3919 link3920 link3921 link3922 link3923 link3924 link3925 link3926 link3927 link3928 link3929 link3930 link3931 link3932 link3933 link3934 link3935 link3936 link3937 link3938 link3939 link3940 link3941 link3942 link3943 link3944 link3945 link3946 link3947 link3948 link3949 link3950 link3951 link3952 link3953 link3954 link3955 link3956 link3957 link3958 link3959 link3960 link3961 link3962 link3963 link3964 link3965 link3966 link3967 link3968 link3969 link3970 link3971 link3972 link3973 link3974 link3975

Форум — Ответы     (  К темам )
 ?  Art: Кто знает, как сделать форму приёмником внешнего Drag-and-Drop'а? (31-03-2003 19:00:41)
Конкретная задача: получить значение ячейки MS Excel, которая была "перетащена" (dragged-and-dropped) в разработанное приложение. Если кто знает, как реализуется внешний drag-and-drop, или где про это прочитать, подскажите, пожалуйста.
 ACD (01-04-2003 03:36:43)
В конструкторе формы — DragAcceptFiles(Handle,true);
В хеддере , например так
public:
void __fastcall onDropFl(TWMDropFiles& Message);

BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_DROPFILES,TWMDropFiles,onDropFl);
END_MESSAGE_MAP(TForm)

Далее , в реализуешь это в .cpp
void __fastcall TForm1::onDropFl(TWMDropFiles& Message)
{
char path[MAX_PATH];
HWND hw;
int nFiles;

HDROP drop=(HDROP)Message.Drop;
nFiles=DragQueryFile(drop,-1,NULL,NULL);
for(int i=0;i<nFiles;i++)
{DragQueryFile(drop,i,path,sizeof(path));
...;}

DragQueryPoint(drop,&point);
DragFinish(drop);
}

В коде может быть что-то лишнее — просто скопировал кусок из одного проекта и удалил не относящееся к вопросу.
 ACD (01-04-2003 03:41:16)
Хотя если перетаскивать ячейку Excel то не знаю , что будет в path , и что вообще вернет DragQueryFile.
 Art (01-04-2003 11:12:29)
ACD, cпасибо, конечно, но это не помогает. Ты предлагаешь зарегистрировать приложение как приёмник сообщения WM_DROPFILES функцией DragAcceptFiles, а затем повестить на это сообщение свой обработчик. Это здорово, но мне файлы не нужны (компоненты-приёмники/источники dragged-and-dropped URL, BMP, файлов и папок созданы ещё для Delphi 4 — правда они коряво портируются в C++ Builder 5.0), а нужен мне ЛЮБОЙ DragOver/DragDrop из других приложений.
В WinSigth есть Message wm_dropObject — прямо по соседству с WM_DROPFILES. Одна проблема: я не знаю как зарегистрировать приложение на получение этого сообщения!
HELP!!!!
 ACD (03-04-2003 03:10:34)
Смотрел в MSDN WM_DROPOBJECT не нашел.
Что то есть по IDropTarget Interface :
RegisterDragDrop(),RevokeDragDrop()...
но как это все применить в билдере не известно.
 Art (03-04-2003 12:06:22)
ACD, большое спасибо за такое участие!
Я уже нашёл нужный компонент TTextDropTarget — поставляется с 6-м Builder'ом. Excel при начале Drag'а создаёт свой мультиинтерфейсный DragObject, который в том числе поддерживает CF_TEXT. Теперь экспериментирую, как получить из этого DragObject'а все поддерживаемые им форматы: должно получиться как в офисном PasteSpecial.
Ещё раз спасибо. ;-)