Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.12;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.028 c
2-1184326542
Romikremind
2007-07-13 15:35
2007.08.12
Проблемы с русским языком


2-1184610803
Knob
2007-07-16 22:33
2007.08.12
Определение координат ячейки в Excel


15-1184238783
Megabyte
2007-07-12 15:13
2007.08.12
Правила формирования xml-файлов


2-1184135112
Б.А.С.
2007-07-11 10:25
2007.08.12
Программный вход в систему


11-1167112012
Fantasy
2006-12-26 08:46
2007.08.12
http://www.kolnmck.ru/ не работает! не открывается!