Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.49 MB
Время: 0.054 c
15-1184329607
Zagaevskiy
2007-07-13 16:26
2007.08.12
Проводник


2-1184743005
Grademax
2007-07-18 11:16
2007.08.12
Как узнать окно какой программы активно в данный момент?


15-1184255892
Petr V. Abramov
2007-07-12 19:58
2007.08.12
А почему в Маскве


2-1183970865
Newser
2007-07-09 12:47
2007.08.12
тип поля - Дата/время


1-1180540958
DevilDevil
2007-05-30 20:02
2007.08.12
DragDrop для закладок TTabControl-а





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский