Форум: "Прочее";
Текущий архив: 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.057 c