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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2013, 10:43   #1
vmilyoshin
Пользователь
 
Регистрация: 20.02.2010
Сообщений: 66
По умолчанию Перетаскивание файлов (DragDrop)

Всем привет!
Есть форма на ней имеется компанент Panel. Мне нужно узнать имя файла перетаскиваемо именно на Panel а не на форму.
Делаю так для всей формы, то получается узнать имя файла:
DragAcceptFiles(Handle, true);
Но мне вся форма не нужна, то делаю так:
DragAcceptFiles(Panel1.Handle, true);
Ну тогда не работает ниже выложенный код. Как его переделать именно для Panel ?
Код:
protected
  procedure WMDropFiles (var Msg: TMessage); message wm_DropFiles;
 
procedure TForm1.WMDROPFILES(var Msg: TMessage);
var
  i, amount, size: integer;
  Filename: PChar;
begin
  inherited;
  Amount := DragQueryFile(Msg.WParam, $FFFFFFFF, Filename, 255);
  for i := 0 to (Amount - 1) do
  begin
    size := DragQueryFile(Msg.WParam, i, nil, 0) + 1;
    Filename := StrAlloc(size);
    DragQueryFile(Msg.WParam, i, Filename, size);
    ShowMessage(StrPas(Filename));
    StrDispose(Filename);
  end;
  DragFinish(Msg.WParam);
end;

Последний раз редактировалось Stilet; 06.12.2013 в 12:47.
vmilyoshin вне форума Ответить с цитированием
Старый 06.12.2013, 12:50   #2
tsar_
Форумчанин
 
Аватар для tsar_
 
Регистрация: 06.01.2011
Сообщений: 369
По умолчанию

Примеры привести не могу, но возможные пути решения:
1. Сделать компонент-наследник TPanel (радикально и красиво)
...или...
2. Воспользоваться функцией DragQueryPoint, которая, если не ошибаюсь, возвращает координаты курсора в момент сбрасывания файлов на форму. Если координаты внутри панели - делай, что нужно.

Также для общего развития предлагаю почитать вот это
Программирую по необходимости
tsar_ вне форума Ответить с цитированием
Старый 06.12.2013, 13:14   #3
vmilyoshin
Пользователь
 
Регистрация: 20.02.2010
Сообщений: 66
По умолчанию

Цитата:
Сообщение от tsar_ Посмотреть сообщение
Примеры привести не могу, но возможные пути решения:
1. Сделать компонент-наследник TPanel (радикально и красиво)
...или...
2. Воспользоваться функцией DragQueryPoint, которая, если не ошибаюсь, возвращает координаты курсора в момент сбрасывания файлов на форму. Если координаты внутри панели - делай, что нужно.

Также для общего развития предлагаю почитать вот это
То что вы предлодили почитать я и так знаю.
Мой вопрос иной. Как переделать данную процедуру только к Panel а не ко всей форме?
vmilyoshin вне форума Ответить с цитированием
Старый 06.12.2013, 13:30   #4
tsar_
Форумчанин
 
Аватар для tsar_
 
Регистрация: 06.01.2011
Сообщений: 369
По умолчанию

Цитата:
1. Сделать компонент-наследник TPanel
И использовать его вместо стандартного.
Программирую по необходимости
tsar_ вне форума Ответить с цитированием
Старый 06.12.2013, 15:11   #5
vmilyoshin
Пользователь
 
Регистрация: 20.02.2010
Сообщений: 66
По умолчанию

Цитата:
Сообщение от tsar_ Посмотреть сообщение
И использовать его вместо стандартного.
Пытаюсь создать новый компонент, но ни черта не выходит.

unit DPanel;

interface

uses
SysUtils, Classes, Controls, ExtCtrls, Messages, Dialogs, ShellApi;

type
TDPanel = class(TPanel)
private
{ Private declarations }
protected
{ Protected declarations }
public
procedure WMDropFiles (var Msg: TMessage); message wm_DropFiles;
{ Public declarations }
published
{ Published declarations }
end;

procedure Register;

implementation


procedure Register;
begin
RegisterComponents('Samples', [TDPanel]);
end;

procedure WMDROPFILES(var Msg: TMessage);
var
i, amount, size: integer;
Filename: PChar;
begin
Amount := DragQueryFile(Msg.WParam, $FFFFFFFF, Filename, 255);
for i := 0 to (Amount - 1) do
begin
size := DragQueryFile(Msg.WParam, i, nil, 0) + 1;
Filename := StrAlloc(size);
DragQueryFile(Msg.WParam, i, Filename, size);
ShowMessage(StrPas(Filename));
StrDispose(Filename);
end;
DragFinish(Msg.WParam);
end;


end.
vmilyoshin вне форума Ответить с цитированием
Старый 06.12.2013, 17:04   #6
vmilyoshin
Пользователь
 
Регистрация: 20.02.2010
Сообщений: 66
По умолчанию

Всем спасибо. Решил проблему так.

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, ShellApi, DragDrop, DropTarget, DragDropGraphics;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    procedure FormCreate(Sender: TObject);
    protected
  procedure WMDropFiles (var Msg: TMessage); message wm_DropFiles;
  private
    { Private declarations }
  public

    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
DragAcceptFiles(Handle, true);
end;

procedure TForm1.WMDROPFILES (var Msg: TMessage);
var
  Amount, size, i: integer;
  Filename: PAnsiChar;
  Cur: TPoint;
  mx, my: integer;
begin
  inherited;
  GetCursorPos(Cur);
  mx:= Cur.X;
  my:= Cur.Y;
  if FindControl(WindowFromPoint( Cur )).Name = 'Panel1' then
  begin
  Amount := DragQueryFile(Msg.WParam, $FFFFFFFF, Filename, 255);
  if Amount > 1 then
  begin
  showmessage('Íóæíî ïåðåòàùèòü îäèí ôàéë.');
  Exit;
  end;
  for i := 0 to (Amount - 1) do
  begin
  size := DragQueryFile(Msg.WParam, i, nil, 0) + 1;
  Filename := StrAlloc(size);
  DragQueryFile(Msg.WParam, i, Filename, size);
  ShowMessage(StrPas(Filename));
  StrDispose(Filename);
  end;
  DragFinish(Msg.WParam);
  end;
end;

end.
vmilyoshin вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Dragdrop в Virtualtreeview NaumOff Компоненты Delphi 0 14.11.2012 00:01
Перемещение файлов и папок из файловых менеджеров с помощъю DragDrop hon Компоненты Delphi 1 12.01.2012 01:37
Перетаскивание Drulya C# (си шарп) 0 15.09.2011 16:51
ListView DragDrop Vipa Компоненты Delphi 10 07.08.2009 11:21