Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

drag and drop и listview


calcal ©   (2007-07-12 19:33:00) 

Нашел инфу как сделать перенос файла на форму, но с компонентами этот прием не работает. Прочитал где-то что вроде как надо создать наследника компонента, но я в этом полный ноль. Помогите!


Плохиш   (2007-07-13 11:32:00) [1]

Вот пример http://www.swissdelphicenter.ch/de/showcode.php?id=1627


Плохиш   (2007-07-13 11:31:00) [2]

Используйте интерфейс IDropTarget.


{RASkov}   (2007-07-13 10:59:00) [3]

> Правда есть один маленький минус. Курсор вне листвью имеет
> вид означающий, что переносить и в те области можно.

С другой стороны иногда и это полезно :) Типа винампа.... "кинули" файлы на него, а он их как и положено, добавил в плейлист....
:)


{RASkov}   (2007-07-13 10:51:00) [4]

> [14] calcal   (13.07.07 10:39)
> Правда есть один маленький минус.

Тогда см [13]... и ЛистВью.WindowProc...


calcal   (2007-07-13 10:39:00) [5]

Спасибо помогло. Правда есть один маленький минус. Курсор вне листвью имеет вид означающий, что переносить и в те области можно.


{RASkov}   (2007-07-13 09:57:00) [6]

> Если поставить hadle листвью то работать не будет.

Будет.... если ты будешь обрабатывать сообщение WM_DROPFILES не у формы, а у листвью... WndProc..


{RASkov}   (2007-07-13 09:52:00) [7]

Замени мой листбокс на свой листвью...


{RASkov}   (2007-07-13 09:51:00) [8]

> [10] calcal   (13.07.07 09:45)

Ок. Вот глянь:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls, ShellApi;

type
 TForm1 = class(TForm)
   ListBox1: TListBox;
   ListBox2: TListBox;
   procedure FormCreate(Sender: TObject);
 private
   procedure DropFiles(var Mes: TWmDropFiles); message WM_DROPFILES;
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure AddFile(const FL: String; Lst: TWinControl);
begin
  if Assigned(Lst) and (Lst is TListBox) then (Lst as TListBox).Items.Add(FL);
end;

procedure TForm1.DropFiles(var Mes: TWmDropFiles);
var N, I: Integer;
FlNm: String;
L: TWinControl;
P: TPoint;
begin
 N:=DragQueryFile(Mes.Drop, $FFFFFFFF, nil, 0)-1;
 GetCursorPos(P);
 L:=FindControl(WindowFromPoint(P));
 try
  for I:=0 to N do begin
   SetLength(FlNm, MAX_PATH);
   DragQueryFile(Mes.Drop, I, PChar(FlNm), MAX_PATH);
   FlNm:=PChar(FlNm);
   AddFile(FlNm, L);
  end;
  if N>=0 then AddFile('<<***Добавлено '+IntToStr(N+1)+' файл(а,ов)***>>', L);
 finally DragFinish(Mes.Drop); end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var N, N1: Integer;
begin
 ListBox1.Clear;
 N1:=ParamCount;
 for N:=1 to N1 do AddFile(ParamStr(N), ListBox1);
 if N1>0 then AddFile('<<***Добавлено '+IntToStr(N1)+' файл(а,ов)***>>', ListBox1);
 DragAcceptFiles(Handle, True);
end;

end.


calcal   (2007-07-13 09:45:00) [9]

Так вот этот код работает когда переносим файл в любую часть окна. А мне нужно, чтобы перенос срабатывал на конкретном компоненте. Если поставить hadle листвью то работать не будет.


calcal   (2007-07-13 09:43:00) [10]

Иногда очень полезно избавить пользователя от лишних операций при открытии файла.
Он должен нажать на кнопку " Открыть" , затем найти интересующий каталог, выбрать файл.
Проще перетащить мышкой файл сразу в окно приложения.
Рассмотрим пример перетаскивания 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;


Johnmen   (2007-07-13 09:38:00) [11]


> Почему?

Потому, что вопрос не ясен.


calcal   (2007-07-13 09:38:00) [12]

Хорошо.


{RASkov}   (2007-07-13 09:30:00) [13]

> [5] {RASkov} ©   (13.07.07 09:29)
> Напиши.

Т.е.... или задачу свою конкретнее объясни...


{RASkov}   (2007-07-13 09:29:00) [14]

> [4] calcal   (13.07.07 09:23)

Напиши.

Я вот вообще не понял твой вопрос [0]....
Есть у меня один пример, но не уверен - он ли это.... т.е. для тебя ли...


calcal   (2007-07-13 09:23:00) [15]

Может код здесь написать?


metro   (2007-07-13 09:22:00) [16]

Меня например тоже интересует этот вопрос.


metro   (2007-07-13 09:21:00) [17]


> Это невозможно.


Почему?


Johnmen   (2007-07-12 23:41:00) [18]


> Помогите!

Это невозможно.


Наверх

Титульная страница Поиск, карта сайта Написать письмо