| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Программно Cut\Paste |
| Автор: Illusion Dolphin 6.6.2004, 11:15 |
| Как в программе программно реализовать методы Cut\Paste в бефер обмена применимо к файлам (и пипкам, если есть различия)? Желательно также узнать, есть ли в буфере обмена данные этого типа (т.е. файлы)... В FAQ есть только копирование файлов. |
| Автор: Vex 6.6.2004, 14:47 | ||
| Чтобы вырезать нужно скопировать исходный файл а потом его удалить. А проверять буфер на наличие в нем файлов можешь так:
|
| Автор: Vex 6.6.2004, 15:47 | ||
Вставку можно сделать, посылая в нужное тебе окно сообщение о вставке:
|
| Автор: Illusion Dolphin 6.6.2004, 20:55 |
| Vex, спасибо за пример работы с буфером обмена, но... Проблема состоит в том, что необходимо сделать дву кнопки: Cut & Paste. Первая должна уметь "вырезать" фалы так, чтобы в проводнике можно было их вставить, а Paste - нужно определить, скопированы или вырезаны файлы в буфер (из того же проводника), а потом уже Copy (копировать) или Cut (копировать и удалять) их "в программу". Как это сделать? |
| Автор: Vex 6.6.2004, 22:01 | ||||
Если файл в буфере,то почему ты его не можешь вставить в проводнике?
Как ты можешь из буфера вырезать или копировать данные в программу, ты можешь только туда вставить? Или я чего-то не понял. |
| Автор: Illusion Dolphin 6.6.2004, 22:54 | ||||||
Объясняю: Я открываю окно проводника, выделяю файл и нажимаю ВЫРЕЗАТЬ. Потом преспокойно закрываю его, и открываю другое окно, где нажимаю ВСТАВИТЬ. После этого файл скопируется в другое место и удалиться в исходном, т.е. второе окно будет знать, что файл именно вырезали, а не скопировали, т.к. в последнем случае он не будет удалён в начальном месте. Отсюда следует, что кроме того, что файл находится в буфере обмена, там содержится также информация системного характера (скопирован или вырезан).
А как проводник узнает, что я данные именно вырезал, а не скопировал (как, например, в faq есть функция КОПИРОВАНИЯ файлов в буфер обмена)?
Мне нужно определить: в проводнике пользователь нажал "скопировать" или "вырезать" чтобы знать, что делать с файлом. |
| Автор: Vex 6.6.2004, 23:11 | ||||
Хм... не знаю, думаю второму окну все равно вырезан файл или скопирован... Добавлено @ 23:15 Вот из MSDN:
Думаю в ClipBoarde храниться только сам объект и идентификатор формата, ИМХО. |
| Автор: youri 7.6.2004, 02:23 | ||||
Я тут нашел в help'е такую штуку:
правда не совсем понял, почему нельзя создавать собственный объект TClipBoard, может подскажете? |
| Автор: Illusion Dolphin 7.6.2004, 08:42 | ||||||
1)
Открой одно окно проводника и "вырежи" вайл, потом закрой его и вставь... В исходном место его не будет. Если проделать то же самое, но в исходном месте его скопировать, но он просто скопируется. 2)
А что понимать в данном слечае под документом? Жёсткий диск? Я сомневаюсь, что если я вырежу на диске С: фильм в 700 мегов, то он сразу же удалится с диска и поместится в буфер :/... Эта цитата применима к тексовым (и ещё многим другим) форматам, а к файлам вроде не то... 3)
А как это сочетается с первым пунктом? |
| Автор: Vex 7.6.2004, 09:06 | ||
Я точно не знаю, но ИМХО когда мы вырезаем файл он копируется и удаляется. я на 70% процентов уверен, что при вырезании происходит следующее: 1. Копировать файл в буфер обмена 2. Удалить файл Какие мог доказательства я привел, но точно не знаю. Есть подозрение, что при копировании или вырезании файла копируется только информация о самом файле, чтобы не полностью помещать его в буфер, а все оставльное делает ОС. У тебя есть Clipboard Viewer? |
| Автор: Vex 7.6.2004, 09:18 |
| Вывод: скопирован был файл или вырезан ИМХО невозможно, не считая всяких хитростей, если ты знаешь откуда был этот файл вырезан/скопирован, то можешь просканить каталог, если есть такой файл, значит скопирован, если нет вырезан. |
| Автор: Girder 7.6.2004, 11:30 | ||
| Буфер обмена содержит только полный путь к файлам(с именем файла). Чтобы определить что с ними надо делать (копировать или вставлять) разберется сам Explorer. Пример определения какие файлы или папки перемещаются(копируются).
См. также: http://www.delphimaster.ru/articles/dragndrop/ http://www.delphivsvb.by.ru/delphisol/desapprazr.html http://www.vcl.ru/html/win31/mdi/ch2.htm Удачи. |
| Автор: Illusion Dolphin 7.6.2004, 13:58 | ||||
Vex:
А) 1) Создай файл 1.txt в любой директории. 2) открой его блокнотом и напиши там "Это только тест!" 3) Закрой его 4) Нажми правой кнопкой мыши и выбери "Вырезать" (файл удалён???) 5) Файл остался на месте, хотя стал "полупрозрачным". 6) Для проверки существования файла открываем его тем же блокнотом. 7) ФАЙЛ ПОСЛЕ ВЫРЕЗКИ СУЩЕСТВУЕТ! Б) 1) Возьми файл существенным размером размером (фильм в 700 мегов). 2) Засекаешь время по часам 3) Попробуй "вырежь" его. 4) Засекаешь разность ввремени между текущим временем и операцией 2. 5) Думаем, как файл в 700 мегобайс прочитался за такое короткое время, да ещё и скопировался в оперативную память (пусть даже с свопом) Вывод: Вырезать файл - это не УДАЛИТЬ ЕГО с помещением копии в буфере обмена. Girder
8) Explorer-то разберётся, а как быть мне? Мне нужно определить, что сделано с данными и потом уже (пусть даже с помощью эксплорера и интерфейсов как-то его скопировать\переместить\вставить. И ещё нужно сделать так, чтобы Explorer разобрался в том, что я хочу сделать с файлом: его скопировать или вырезать, чтобы ПОТОМ (см, что я написал Vex'у) над ними совершить нужное действие. Пример кода - то же самое: файлы-то есть, но что с ними делать??? Как мне их туда ИЛИ СКОПИРОВАТЬ ИЛИ ВЫРЕЗАТЬ? |
| Автор: Vex 7.6.2004, 14:11 | ||||||
OK
нет в буфер обмена поместился путь к файлу и где-то в недрах эксплорера переменная удаления стала TRUE и когда мы вставляем файл, то эксплорер копирует этот файл а затем удаляет.
Да, конечно ведь в буфер скопировалсятолько путь этого файла Добавлено @ 14:15 Illusion Dolphin, может более детально опиши свою задачу, попробуем как-то эту фигню с буфером. З.Ы. Если бы достать какой-то исчерпывающий мануал о работе и структуре буфера обмена, то все бы вопросы решились. |
| Автор: Illusion Dolphin 7.6.2004, 14:41 | ||
Гы На счёт З.Ы. полностью согласен, но я нигде не могу найти его... Уже всё перерыл и ноль... |
| Автор: Vex 7.6.2004, 15:17 | ||
Illusion Dolphin, слухай, Girder же привел пример какие папки перемещаются/копируються, так попробуй их открыть, если файла нет, то он вырезан.
аналогично |
| Автор: Girder 7.6.2004, 15:46 | ||
| По моему здесь все доходчиво описанно: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/programmersguide/shell_basics/shell_basics_programming/transferring/clipboard.asp Но можно и схитрить (хитрость номер 1):
Еще раз повторяю: "В ClipBoard-е файлы не хранятся" Удачи. |
| Автор: Illusion Dolphin 7.6.2004, 18:30 |
| Girder: Огромное тебе СПАСИБО!!! 8) Это как раз то, что надо! Только можешь подсказать, как из программы вырезать файл? У меня есть функция для копирования файлов, но я никак не могу её перевести для вырезки 8(... Из msdn я не понял толком, как это сделать Фот функция для копирования: procedure CopyFilesToClipboard(FileList: string); var DropFiles: PDropFiles; hGlobal: THandle; iLen: Integer; begin iLen := Length(FileList) + 2; FileList := FileList + #0#0; hGlobal := GlobalAlloc(GMEM_SHARE or GMEM_MOVEABLE or GMEM_ZEROINIT, SizeOf(TDropFiles) + iLen); if (hGlobal = 0) then raise Exception.Create('Could not allocate memory.'); begin DropFiles := GlobalLock(hGlobal); DropFiles^.pFiles := SizeOf(TDropFiles); Move(FileList[1], (PChar(DropFiles) + SizeOf(TDropFiles))^, iLen); GlobalUnlock(hGlobal); Clipboard.SetAsHandle(CF_HDROP, hGlobal); end; end; |
| Автор: Girder 8.6.2004, 10:43 | ||
| А ты что с COM не работал? Хитрость номер 2(Explorer поймет, а вот хитрость номер 1 не много надо изменить):
А по хорошему надо юзать COM. Вот тебе некоторые ссылки(там есть готовый компоненты): http://www.unitoops.com/uoole/examples/index.htm#Delphi http://www.unitoops.com/default.htm http://podgoretsky.com/ftp/Docs/Delphi/D3/D3ProgLib/ch_04.htm http://www.undu.com/Articles/990317b.html http://www.undu.com/Articles/990901g.html Удачи. |
| Автор: Girder 8.6.2004, 11:20 | ||||
| Ладно, не буду мучать тебя, вот что надо изменить в хитрости номер 1: Было:
заменить на:
Удачи. |
| Автор: Illusion Dolphin 8.6.2004, 14:38 |
| Girder: СПАСИБО-СПАСИБО!!!! Да, я не работал ещё толком с этой технологией, я только вот пытаюсь кое-что освоить... Очень благодарен!!!!!! |
| Автор: Mephisto 7.6.2007, 10:25 |
| Доброго фсем дня... Хочу подключить свою трубу под линузом (Mandriva 2006). Труба Nokia 2610, кабель CA-45. Из-под винды асилил только подключится при помощи MobiMB v3.4, ничего более не кушало ее. USB кабло определяется как Prolific USB-to-Serial Comm Port. Теперь собсна вопросец... Как ентот мегадевайс подключить под линузом? GPlus ниасилил трубу ни под линузом, ни под виндами... :/ |