Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Как поместить в Clipboard любой файл?   Найти похожие ветки 

 
Прогер   (2012-08-09 21:56) [0]

Я так понимаю он может хранить только текст и рисунки.
А как же делается Ctrl + C/ Ctrl + V? Для любого файла.


 
DVM ©   (2012-08-09 22:08) [1]

сам файл туда не кладется, имя файла только, точнее список имен файлов.


 
tesseract ©   (2012-08-09 22:09) [2]

Он может хранить ole-объекты.


 
Rouse_ ©   (2012-08-09 22:09) [3]

http://rouse.drkb.ru/winapi.php#fwoledragdrop


 
Прогер   (2012-08-09 22:19) [4]


> DVM ©   (09.08.12 22:08) [1]
>
> сам файл туда не кладется, имя файла только, точнее список
> имен файлов.


Есть список путей для файлов.
Как поместить их в TClipboard?
Я что-то не догоняю.

Спасибо.


 
Rouse_ ©   (2012-08-09 22:28) [5]


> Есть список путей для файлов.
> Как поместить их в TClipboard?

Мой пример посмотри.


 
Прогер   (2012-08-09 22:37) [6]


> Rouse_ ©   (09.08.12 22:28) [5]


Т.е. стандартный Clipboard этого делать не умеет?


 
Rouse_ ©   (2012-08-09 22:53) [7]


> Т.е. стандартный Clipboard этого делать не умеет?

Именно он это и делает :) Им просто нужно уметь пользоваться.


 
Прогер   (2012-08-09 23:03) [8]


> Rouse_ ©   (09.08.12 22:53) [7]


Так... Не уходите... :)
Ща буду спрашивать.


 
Прогер   (2012-08-09 23:07) [9]


> Rouse_ ©   (09.08.12 22:53) [7]
>
>
> > Т.е. стандартный Clipboard этого делать не умеет?
>
> Именно он это и делает :) Им просто нужно уметь пользоваться.
>


Но TClipboard даже не подключен?


 
Прогер   (2012-08-09 23:10) [10]

Как этим чудом пользоваться?



FList - TStringList со списком путей к файлам.

procedure FilesToClipboard;
var
 i: LongInt;
  O: TFWDataObject;
begin
 O:= TFWDataObject.Create;
  For i:= 0 to FList.Count - 1 do
     O.AddFile(FList[i]);

 O.Free;
end;



Нажимаю Ctrl + V - ничего не "вставляет".
Что не так делаю? :)


 
Прогер   (2012-08-09 23:52) [11]

Разобрался, но программа вылетает "Invalid pointer operation". Но копирует файлы в буфер.

Что не так?



procedure FilesToClipboard;
var
i: LongInt;
 O: TFWCopyDataProvider;
begin
O:= TFWCopyDataProvider.Create;
try
O.ClearClipboard;
 For i:= 0 to FList.Count - 1 do
    O.AddFile(FList[i]);
O.CopyToClibboard; // Тут вылетает.
finally
O.Free;
end;
end;


 
Palladin ©   (2012-08-09 23:57) [12]

если принять безошибочность Розыча, то в реальности исключение возникает строчкой выше (особенность дебуггера), а FList"а не существует


 
Прогер   (2012-08-10 00:06) [13]


> Palladin ©   (09.08.12 23:57) [12]
>
> если принять безошибочность Розыча, то в реальности исключение
> возникает строчкой выше (особенность дебуггера), а FList"а
> не существует


FList -существует. Он создается в другой функции.

Если эту строчку закомментить, то не вылетает. В чем подвох?


 O.CopyToClibboard; // Тут вылетает.


 
Германн ©   (2012-08-10 01:45) [14]


> Если эту строчку закомментить, то не вылетает. В чем подвох?

Для поиска и идентификации "подвоха" надо в IDE Дельфи нажать в нужной последовательности кнопки F5, F7 и F9. И не надо думать, что кто-то будет искать этот подвох за вас.
P.S.
Что-то, где-то, вроде читал не так давно об исключении Invalid pointer operation. Что-то вроде того, что иногда это исключение означает не совсем то, что следует из его названия. Но после отпуска нахожусь в запарке и забываю запоминать ссылки на интересное. :(


 
Псарь   (2012-08-10 02:35) [15]

А не, вылетает при O.Free.

А если не вызывать  O.CopyToClibboard, то O.Free нормально отрабатывается.


 
Прогер   (2012-08-10 02:35) [16]

А не, вылетает при O.Free.
А если не вызывать  O.CopyToClibboard, то O.Free нормально отрабатывается.


 
Германн ©   (2012-08-10 02:42) [17]


> А не, вылетает при O.Free.

Ещё раз. "надо в IDE Дельфи нажать в нужной последовательности кнопки F5, F7 и F9".


 
sniknik ©   (2012-08-10 08:14) [18]

возможно, структуру нужно завершить... не знаю как тут, но довольно часто встречал, что признаком является два нулевых символа, в отличие от одного завершающего строку.

попробуй после цикла добавить O.AddFile(#0#0);, хотя, конечно завершение может быть и другим. или не нужна вообще ... чисто предположение.


 
Прогер   (2012-08-10 20:19) [19]


> sniknik ©   (10.08.12 08:14) [18]
>
> возможно, структуру нужно завершить... не знаю как тут,
> но довольно часто встречал, что признаком является два нулевых
> символа, в отличие от одного завершающего строку.
>
> попробуй после цикла добавить O.AddFile(#0#0);


Не помогает.


> Германн ©   (10.08.12 02:42) [17]
>
>
> > А не, вылетает при O.Free.
>
> Ещё раз. "надо в IDE Дельфи нажать в нужной последовательности
> кнопки F5, F7 и F9".
>


Говорит "Invalid Pointer Operation".


 
sniknik ©   (2012-08-10 20:59) [20]

> Не помогает.
еще бы... я думал что то реально не то, а посмотрел... ты код Rouse исковеркал до полной "нерабочести" просто.


 
Прогер   (2012-08-10 21:39) [21]


> sniknik ©   (10.08.12 20:59) [20]
>
> > Не помогает.
> еще бы... я думал что то реально не то, а посмотрел... ты
> код Rouse исковеркал до полной "нерабочести" просто.


А что там коверкать то?


 
Palladin ©   (2012-08-10 21:49) [22]

епт, посмотрел исходники Саши... )
не... ну... а что тут удивляться )


 
sniknik ©   (2012-08-10 22:12) [23]

> А что там коверкать то?
действительно, как два пальца об... асфальт. и зачем машине мотор? ездит то она на колесах. :)


 
Германн ©   (2012-08-11 02:52) [24]


>
> > Германн ©   (10.08.12 02:42) [17]
> >
> >
> > > А не, вылетает при O.Free.
> >
> > Ещё раз. "надо в IDE Дельфи нажать в нужной последовательности
> > кнопки F5, F7 и F9".
> >
>
>
> Говорит "Invalid Pointer Operation".

Это мы уже слышали. Где именно (на какой строчке кода) говорит?


 
Rouse_ ©   (2012-08-11 10:52) [25]


> Что не так?

Все не так. Во первых ты пытаешся убить интерфейс. Во вторых ты не назначил обработчик получения данных на интерфейс.

Возьми код обработчка копирования и реализуй его:

procedure TForm2.N1Click(Sender: TObject);
var
 I: Integer;
 CopySource: TFWCopyDataProvider;
 DropSource: IDataObject;
begin
 CopySource := TFWCopyDataProvider.Create;
 DropSource := CopySource;
 CopySource.ShowUIDialog := True;
 CopySource.OnGetContent := OnGetContent;
 CopySource.OnEndCopy := OnEndCopy;
 for I := 0 to ListBox1.Count - 1 do
   if ListBox1.Selected[I] then
     CopySource.AddFile(ListBox1.Items[I]);
 CopySource.CopyToClibboard;
end;


построчно:
CopySource := TFWCopyDataProvider.Create; - создаем обертку над IDataObject

CopySource.ShowUIDialog := True; - выставляем свойство позволяющее отображать диалог копирования при вставке данных в проводник

CopySource.OnGetContent := OnGetContent; - назначаем обработчик получения содержимого виртуальных файлов (которые в примере сидят у нас в ресурсах приложения)

CopySource.OnEndCopy := OnEndCopy; - назначаем обработчик, вызывающийся по завершении копирования

 for I := 0 to ListBox1.Count - 1 do
   if ListBox1.Selected[I] then
     CopySource.AddFile(ListBox1.Items[I]);
- накидываем в IDataObject список имен файлов, каждый из них будет добавлен в виде TFileDescriptor, описывающий непосредственно каждый виртуальный или физический файл.

CopySource.CopyToClibboard; - IDataObject создает соответствующую запись о подготовленных для копирования данных непосредственно в клипборде.

Дальше схема такая, пока приложение живо и буфер обмена не очищен, при вызове из проводника меню "Paste" будет найден наш экземпляр IDataObject и у него будут запрашиваться данные посредством вызовов функций интерфейса EnumFormatEtc/QueryGetData/GetData и т.п.
Для тебя это будет абсолютно прозрачно, обертка сама обработает нужные методы и тебе наружу дернет только обработчик OnGetContent.
В этом обработчике ты должен по имени файла, передаваемого в параметре FileDescriptor, заполнить стрим Data непосредственно содержимым самого файла.

Собственно реализация обработчика тебе уже показана:

procedure TForm2.OnGetContent(Sender: TObject;
 const FileDescriptor: TFileDescriptor; Data: TStream);
var
 I: Integer;
 R: TResourceStream;
begin
 for I := 0 to 4 do
   if PChar(@FileDescriptor.cFileName[0]) = ListBox1.Items[I] then
   begin
     R := TResourceStream.Create(HInstance, "RES" + IntToStr(I + 1),
       "DRAG_RES");
     try
       Data.CopyFrom(R, 0);
     finally
       R.Free;
     end;
   end;
end;


после того как все файлы будут скопированы, вызовется обработчик окончания копирования OnEndCopy, в принципе там можешь ничего не делать.

как-то так в кратце...


 
sniknik ©   (2012-08-11 10:58) [26]

> Где именно (на какой строчке кода) говорит?
без разницы, может на любой... посмотри на код Rouse и его... колбека (двух) нет (раз, два поинтер), объект/интерфейс уничтожается до срабатывания (три поинтер).



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.071 c
6-1265664456
olevacho
2010-02-09 00:27
2013.03.22
выполнение route из под ограниченого пользователя


15-1343320052
Хаус
2012-07-26 20:27
2013.03.22
Посоветуйте жизненные задачи по JavaScript


15-1344577423
желчь
2012-08-10 09:43
2013.03.22
Kerk стал мужиком


15-1331641742
Kerk
2012-03-13 16:29
2013.03.22
Про профессию


15-1348161804
ClawClaw
2012-09-20 21:23
2013.03.22
Глюк в Сапёре? (Windows 7)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский