![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
программно вырезать указанный файл в буфер обмена [D7, XP]
pest © (2009-06-15 16:47:00)привет всем.
есть путь к файлу. нужно программно вырезать этот файт в буфер обмена, чтобы вне программы пользователь мог просто нажать ctrl+v в какой-либо папке, и вырезанный файл вставился туда.
копировать в буфер умею, но вырезать не знаю как(
заранее благодарен за ответ
(2009-06-16 14:03:00) [21]Удалено модератором
(2009-06-16 14:01:00) [22]Удалено модератором
pest (2009-06-16 13:43:00) [23]
> clickmaker © (16.06.09 13:31) [17]
если учитывать что мне надо вырезать файл, то где я указываю имя файла?
аналогично вопрос решен в следующей процедуре:
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;
но она почему-то не работает. может надо делать на ее примере и вместоd: PCardinal;использоватьDropFiles: PDropFiles;? но в этом случае не могу занестиDROPEFFECT_MOVEвDropFiles^.
clickmaker (2009-06-16 13:31:00) [24]> hGlobal := GlobalAlloc(GMEM_SHARE or GMEM_MOVEABLE or GMEM_ZEROINIT,
> sizeof(dword));
> hGlobal := DROPEFFECT_MOVE;
жесть! присваивание имеет накопительный эффект? -)
procedure TForm1.Button2Click(Sender: TObject);
var
hGlobal: THandle;
f: Cardinal;
d: PCardinal;
begin
f := RegisterClipboardFormat(CFSTR_PREFERREDDROPEFFECT);
hGlobal := GlobalAlloc(GMEM_SHARE or GMEM_MOVEABLE or GMEM_ZEROINIT, sizeof(dword));
d := PCardinal(GlobalLock(hGlobal));
d^ := DROPEFFECT_MOVE;
SetClipboardData(f, hGlobal);
GlobalUnlock(hGlobal);
end;
pest (2009-06-16 13:19:00) [25]
> Сергей М. © (16.06.09 12:08) [15]
имеется в виду что-то вроде этого?
procedure TForm1.Button2Click(Sender: TObject);
var
hGlobal: THandle;
f: Cardinal;
begin
f := RegisterClipboardFormat(CFSTR_PREFERREDDROPEFFECT);
hGlobal := GlobalAlloc(GMEM_SHARE or GMEM_MOVEABLE or GMEM_ZEROINIT, sizeof(dword));
hGlobal := DROPEFFECT_MOVE;
Clipboard.SetAsHandle(f, hGlobal);
end;
скорее всего нет, поправьте меня плиз
Сергей М. (2009-06-16 12:08:00) [26]
> надо ведь както эти DWORD-данные установить вручную?
Конечно надо)
1. Регистрируем формат CFSTR_PREFERREDDROPEFFECT с пом. RegisterClipboardFormat()
2. Выделяем глоб.блок памяти размером в sizeof(dword), записываем в этот блок константу DROPEFFECT_MOVE
3. Записываем в клипборд хэндл глоб.блока, указав формат, полученный в п.1
pest (2009-06-16 11:58:00) [27]
> Сергей М. © (16.06.09 11:44) [11]
допустим по теории это так, но вы, как программист делфи, как видете практическую реализацию вырезания файла, исходя из этой теории?
надо ведь както эти DWORD-данные установить вручную?
pest (2009-06-16 11:47:00) [28]копировать и удалять не вариант.
кстати, процедура
procedure CopyFilesToClipboard(FileList: string);
которую я указал выше, не рабоотает (. возможно есть какието конфликты с юникодом? у меня delphi 2009.
зы уже несколько функций беру из инета, которые постят повсюду и вроде работающие, а у меня с ошибками..
oldman (2009-06-16 11:45:00) [29]
> brother © (16.06.09 11:41) [10]
Старый стал, помню плохо :(
Сергей М. (2009-06-16 11:44:00) [30]
> pest (16.06.09 10:18) [6]
Эксплорер при выполнении операции Paste From Clipboard смотрит, есть ли в клипборде DWORD-данные в формате, зарегистрированном под предопределенным именем CFSTR_PREFERREDDROPEFFECT = 'Preffered DropEffect'. Если есть, читает эти данные сравнивает прочитанное с одной из предопределенных констант, среди которых DROPEFFECT_COPY = 1 и DROPEFFECT_MOVE = 2. Если это DROPEFFECT_MOVE, то при операции вставки из клипборда, т.е. после успешного создания копий "вырезанных" объектов Эксплорер самостоятельно удаляет оригиналы этих объектов.
Полагаю что так)
brother (2009-06-16 11:41:00) [31]> С "вырезать" такая же беда :)
если мы все еще про буфер обмена, то нет) только посветлеет)
oldman (2009-06-16 11:40:00) [32]
> brother © (16.06.09 11:31) [8]
С "вырезать" такая же беда :)
brother (2009-06-16 11:31:00) [33]> Скопировать и удалить )
аха и потом не вставить?) файло- прощай)
oldman (2009-06-16 11:30:00) [34]
> копировать в буфер умею, но вырезать не знаю как
Скопировать и удалить )
pest (2009-06-16 10:18:00) [35]Сергей,
почитал, но.. все стало еще непонятнее. есть CFSTR_PREFERREDDROPEFFECT который может принимать значения DROPEFFECT_COPY / DROPEFFECT_CUT?
или как они связаны? и причем здесь IDataObject и PreferredDropEffect() и тд. также начитался:
Technical: What we are doing is adding the CFSTR_PREFERREDDROPEFFECT clipboard format with a data value DROPEFFECT_COPY. This will tell the drop source that we are intending to do a copy operation.
Preferred DropEffect (CFSTR_PREFERREDDROPEFFECT). This is just a "global" DWORD number which in this case is set to DROPEFFECT_COPY. This informs the target which pastes the data to create a copy of the file. If this was a cut operation then the preferred effect would be set to DROPEFFECT_MOVE, instructing the target to delete the original file after copying. Note that despite its name, this format is applicable for both clipboard and drag-drop transfers.
как все это связано и как мне практически реализовать вырезание файла так и не понял. можно ли показать для примера хоть пару строчек кода на delphi? я был бы очень благодарен. ато я не пойму (
Сергей М. (2009-06-15 17:43:00) [36]см. CFSTR_PREFERREDDROPEFFECT
http://msdn.microsoft.com/en-us/library/bb776902(VS.85).aspx#CFSTR_PREFERREDDROPEFFECT
pest (2009-06-15 17:33:00) [37]Юрий Зотов
я делаю фтп клиент. при нажатии ctrl+c на файлах, находящихся на FTP сервере, я запоминаю инфу о них. создаю специальный файлик в рабочей папке программы с этой инфой и хочу вырезать ее в буфер.
затем при вставке инфы из буфера, у меня есть возможность отследить изменение буфера (т.к. после копирования и вставки из буфера, не вызывается его изменение. а после вырезания и вставки - изменение вызывается). я определяю что это мой файл с моей инфой и начинаю скачивать файлы с фтп и сохранять их на компьютер.
возможно это не самый грамотный способ, но не профи..
на счет указанного вами поста, это инициатива моего коллеги помочь мне. я заметил непосредственно после своего поста. у нас один внешний ip провайдера.
Юрий Зотов (2009-06-15 17:21:00) [38]> pest
Вы не могли бы объяснить, зачем это надо?
Дело в том, что с учетом
http://delphimaster.ru/cgi-bin/forum.pl?id=1245065404&n=18
Ваша странная затея сильно смахивает на какую-то вредительскую затею, а такие ветки подлежат истреблению.
Поэтому - поясните, плз. Кстати, не думайте, что постинги под разными никами затрудняют Вашу идентификацию. Нисколько.
pest (2009-06-15 17:08:00) [39]Сергей, спасибо что откликнулись.
приведу пример кода:
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;
если я скопирую файл при помощи этого кода в буфер обмена, потом в любой папке windows нажму ctrl+v, то этот файл будет просто скопирован. а мне надо чтобы он переместился. тоесть чтобы после вставки его на прежнем месте больше не было.
но как мне это сделать, ведь вставку из буфера осуществляет сама винда, как мне ей сказать что файл вырезан а не скопирован?
Сергей М. (2009-06-15 16:53:00) [40]"Вырезание" есть тоже самое копирование, но осуществляемое под контролем клипборд-вьюера в контексте приложения, инициировавшего "вырезание".