Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Drag & drop в TDBGridEh  [new]
SergeyKNP
Member

Откуда:
Сообщений: 88
Тема старая и наверное уже были ответы на форуме, но не попался ответ нужный мне.

Хочу переместить с рабочего стола файлы на форму, но как поймать событие отпускания левой кнопки мыши только если под мышью конкретный DbgridEh?

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

Заранее благодарю.
1 июн 21, 18:55    [22330031]     Ответить | Цитировать Сообщить модератору
 Re: Drag & drop в TDBGridEh  [new]
SergeyKNP
Member

Откуда:
Сообщений: 88
гридов на форме несколько, но мне нужен конкретный
1 июн 21, 19:00    [22330036]     Ответить | Цитировать Сообщить модератору
 Re: Drag & drop в TDBGridEh  [new]
SergeyKNP
Member

Откуда:
Сообщений: 88
TForm1.WMDropFiles(var Msg: TWMDropFiles); срабатывает раньше TForm1.DBGridEh1MouseEnter(Sender: TObject);
1 июн 21, 19:12    [22330046]     Ответить | Цитировать Сообщить модератору
 Re: Drag & drop в TDBGridEh  [new]
alekcvp
Member

Откуда:
Сообщений: 2870
SergeyKNP,

А зачем ты у формы перекрываешь WMDropFiles? Перекрывай у грида.
https://stackoverflow.com/questions/16649442/how-do-i-allow-dragging-files-for-specific-controls-in-delphi

Сообщение было отредактировано: 1 июн 21, 19:20
1 июн 21, 19:28    [22330048]     Ответить | Цитировать Сообщить модератору
 Re: Drag & drop в TDBGridEh  [new]
SergeyKNP
Member

Откуда:
Сообщений: 88
alekcvp,
извини за тупость, но у меня не получилось воспроизвести тот пример, что в статье.
1 июн 21, 19:56    [22330056]     Ответить | Цитировать Сообщить модератору
 Re: Drag & drop в TDBGridEh  [new]
alekcvp
Member

Откуда:
Сообщений: 2870
SergeyKNP,

Ну держи немного говнокода:
+
unit dbgdMain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, DBGridEhGrouping, ToolCtrlsEh, DBGridEhToolCtrls, DynVarsEh, EhLibVCL, GridsEh,
  DBAxisGridsEh, DBGridEh;

type
  TDropFilesEvent = procedure (Sender: TObject; DropHandle: THandle) of object;

  TDBGridEh = class(DBGridEh.TDBGridEh)
  strict private
    FAcceptDroppedFiles: Boolean;
    FOnDropFiles: TDropFilesEvent;
    procedure SetAcceptDroppedFiles(const Value: Boolean);
  protected
    procedure WMDropFiles(var Message: TWMDropFiles); message WM_DROPFILES;
    procedure CreateWnd; override;
  public
    property AcceptDroppedFiles: Boolean read FAcceptDroppedFiles write SetAcceptDroppedFiles;
    property OnDropFiles: TDropFilesEvent read FOnDropFiles write FOnDropFiles;
  end;

  TForm1 = class(TForm)
    DBGridEh1: TDBGridEh;
    DBGridEh2: TDBGridEh;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    procedure DBGridEh2FilesDropped(Sender: TObject; DropHandle: THandle);
  end;

var
  Form1: TForm1;

implementation

uses
  Winapi.ShellAPI;

{$R *.dfm}

{ TDBGridEh }

procedure TDBGridEh.CreateWnd;
begin
  inherited;
  if AcceptDroppedFiles then
    DragAcceptFiles(Handle, TRUE);
end;

procedure TDBGridEh.SetAcceptDroppedFiles(const Value: Boolean);
begin
  if FAcceptDroppedFiles <> Value then
  begin
    FAcceptDroppedFiles := Value;
    if HandleAllocated then
      DragAcceptFiles(Handle, Value);
  end;
end;

procedure TDBGridEh.WMDropFiles(var Message: TWMDropFiles);
begin
  if Assigned(FOnDropFiles) then
    FOnDropFiles(Self, Message.Drop);
end;

{ TForm1 }

procedure TForm1.DBGridEh2FilesDropped(Sender: TObject; DropHandle: THandle);
var
  Count: Integer;
begin
  Count := DragQueryFile(DropHandle, $FFFFFFFF, nil, 0);
  ShowMessage(Format('%d файлов принято!', [Count]));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DBGridEh2.AcceptDroppedFiles := True;
  DBGridEh2.OnDropFiles := DBGridEh2FilesDropped;
end;

end.


Сообщение было отредактировано: 1 июн 21, 20:44
1 июн 21, 20:28    [22330061]     Ответить | Цитировать Сообщить модератору
 Re: Drag & drop в TDBGridEh  [new]
SergeyKNP
Member

Откуда:
Сообщений: 88
alekcvp,
СУПЕР!!! Огромное СПС!!!
1 июн 21, 21:19    [22330090]     Ответить | Цитировать Сообщить модератору
 Re: Drag & drop в TDBGridEh  [new]
alekcvp
Member

Откуда:
Сообщений: 2870
SergeyKNP,

Только учти что WM_DROPFILES - это пример. Там ещё надо вернуть 0 в результате и DragFinish() вызвать.
1 июн 21, 21:53    [22330104]     Ответить | Цитировать Сообщить модератору
 Re: Drag & drop в TDBGridEh  [new]
SergeyKNP
Member

Откуда:
Сообщений: 88
alekcvp,

я в инэте код нашёл и вот что получилось. Правильно так?
+

{ TForm1 }
procedure TForm1.DBGridEh2FilesDropped(Sender: TObject; DropHandle: THandle);
var
  Count: Integer;

  DropH: HDROP; // дескриптор операции перетаскивания
  DroppedFileCount: Integer; // количество переданных файлов
  FileNameLength: Integer; // длина имени файла
  FileName: string; // буфер, принимающий имя файла
  I: Integer; // итератор для прохода по списку
  DropPoint: TPoint; // структура с координатами операции Drop
begin
  // Count := DragQueryFile(DropHandle, $FFFFFFFF, nil, 0);
  // ShowMessage(Format('%d файлов принято!', [Count]));
  inherited;
  // Сохраняем дескриптор
  DropH := DropHandle;
  try
    // Получаем количество переданных файлов
    DroppedFileCount := DragQueryFile(DropH, $FFFFFFFF, nil, 0);
    // Получаем имя каждого файла и обрабатываем его
    for I := 0 to Pred(DroppedFileCount) do
    begin
      // получаем размер буфера
      FileNameLength := DragQueryFile(DropH, I, nil, 0);
      // создаем буфер, который может принять в себя строку с именем файла
      // (Delphi добавляет терминирующий ноль автоматически в конец строки)
      SetLength(FileName, FileNameLength);
      // получаем имя файла
      DragQueryFile(DropH, I, PChar(FileName), FileNameLength + 1);
      // что-то делаем с данным именем (все зависит от вашей фантазии)
      // ... код обработки пишем здесь
    end;
    // Опционально: получаем координаты, по которым произошла операция Drop
    DragQueryPoint(DropH, DropPoint);
    // ... что-то делаем с данными координатами здесь
  finally
    // Финализация - разрушаем дескриптор
    // не используйте DropH после выполнения данного кода...
    DragFinish(DropH);
  end;

end;



Сообщение было отредактировано: 1 июн 21, 23:44
1 июн 21, 23:45    [22330125]     Ответить | Цитировать Сообщить модератору
 Re: Drag & drop в TDBGridEh  [new]
alekcvp
Member

Откуда:
Сообщений: 2870
SergeyKNP,

1. Зачем лишняя переменная DropH?..
2. В моём варианте ещё можно WMDropFiles доработать, на случай отсутствующего обработчика событий:

procedure TDBGridEh.WMDropFiles(var Message: TWMDropFiles);
begin
  if Assigned(FOnDropFiles) then
    FOnDropFiles(Self, Message.Drop)
  else 
    DropFinish(Message.Drop);
end;
2 июн 21, 02:44    [22330138]     Ответить | Цитировать Сообщить модератору
 Re: Drag & drop в TDBGridEh  [new]
SergeyKNP
Member

Откуда:
Сообщений: 88
alekcvp,

procedure TDBGridEh.WMDropFiles(var Message: TWMDropFiles);
begin
  if Assigned(FOnDropFiles) then
    FOnDropFiles(Self, Message.Drop)
  else 
    DropFinish(Message.Drop);
end;


DropFinish(Message.Drop); это не ошибка? Ругается. Может правильно так ?

if Assigned(FOnDropFiles) then
FOnDropFiles(Self, Message.Drop)
else
DragFinish(Message.Drop);

Сообщение было отредактировано: 2 июн 21, 09:16
2 июн 21, 09:21    [22330174]     Ответить | Цитировать Сообщить модератору
 Re: Drag & drop в TDBGridEh  [new]
alekcvp
Member

Откуда:
Сообщений: 2870
SergeyKNP,

Да, опечатался.
2 июн 21, 12:01    [22330242]     Ответить | Цитировать Сообщить модератору
 Re: Drag & drop в TDBGridEh  [new]
SergeyKNP
Member

Откуда:
Сообщений: 88
alekcvp,

ещё один прикол, почему-то DragAndDrop не работает если тащить файлы из Outlook сразу в DBgridEh, а на Рабочий стол и потом и с Рабочего стола работает. :(
3 июн 21, 12:19    [22330839]     Ответить | Цитировать Сообщить модератору
 Re: Drag & drop в TDBGridEh  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32387

03.06.2021 12:19, SergeyKNP пишет:
> ещё один прикол, почему-то DragAndDrop не работает если тащить файлы из Outlook сразу в DBgridEh, а на Рабочий стол и потом и с Рабочего стола работает. :(

когда тащишь из Outlook-а, их нет в файловой системе.

Posted via ActualForum NNTP Server 1.5

3 июн 21, 12:52    [22330856]     Ответить | Цитировать Сообщить модератору
 Re: Drag & drop в TDBGridEh  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2569
Там ole драгдроп надо юзать. Поддерживать соответствующие интерфейсы
3 июн 21, 19:33    [22331080]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить