Форум: "Начинающим";
Текущий архив: 2007.08.12;
Скачать: [xml.tar.bz2];
Внизdrag and drop и listview Найти похожие ветки
← →
calcal (2007-07-12 19:33) [0]Нашел инфу как сделать перенос файла на форму, но с компонентами этот прием не работает. Прочитал где-то что вроде как надо создать наследника компонента, но я в этом полный ноль. Помогите!
← →
Johnmen © (2007-07-12 23:41) [1]
> Помогите!
Это невозможно.
← →
metro (2007-07-13 09:21) [2]
> Это невозможно.
Почему?
← →
metro (2007-07-13 09:22) [3]Меня например тоже интересует этот вопрос.
← →
calcal (2007-07-13 09:23) [4]Может код здесь написать?
← →
{RASkov} © (2007-07-13 09:29) [5]> [4] calcal (13.07.07 09:23)
Напиши.
Я вот вообще не понял твой вопрос [0]....
Есть у меня один пример, но не уверен - он ли это.... т.е. для тебя ли...
← →
{RASkov} © (2007-07-13 09:30) [6]> [5] {RASkov} © (13.07.07 09:29)
> Напиши.
Т.е.... или задачу свою конкретнее объясни...
← →
calcal (2007-07-13 09:38) [7]Хорошо.
← →
Johnmen © (2007-07-13 09:38) [8]
> Почему?
Потому, что вопрос не ясен.
← →
calcal (2007-07-13 09:43) [9]Иногда очень полезно избавить пользователя от лишних операций при открытии файла.
Он должен нажать на кнопку " Открыть" , затем найти интересующий каталог, выбрать файл.
Проще перетащить мышкой файл сразу в окно приложения.
Рассмотрим пример перетаскивания 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;
← →
calcal (2007-07-13 09:45) [10]Так вот этот код работает когда переносим файл в любую часть окна. А мне нужно, чтобы перенос срабатывал на конкретном компоненте. Если поставить hadle листвью то работать не будет.
← →
{RASkov} © (2007-07-13 09:51) [11]> [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.
← →
{RASkov} © (2007-07-13 09:52) [12]Замени мой листбокс на свой листвью...
← →
{RASkov} © (2007-07-13 09:57) [13]> Если поставить hadle листвью то работать не будет.
Будет.... если ты будешь обрабатывать сообщение WM_DROPFILES не у формы, а у листвью... WndProc..
← →
calcal (2007-07-13 10:39) [14]Спасибо помогло. Правда есть один маленький минус. Курсор вне листвью имеет вид означающий, что переносить и в те области можно.
← →
{RASkov} © (2007-07-13 10:51) [15]> [14] calcal (13.07.07 10:39)
> Правда есть один маленький минус.
Тогда см [13]... и ЛистВью.WindowProc...
← →
{RASkov} © (2007-07-13 10:59) [16]> Правда есть один маленький минус. Курсор вне листвью имеет
> вид означающий, что переносить и в те области можно.
С другой стороны иногда и это полезно :) Типа винампа.... "кинули" файлы на него, а он их как и положено, добавил в плейлист....
:)
← →
Плохиш © (2007-07-13 11:31) [17]Используйте интерфейс IDropTarget.
← →
Плохиш © (2007-07-13 11:32) [18]Вот пример http://www.swissdelphicenter.ch/de/showcode.php?id=1627
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.08.12;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.045 c