Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2011, 14:55   #1
art-programs
Пользователь
 
Регистрация: 04.07.2009
Сообщений: 61
По умолчанию Копирование файла в буфер обмена (win7)

Привет. Кто уже делал копирование в БО?
Интернет завален таким решением:
Код:
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;
но на Win7 не работает, дебагер благополучно вываливается в CPU
art-programs вне форума Ответить с цитированием
Старый 24.09.2011, 18:36   #2
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Что такое FileList?
На какой строчке падает?
TwiX вне форума Ответить с цитированием
Старый 24.09.2011, 18:44   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Код:
uses ClipBrd;

procedue DoMyClipBtd;
var
  clb:TClipboard;
begin
clb:=TClipboard.Create;
  try
    Clb.Open;
      {
        DO SOMETHING WITH CLB
      }
     Clb.Close;
   finally
    FreeAndNil(clb);
  end;
end;
уже не?
Человек_Борща вне форума Ответить с цитированием
Старый 24.09.2011, 21:11   #4
Surgeon
Форумчанин
 
Регистрация: 04.10.2007
Сообщений: 106
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Код:
uses ClipBrd;

procedue DoMyClipBtd;
var
  clb:TClipboard;
begin
clb:=TClipboard.Create;
  try
    Clb.Open;
      {
        DO SOMETHING WITH CLB
      }
     Clb.Close;
   finally
    FreeAndNil(clb);
  end;
end;
уже не?
А разве переменная clipboard нуждается в создании? Это как Application - создается автоматом при запуске программы.
Все не так плохо, как вам кажется, на самом деле все гораздо хуже.
http://delphiworld.narod.ru/dw.html - 5000 статей!!! удобный поиск, оффлайн сборник, рекомендую всем
Surgeon вне форума Ответить с цитированием
Старый 24.09.2011, 21:42   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Лучше создать свой обьект, тогда гарантировано запихаешь в него что-то.
Человек_Борща вне форума Ответить с цитированием
Старый 24.09.2011, 21:57   #6
Silver_S
Форумчанин
 
Регистрация: 14.03.2011
Сообщений: 104
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Лучше создать свой обьект, тогда гарантировано запихаешь в него что-то.
В справке ясно сказано:
Цитата:
Do not instantiate separate TClipboard objects by calling the constructor. Instead, use the global instance of TClipboard returned by the Clipboard function. This allows applications to share a single instance of TClipboard and safeguards against accidental deletion of the clipboard.
Silver_S вне форума Ответить с цитированием
Старый 25.09.2011, 13:47   #7
art-programs
Пользователь
 
Регистрация: 04.07.2009
Сообщений: 61
По умолчанию

Цитата:
Что такое FileList?
На какой строчке падает?
Код:
Debug Output:
Heap block at 0019CB90 modified at 0019CBC0 past requested size of 27
Код:
CPU: 77234E2d mov byte ptr [$7724f025], $00]
FileList это строка с именами файлов задаётся например так:
Код:
CopyFilesToClipboard('C:\1.txt'#0'C:\1.xls');
надо полагать падает приложение тут
Код:
    DropFiles^.pFiles := SizeOf(TDropFiles);
    Move(FileList[1], (PChar(DropFiles) + SizeOf(TDropFiles))^, iLen); <=== тут
    GlobalUnlock(hGlobal);
Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Лучше создать свой обьект, тогда гарантировано запихаешь в него что-то.
В данном случае это увы ничего не даёт.
TClipboard создаётся без проблем. Проблема в выделении
памяти (точнее после выделения, выделяется она тоже успешно).

Последний раз редактировалось Stilet; 25.09.2011 в 21:21.
art-programs вне форума Ответить с цитированием
Старый 25.09.2011, 17:12   #8
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Версия Delphi? ANSI vs Unicode?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 25.09.2011, 17:39   #9
art-programs
Пользователь
 
Регистрация: 04.07.2009
Сообщений: 61
По умолчанию

d2010 architect, юникод
art-programs вне форума Ответить с цитированием
Старый 25.09.2011, 17:44   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Тогда iLen не верен.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Копирование в буфер обмена motorway JavaScript, Ajax 1 10.04.2011 07:36
Копирование данных из поля в буфер обмена по нажатию кнопки? iliana Microsoft Office Access 7 30.12.2010 11:38
Копирование данных в буфер обмена? ArcticBear Общие вопросы .NET 4 27.11.2009 14:27
Копирование в буфер обмена Xanex Общие вопросы Delphi 5 18.05.2009 23:13
Копирование структуры в буфер обмена bill Общие вопросы Delphi 14 20.11.2007 17:22