1 (edited by mikhail_a 2019-07-28 20:04:32)

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

Есть таблица, в которую добавляются ссылки на файлы.
Добавление происходит путем использования стандартного диалога открытия файла. Однако, это уже прошлый век и хочется реализовать механизм Drag&Drop, т.е. просто мышью перетаскивать из проводника файлы в эту таблицу.
В Delphi это делается элементарно.
А как сделать это в MVD?
Если пока невозможно, то прошу разработчка добавить соотв. функции.
Рабочий (сам проверял) пример перетаскивания файлов в листбокс (Delphi):
1. Добавить в секцию uses: Shellapi
2. Добавляем в implementation:
//процедура извлечения файлов при перетаскивании
procedure TForm1.WMDropFiles(var Msg: TWMDropFiles);
var
  i: integer;//счетчик файлов
  CountFile: integer;//кол-во файлов
  size: integer;//длина строки, содержащей путь к файлу
  Filename: PChar; //указатель на имя файла
begin
try
  //функция DragQueryFile извлекает имена перемещенных мышью файлов
  //получает кол-во перемещаемых файлов
  CountFile := DragQueryFile(Msg.Drop, $FFFFFFFF, Filename, 255);
  //извлекаем пути перемещаемых файлов и добавляем их в ListBox
  for i := 0 to (CountFile - 1) do
  begin
    //получаем длину строки, содержащей путь к файлу
    size := DragQueryFile(Msg.Drop, i , nil, 0)+1;
    //выделяем память под строку с именем файла
    Filename:= StrAlloc(size);
    //получаем непосредственно само имя файла и путь
    DragQueryFile(Msg.Drop,i , Filename, size);
    //Добавляем его в ListBox
    lst1.items.add(StrPas(Filename));
    //освобождаем строку
    StrDispose(Filename);
  end;
finally
  DragFinish(Msg.Drop); // отпустим файл
end;
end;

3. добавляем процедуру
procedure TForm1.FormCreate(Sender: TObject);
begin
/регистрируем, что ListBox1 будет принимать файлы
  DragAcceptFiles(Form1.Lst1.Handle, True);
//Внимание, если ListBox находится на панели, то для регистрации пишем
//DragAcceptFiles(Form1.Handle, True);
end;

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

Постараюсь в ближайшее время сделать новое событие для компонентов OnDropFiles, будет что то типа такого

procedure Form1_Panel1_OnDropFiles (Sender: TObject; ArrayOfFiles: array of string);
begin

end;
Dmitry.

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

Скачайте пожалуйста последнюю бета версию
https://www.dropbox.com/s/53bhjcbbu6jr3 … a.zip?dl=0



Для компонентов
Form, Button, Edit, EditCount, Memo, TableGrid, TreeView, ComboBox, FileToDatabase, GroupBox, PageControl, TabSheet, Panel

добавил событие OnDropFiles



пример использования

procedure Form1_Memo1_OnDropFiles (Sender: TObject; ArrayOfFiles: array of string; X, Y: Integer);
var
    i, c: integer;
begin
    c := Length(ArrayOfFiles)-1;
    for i := 0 to c do
    begin
        Form1.Memo1.Lines.Add(ArrayOfFiles[i]);
    end;
end;
Dmitry.

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

Отлично работает!
...
Подскажите, что не так в коде при заполнении таблицы?
Дает ошибку "Cannot assign a nil to a TColumnFooter.":

procedure Form1_TableGrid1_OnDropFiles (Sender: TObject; ArrayOfFiles: array of string; X, Y: Integer);
var
   j, c: integer;
    NxTextColumn: TNxTextColumn;
begin
    Form1.TableGrid1.Columns.Clear;
    Form1.TableGrid1.Columns.Add(TNxTextColumn);
    Form1.TableGrid1.Columns[0].Color := clWhite;

    c := Length(ArrayOfFiles)-1;
    for j := 0 to c do
    begin
        Form1.TableGrid1.AddRow(1);
        Form1.TableGrid1.Cells[0,j] :=  ArrayOfFiles[j];
    end;


end;

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

попробуйте так

procedure Form1_TableGrid1_OnDropFiles (Sender: TObject; ArrayOfFiles: array of string; X, Y: Integer);
var
   j, c: integer;
    NxTextColumn: TNxTextColumn;
begin
    Form1.TableGrid1.Columns.Clear;
    try
        Form1.TableGrid1.Columns.Add(TNxTextColumn);
    except
    end;
    
    Form1.TableGrid1.Columns[0].Color := clWhite;

    c := Length(ArrayOfFiles)-1;
    for j := 0 to c do
    begin
        Form1.TableGrid1.AddRow(1);
        Form1.TableGrid1.Cells[0,j] :=  ArrayOfFiles[j];
    end;


end;
Dmitry.

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

Нет, только для тех компонентов, которым присвоено событие OnDropFiles

Dmitry.