![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]
> Помогите!
Это невозможно.