Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Delphi > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 01.06.2010, 12:50   #1
Rolls
Пользователь
 
Регистрация: 07.05.2010
Сообщений: 45
По умолчанию скопировать файл в буфер обмена

Здравствуйте!
Возникла, казалось бы, элементарная задача, но решений в интеренете нашёл только 2, и те не рабочие ((
Нужно скопировать файл в буфер обмена, чтобы потом можно было его вставить в любую папку иксплорера, и всего-то .. имя файла имеется . вот то что нашёл в сети :

1
Код:
Копируем файл в буфер обмена

uses
  ShlObj, ClipBrd; 

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; 

// Example, Beispiel: 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
  CopyFilesToClipboard('C:Bootlog.Txt'#0'C:AutoExec.Bat'); 
end;  

//Separate the files with a #0.
а вот 2й
Код:
 
Копирование большого файла в буфер обмена


Вот общее решение, которое будет работать, даже если у вас размер файла превышает 64Кб:
function _hread(FileHandle: word; BufPtr: pointer;
  ByteCount: longint): longint; far;
  external 'KERNEL' index 349;

procedure CopyFileToClipboard(const fname: string);
var
  hmem, hFile: THandle;
  size: LongInt;
  p: Pointer;
begin
  hFile := FileOpen(fname, fmOpenRead);
  try
    size := FileSeek(hFile, 0, 2);
    FileSeek(hfile, 0, 0);
    if size > 0 then
    begin
      hmem := GlobalAlloc(GHND, size);
      if hMem <> 0 then
      begin
        p := GlobalLock(hMem);
        if p <> nil then
        begin
          _hread(hFile, p, size);
          GlobalUnlock(hMem);
          Clipboard.SetAsHandle(CF_TEXT, hMem);
        end
        else
          GlobalFree(hMem);
      end;
    end;
  finally
    FileClose(hFile);
  end;
end;

procedure TForm1.SpeedButton2Click(Sender: TObject);
var
  fname: string[128];
begin
  if OpenDialog1.Execute then
  begin
    fname := OpenDialog1.Filename;
    CopyFileToClipboard(fname);
  end;
end;
на первый пример прграмма ругается при выполнении, 2й даже не запускается (просит библиотеку KERNEL.DLL).

Подскажите, кто делал подобное.
ПС: файлы офисных типов (.doc, .xls, .pdf etc)
Заранее спасибо!
Заранее спасибо!

Последний раз редактировалось Rolls; 01.06.2010 в 12:57.
Rolls вне форума Ответить с цитированием
Старый 01.06.2010, 13:39   #2
Баламут
Баламучу слегка...
СуперМодератор
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,584
По умолчанию

Подобного никогда не делал и тем не менее, после некоторой правки содержимое файла копируется в буфер. Но это, какя понимаю, совершенно не то, что нужно

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Clipbrd, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
  private
    procedure CopyFileToClipboard(const fname: string);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

function _hread(FileHandle: word; BufPtr: pointer;
  ByteCount: longint): longint; stdcall; external 'KERNEL32.dll';

{$R *.dfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  fname: string;
begin
  if OpenDialog1.Execute then
  begin
    fname := OpenDialog1.Filename;
    CopyFileToClipboard(fname);
  end;
end;

procedure TForm1.CopyFileToClipboard(const fname: string);
var
  hmem, hFile: THandle;
  size: LongInt;
  p: Pointer;
begin
  hFile := FileOpen(fname, fmOpenRead);
  try
    size := FileSeek(hFile, 0, 2);
    FileSeek(hfile, 0, 0);
    if size > 0 then
    begin
      hmem := GlobalAlloc(GHND, size);
      if hMem <> 0 then
      begin
        p := GlobalLock(hMem);
        if p <> nil then
        begin
          _hread(hFile, p, size);
          GlobalUnlock(hMem);
          Clipboard.SetAsHandle(CF_TEXT, hMem);
        end
        else
          GlobalFree(hMem);
      end;
    end;
  finally
    FileClose(hFile);
  end;
end;

end.

Последний раз редактировалось Баламут; 01.06.2010 в 14:15.
Баламут вне форума Ответить с цитированием
Старый 01.06.2010, 15:21   #3
Rolls
Пользователь
 
Регистрация: 07.05.2010
Сообщений: 45
По умолчанию

после некоторой правки чего?

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

ПС : я у Вас не заметил самой функции function _hread
Rolls вне форума Ответить с цитированием
Старый 01.06.2010, 20:37   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,002
По умолчанию

во втором коде вы моглиб и сами догдатся что у нас kernel32.dll, а не KERNEL.dll.
(странно, зачем в коде эту функцию именно использовать)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.06.2010, 21:02   #5
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

Цитата:
Нужно скопировать файл в буфер обмена, чтобы потом можно было его вставить в любую папку иксплорера, и всего-то
погодь, а зачем копировать весь файл? да еще в буфер обмена? ...смысл забивать память ...не проще-ли получить ссылку на исходное расположение файла и воспользоваться обычным "copy" отсюда-сюда.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 01.06.2010, 22:55   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,002
По умолчанию

кстати, а ведь файл же не копируется проводником полностью в буфер, там копируется путь помоему...но формат ставится не текстовый...так как не вставляется как текст.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.06.2010, 09:18   #7
Rolls
Пользователь
 
Регистрация: 07.05.2010
Сообщений: 45
По умолчанию

понятия не имею как копирует иксплорер, но надо сделать также
обычный КОПИ, как в любом виндовом окошке, чтобы потом сделать обычный ПЭЙСТ в любое виндовое окошко
Rolls вне форума Ответить с цитированием
Старый 02.06.2010, 09:29   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

вот проводник как раз в буфер не файл копирует, так что думайте.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 02.06.2010, 09:50   #9
Rolls
Пользователь
 
Регистрация: 07.05.2010
Сообщений: 45
По умолчанию

неужели никто такого никогда не делал...
Rolls вне форума Ответить с цитированием
Старый 02.06.2010, 17:38   #10
AlexanderKs
Пользователь
 
Регистрация: 26.02.2009
Сообщений: 60
По умолчанию

Rolls, вероятно вы где то допустили ошибку. Пример №1 у меня прекрасно работает.
AlexanderKs вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
КАк поместить файл в буфер обмена? Paul Hindenburg Общие вопросы Delphi 1 16.07.2009 10:17
Буфер обмена nusik Общие вопросы Delphi 2 21.05.2009 00:53
Как скопировать текст в буфер обмена с одного edit-a и вставить в другой SeRhy Общие вопросы Delphi 2 26.07.2008 23:02
Скопировать в буфер обмена Dj_smart JavaScript, Ajax 8 15.05.2008 19:16


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS