Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программно Cut\Paste, (файлы) 
:(
    Опции темы
Illusion Dolphin
  Дата 6.6.2004, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63



Как в программе программно реализовать методы Cut\Paste в бефер обмена применимо к файлам (и пипкам, если есть различия)? Желательно также узнать, есть ли в буфере обмена данные этого типа (т.е. файлы)... В FAQ есть только копирование файлов.


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
Vex
Дата 6.6.2004, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


кацапосрачмученiкъ
****


Профиль
Группа: Экс. модератор
Сообщений: 3103
Регистрация: 28.3.2002
Где: strawberry fields

Репутация: 1
Всего: 88



Чтобы вырезать нужно скопировать исходный файл а потом его удалить.
А проверять буфер на наличие в нем файлов можешь так:

Код

procedure TForm1.FormActivate(Sender: TObject);
begin
CLB:=TClipBoard.Create;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
bufer: array[0..60] of Char;
begin
for i:=1 to CLB.FormatCount-1 do begin
 GetclipboardFormatName(CLB.Formats[i], bufer, Pred(Sizeof(bufer)));
 if StrPas(bufer)='FileNameW' then showmessage("В буфере обмена уже есть файл");
end;
end;



--------------------
Слава Україні.
PM   Вверх
Vex
Дата 6.6.2004, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


кацапосрачмученiкъ
****


Профиль
Группа: Экс. модератор
Сообщений: 3103
Регистрация: 28.3.2002
Где: strawberry fields

Репутация: 1
Всего: 88



Вставку можно сделать, посылая в нужное тебе окно сообщение о вставке:

Код
procedure TForm1.Paste1Click(Sender: TObject);
begin
 SendMessage (ActiveControl.Handle, WM_Paste, 0, 0);
end;



--------------------
Слава Україні.
PM   Вверх
Illusion Dolphin
Дата 6.6.2004, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63



Vex, спасибо за пример работы с буфером обмена, но...
Проблема состоит в том, что необходимо сделать дву кнопки: Cut & Paste. Первая должна уметь "вырезать" фалы так, чтобы в проводнике можно было их вставить, а Paste - нужно определить, скопированы или вырезаны файлы в буфер (из того же проводника), а потом уже Copy (копировать) или Cut (копировать и удалять) их "в программу". Как это сделать?


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
Vex
Дата 6.6.2004, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


кацапосрачмученiкъ
****


Профиль
Группа: Экс. модератор
Сообщений: 3103
Регистрация: 28.3.2002
Где: strawberry fields

Репутация: 1
Всего: 88



Цитата
Vex, спасибо за пример работы с буфером обмена, но...
Проблема состоит в том, что необходимо сделать дву кнопки: Cut & Paste. Первая должна уметь "вырезать" фалы так, чтобы в проводнике можно было их вставить


Если файл в буфере,то почему ты его не можешь вставить в проводнике?

Цитата
а Paste - нужно определить, скопированы или вырезаны файлы в буфер (из того же проводника), а потом уже Copy (копировать) или Cut (копировать и удалять) их "в программу". Как это сделать?


Как ты можешь из буфера вырезать или копировать данные в программу, ты можешь только туда вставить? Или я чего-то не понял.




--------------------
Слава Україні.
PM   Вверх
Illusion Dolphin
Дата 6.6.2004, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63



Цитата
Или я чего-то не понял.

Объясняю:
Я открываю окно проводника, выделяю файл и нажимаю ВЫРЕЗАТЬ. Потом преспокойно закрываю его, и открываю другое окно, где нажимаю ВСТАВИТЬ. После этого файл скопируется в другое место и удалиться в исходном, т.е. второе окно будет знать, что файл именно вырезали, а не скопировали, т.к. в последнем случае он не будет удалён в начальном месте. Отсюда следует, что кроме того, что файл находится в буфере обмена, там содержится также информация системного характера (скопирован или вырезан).
Цитата
Если файл в буфере,то почему ты его не можешь вставить в проводнике?

А как проводник узнает, что я данные именно вырезал, а не скопировал (как, например, в faq есть функция КОПИРОВАНИЯ файлов в буфер обмена)?
Цитата
Как ты можешь из буфера вырезать или копировать данные в программу, ты можешь только туда вставить? Или я чего-то не понял.

Мне нужно определить: в проводнике пользователь нажал "скопировать" или "вырезать" чтобы знать, что делать с файлом.


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
Vex
Дата 6.6.2004, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


кацапосрачмученiкъ
****


Профиль
Группа: Экс. модератор
Сообщений: 3103
Регистрация: 28.3.2002
Где: strawberry fields

Репутация: 1
Всего: 88



Цитата
т.е. второе окно будет знать, что файл именно вырезали, а не скопировали


Хм... не знаю, думаю второму окну все равно вырезан файл или скопирован...


Добавлено @ 23:15
Вот из MSDN:
Цитата

Clipboard Commands

Cut: Places a copy of the current selection on the clipboard and deletes the selection from the document. The previous content of the clipboard is destroyed.

Copy: Places a copy of the current selection on the clipboard. The document remains unchanged. The previous content of the clipboard is destroyed.

Paste: Replaces the current selection with the content of the clipboard. The content of the clipboard is not changed.


Думаю в ClipBoarde храниться только сам объект и идентификатор формата, ИМХО.


--------------------
Слава Україні.
PM   Вверх
youri
Дата 7.6.2004, 02:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: нет
Всего: 16



Цитата
procedure TForm1.FormActivate(Sender: TObject);
begin
CLB:=TClipBoard.Create;
end;

Я тут нашел в help'е такую штуку:
Цитата
Do not instantiate separate TClipboard objects by calling the constructor. Instead, use the global instance of TClipboard that is returned by calling the Clipboard function. Using this global instance safeguards against accidentally deleting the clipboard, while allowing the application to share a single instance of TClipboard for all use of the Clipboard. Before calling the Clipboard method, be sure that the uses clause includes Clipbrd.

правда не совсем понял, почему нельзя создавать собственный объект TClipBoard, может подскажете?
PM   Вверх
Illusion Dolphin
Дата 7.6.2004, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63



1)
Цитата
Хм... не знаю, думаю второму окну все равно вырезан файл или скопирован...

Открой одно окно проводника и "вырежи" вайл, потом закрой его и вставь... В исходном место его не будет. Если проделать то же самое, но в исходном месте его скопировать, но он просто скопируется.
2)
Цитата
Cut: Places a copy of the current selection on the clipboard and deletes the selection from the document.

А что понимать в данном слечае под документом? Жёсткий диск? Я сомневаюсь, что если я вырежу на диске С: фильм в 700 мегов, то он сразу же удалится с диска и поместится в буфер :/... Эта цитата применима к тексовым (и ещё многим другим) форматам, а к файлам вроде не то...
3)
Цитата
Думаю в ClipBoarde храниться только сам объект и идентификатор формата, ИМХО.

А как это сочетается с первым пунктом?


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
Vex
Дата 7.6.2004, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


кацапосрачмученiкъ
****


Профиль
Группа: Экс. модератор
Сообщений: 3103
Регистрация: 28.3.2002
Где: strawberry fields

Репутация: 1
Всего: 88



Цитата
Открой одно окно проводника и "вырежи" вайл, потом закрой его и вставь... В исходном место его не будет. Если проделать то же самое, но в исходном месте его скопировать, но он просто скопируется.


Я точно не знаю, но ИМХО когда мы вырезаем файл он копируется и удаляется.
я на 70% процентов уверен, что при вырезании происходит следующее:
1. Копировать файл в буфер обмена
2. Удалить файл
Какие мог доказательства я привел, но точно не знаю.

Есть подозрение, что при копировании или вырезании файла копируется только информация о самом файле, чтобы не полностью помещать его в буфер, а все оставльное делает ОС.

У тебя есть Clipboard Viewer?


--------------------
Слава Україні.
PM   Вверх
Vex
Дата 7.6.2004, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


кацапосрачмученiкъ
****


Профиль
Группа: Экс. модератор
Сообщений: 3103
Регистрация: 28.3.2002
Где: strawberry fields

Репутация: 1
Всего: 88



Вывод: скопирован был файл или вырезан ИМХО невозможно, не считая всяких хитростей, если ты знаешь откуда был этот файл вырезан/скопирован, то можешь просканить каталог, если есть такой файл, значит скопирован, если нет вырезан.


--------------------
Слава Україні.
PM   Вверх
Girder
Дата 7.6.2004, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Буфер обмена содержит только полный путь к файлам(с именем файла).
Чтобы определить что с ними надо делать (копировать или вставлять) разберется сам Explorer.

Пример определения какие файлы или папки перемещаются(копируются).
Код

uses ... ShellAPI;

procedure TForm1.BBClick(Sender: TObject);
var Hand:THandle;
   Count:integer;
   pfname: array[0..1023] of char;
   Item:TListItem;
begin        
if IsClipboardFormatAvailable(CF_HDROP) then
 begin
  if OpenClipboard(Self.Handle)=false then exit;
  Hand:=GetClipboardData(CF_HDROP);
  if (Hand<>NULL) then
   begin
    CBDInfo.Clear;
    Count:=DragQueryFile(Hand,$FFFFFFFF,nil,0);
    if Count>0 then
     repeat
      dec(Count);
      DragQueryFile(Hand,Count,pfname,1024);
      Item:=CBDInfo.Items.Add();
      Item.Caption:=string(pfname);
     until (Count=0);
   end;
  CloseClipboard();
 end;
end;


См. также:
http://www.delphimaster.ru/articles/dragndrop/
http://www.delphivsvb.by.ru/delphisol/desapprazr.html
http://www.vcl.ru/html/win31/mdi/ch2.htm

Удачи.

Это сообщение отредактировал(а) Girder - 7.6.2004, 12:48


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Illusion Dolphin
Дата 7.6.2004, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63



Vex:
Цитата
Я точно не знаю, но ИМХО когда мы вырезаем файл он копируется и удаляется.

А)
1) Создай файл 1.txt в любой директории.
2) открой его блокнотом и напиши там "Это только тест!"
3) Закрой его
4) Нажми правой кнопкой мыши и выбери "Вырезать" (файл удалён???)
5) Файл остался на месте, хотя стал "полупрозрачным".
6) Для проверки существования файла открываем его тем же блокнотом.
7) ФАЙЛ ПОСЛЕ ВЫРЕЗКИ СУЩЕСТВУЕТ!
Б)
1) Возьми файл существенным размером размером (фильм в 700 мегов).
2) Засекаешь время по часам
3) Попробуй "вырежь" его.
4) Засекаешь разность ввремени между текущим временем и операцией 2.
5) Думаем, как файл в 700 мегобайс прочитался за такое короткое время, да ещё и скопировался в оперативную память (пусть даже с свопом)
Вывод: Вырезать файл - это не УДАЛИТЬ ЕГО с помещением копии в буфере обмена.

Girder
Цитата
Чтобы определить что с ними надо делать (копировать или вставлять) разберется сам Explorer.

8) Explorer-то разберётся, а как быть мне? Мне нужно определить, что сделано с данными и потом уже (пусть даже с помощью эксплорера и интерфейсов как-то его скопировать\переместить\вставить. И ещё нужно сделать так, чтобы Explorer разобрался в том, что я хочу сделать с файлом: его скопировать или вырезать, чтобы ПОТОМ (см, что я написал Vex'у) над ними совершить нужное действие.

Пример кода - то же самое: файлы-то есть, но что с ними делать??? Как мне их туда ИЛИ СКОПИРОВАТЬ ИЛИ ВЫРЕЗАТЬ?


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
Vex
Дата 7.6.2004, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


кацапосрачмученiкъ
****


Профиль
Группа: Экс. модератор
Сообщений: 3103
Регистрация: 28.3.2002
Где: strawberry fields

Репутация: 1
Всего: 88



Цитата

1) Создай файл 1.txt в любой директории.
2) открой его блокнотом и напиши там "Это только тест!"
3) Закрой его

OK

Цитата

4) Нажми правой кнопкой мыши и выбери "Вырезать" (файл удалён???)

нет adv/225.gif
в буфер обмена поместился путь к файлу и где-то в недрах эксплорера переменная удаления стала TRUE и когда мы вставляем файл, то эксплорер копирует этот файл а затем удаляет.

Цитата

5) Файл остался на месте, хотя стал "полупрозрачным".
6) Для проверки существования файла открываем его тем же блокнотом.
7) ФАЙЛ ПОСЛЕ ВЫРЕЗКИ СУЩЕСТВУЕТ!

Да, конечно ведь в буфер скопировалсятолько путь этого файла


Добавлено @ 14:15
Illusion Dolphin, может более детально опиши свою задачу, попробуем как-то эту фигню с буфером.

З.Ы. Если бы достать какой-то исчерпывающий мануал о работе и структуре буфера обмена, то все бы вопросы решились.



--------------------
Слава Україні.
PM   Вверх
Illusion Dolphin
Дата 7.6.2004, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63



Цитата
и где-то в недрах эксплорера переменная удаления стала TRUE

Гы smile.gif))). Гениально, шэф (с). Мне-то туда и нужно, т.е. где те недры, куда мне запихнуть эту TRUE (и откуда доставать)?
На счёт З.Ы. полностью согласен, но я нигде не могу найти его... Уже всё перерыл и ноль...


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0668 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.