Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2007, 12:39   #1
Cezar
Средний прогер
Форумчанин
 
Аватар для Cezar
 
Регистрация: 16.01.2007
Сообщений: 123
Вопрос Помогите с drag-and-drop

Каждая серьезная уважающая себя прога должна поддерживать перетаскивание объектов, т.е например в winamp можно перетащить какой-то трек или папку с музыкой прямо в окно, ибо удобно это...
Например я создал текстовый редактор, и мне нужно сделать так, чтобы текст можно было кидать прямо с проводника в мою форму, место того чтобы брать Файл/Открыть и тупо шнарить по папкам в поиске нужного файла...
Помню есть такое свойство DragMode, мне оно не помогло. Помогите кто знает!!!

ЗЫ.Искать на форуме не предлагать! Долго рылся по форуме, ниче не нашел...
Cezar вне форума Ответить с цитированием
Старый 01.04.2007, 13:45   #2
Umen
Форумчанин
 
Аватар для Umen
 
Регистрация: 10.11.2006
Сообщений: 189
По умолчанию

взято из DRKB


Цитата:
как принимать "перетаскиваемые" файлы.
При получении программой файлов, окну посылается сообщение WM_DROPFILES.
При помощи функции DragQueryFile можно определить количество и имена файлов.
При помощи функции DragQueryPoint можно определить координату мыши в тот момент,
когда пользователь "отпустил" файлы.
Эта программа открывает все "перетащенные" в нее файлы.
Причем, если пользователь перетащил файлы в PageControl1, то в PageControl1 эти файлы и откроются.
Код:
... 
public 
procedure WMDropFiles(var Msg: TWMDropFiles); 
message WM_DROPFILES; 
end; 
var 
Form1: TForm1; 
implementation 
{$R *.DFM} 
uses ShellAPI, stdctrls; 
procedure TForm1.WMDropFiles(var Msg: TWMDropFiles); 
var 
HF: THandle; 
s: array [0..1023] of char; 
i, FileCount: integer; 
p: TPoint; 
ts: TTabSheet; 
memo: TMemo; 
begin 
HF := Msg.Drop; 
FileCount := DragQueryFile(HF, $FFFFFFFF, nil, 0); 
for i := 0 to FileCount - 1 do begin 
DragQueryFile(HF, i, s, sizeof(s)); 
ts := TTabSheet.Create(nil); 
DragQueryPoint(HF, p); 
if PtInRect(PageControl1.BoundsRect, p) 
then ts.PageControl := PageControl1 
else ts.PageControl := PageControl2; 
ts.Caption := ExtractFileName(s); 
memo := TMemo.Create(nil); 
memo.Parent := ts; 
memo.Align := alClient; 
memo.Lines.LoadFromFile(s); 
end; 
DragFinish(HF); 
end; 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
PageControl1.Align := alLeft; 
PageControl2.Align := alClient; 
DragAcceptFiles(Form1.Handle, true); 
end; 
procedure TForm1.FormDestroy(Sender: TObject); 
begin 
DragAcceptFiles(Form1.Handle, false); 
end; 
Даниил Карапетян. 
На сайте http://delphi4all.narod.ru Вы найдете еще более 100 советов по Delphi. 
Email: delphi4all@narod.ru 
 
--------------------------------------------------------------------------------
{ На эту форму можно бросить файл (например из проводника) 
и он будет открыт } 
unit Unit1; 
interface 
uses 
Windows, Messages, SysUtils, Classes, Graphics, 
Controls, Forms, Dialogs,StdCtrls, 
ShellAPI {обязательно!}; 
type 
TForm1 = class(TForm) 
Memo1: TMemo; 
FileNameLabel: TLabel; 
procedure FormCreate(Sender: TObject); 
procedure FormDestroy(Sender: TObject); 
protected 
{Это и есть самая главная процедура} 
procedure WMDropFiles(var Msg: TMessage); message wm_DropFiles; 
end; 
var 
Form1: TForm1; 
implementation 
{$R *.DFM} 
procedure TForm1.WMDropFiles(var Msg: TMessage); 
var 
Filename: array[0 .. 256] of Char; 
Count : integer; 
begin 
{ Получаем количество файлов (просто пример) } 
nCount := DragQueryFile( msg.WParam, $FFFFFFFF, 
acFileName, cnMaxFileNameLen); 
{ Получаем имя первого файла } 
DragQueryFile( THandle(Msg.WParam), 
0, { это номер файла } 
Filename,SizeOf(Filename) ) ; 
{ Открываем его } 
with FileNameLabel do begin 
Caption := LowerCase(StrPas(FileName)); 
Memo1.Lines.LoadfromFile(Caption); 
end; 
{ Отдаем сообщение о завершении процесса } 
DragFinish(THandle(Msg.WParam)); 
end; 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
{ Говорим Windows, что на нас можно бросать файлы } 
DragAcceptFiles(Handle, True); 
end; 
procedure TForm1.FormDestroy(Sender: TObject); 
begin 
{ Закрываем за собой дверь золотым ключиком} 
DragAcceptFiles(Handle, False); 
end; 
end.
ещё вариант:
Цитата:
Иногда очень полезно избавить пользователя от лишних операций при открытии файла.
Он должен нажать на кнопку " Открыть" , затем найти интересующий каталог, выбрать файл.
Проще перетащить мышкой файл сразу в окно приложения.
Рассмотрим пример перетаскивания Drag & Drop в окно произвольного текстового файла,
который сразу же открывается в компоненте Memo1. Для начала в разделе Uses необходимо подключить модуль ShellAPI. В private области окна нужно вставить следующую строку:
procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;//получение сообщений о переносе файла в окно приложения

Процедура обработки этого сообщения будет выглядеть следующим образом:
procedure TForm1.WMDropFiles(var Msg: TWMDropFiles);
var
CFileName: array[0..MAX_PATH] of Char; // переменная, хранящая имя файла
begin
try


If DragQueryFile(Msg.Drop, 0, CFileName, MAX_PATH)> 0 then

// полу?ение пути файла

begin

Form1.Caption:=CFileName; // имя файла в заголовок окна

Memo1.Lines.LoadFromFile(CFileName) ; // открываем файл

Msg.Result := 0;

end;


finally

DragFinish(Msg.Drop); // отпустить файл

end;


end;

Для того, чтобы форма знала,
что может принимать такие файлы, необходимо в процедуре создания окна
указать:
procedure TForm1.FormCreate(Sender: TObject);
begin
DragAcceptFiles(Handle, True);
end;

Последний раз редактировалось rpy3uH; 29.07.2008 в 12:14.
Umen вне форума Ответить с цитированием
Старый 06.10.2008, 22:18   #3
yulia
Форумчанин
 
Аватар для yulia
 
Регистрация: 24.03.2007
Сообщений: 314
По умолчанию

здравствуйте... я использовала последний вариант, все работает классно... но не могли бы вы мне подсказать как сделать, чтобы он добавлял целую папку, а не по одному файлу?
yulia вне форума Ответить с цитированием
Старый 19.10.2008, 15:48   #4
Izhic
Форумчанин
 
Аватар для Izhic
 
Регистрация: 08.10.2008
Сообщений: 668
По умолчанию

О, Umen то что надо спасибо. Теперь добавляет ряд файлов.
Don't worry be happy
Izhic вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
drag $ drop в DBGrid AlexandrSid Общие вопросы Delphi 13 21.06.2010 10:55
Drag&Drop в ListBox'ах MAKEDON Общие вопросы Delphi 3 21.08.2008 13:12
Помогите, люди...Drag&Drop в С#-ной проге... homocogitum Общие вопросы .NET 3 02.05.2008 13:43
Drag&Drop shtuceron Общие вопросы Delphi 3 09.04.2008 19:04
Drag and Drop Xardas Общие вопросы Delphi 8 20.01.2008 23:09