Имя: Пароль:
1C
 
Как скопировать строку в буфер обмена Windows?
0 HollliGaN
 
31.10.07
11:49
Как скопировать строку в буфер обмена Windows?
т.е. у меня есть поле ввода с типом строка,
справа хочу сделать кнопку скопировать в буфер Windows.
1 Freeman391
 
31.10.07
12:12
Можно как-нибудь так:
ЭлементыФормы.Добавить(Тип("ПолеHTMLДокумента"), "ПолеHTMLДокумента", Ложь);
Окно=ЭлементыФормы.ПолеHTMLДокумента.Документ.parentWindow;
Окно.clipboardData.SetData("Text","бла-бла-бла");
Индекс=ЭлементыФормы.Индекс(ЭлементыФормы.Найти("ПолеHTMLДокумента"));
ЭлементыФормы.Удалить(Индекс);
2 HollliGaN
 
31.10.07
12:31
(1) Спасибо, как вириант
Для тех кому интересно

   Окно=ЭлементыФормы.ПолеHTMLДокумента.Документ.parentWindow;
   тЗначение = Окно.clipboardData.getData("Text");

так же можно и прочитать
3 HollliGaN
 
31.10.07
13:19
На Win 2003 server вариант (1) не работает, в буфер (Окно.clipboardData.SetData("Text","бла-бла-бла")) не записывает..

Еще варианты есть? М.б. через WBS?
4 BabySG
 
31.10.07
13:32
Названия говорят за себя

procedure CopyStringToClipboard(s: string);
var
 hg: THandle;
 P: PChar;
begin
 hg:=GlobalAlloc(GMEM_DDESHARE or GMEM_MOVEABLE, Length(S)+1);
 P:=GlobalLock(hg);
 StrPCopy(P, s);
 GlobalUnlock(hg);
 OpenClipboard(Application.Handle);
 SetClipboardData(CF_TEXT, hg);
 CloseClipboard;
 GlobalFree(hg);
end;

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Добавление текста в буфер обмена без использования модуля Clipbrd

Wnd - Handle окна, получающего доступ к буферу обмена,
может быть Application.Handle или Form.Handle
Value - текст, помещаемый в буфер обмена

Зависимости: Windows
Автор:       Dimka Maslov, mainbox@endimus.ru, ICQ:148442121, Санкт-Петербург
Copyright:   Dimka Maslov
Дата:        22 августа 2002 г.
***************************************************** }

function SetClipboardText(Wnd: HWND; Value: string): Boolean;
var
 hData: HGlobal;
 pData: pointer;
 Len: integer;
begin
 Result := True;
 if OpenClipboard(Wnd) then
 begin
   try
     Len := Length(Value) + 1;
     hData := GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE, Len);
     try
       pData := GlobalLock(hData);
       try
         Move(PChar(Value)^, pData^, Len);
         EmptyClipboard;
         SetClipboardData(CF_Text, hData);
       finally
         GlobalUnlock(hData);
       end;
     except
       GlobalFree(hData);
       raise
     end;
   finally
     CloseClipboard;
   end;
 end
 else
   Result := False;
end;

Пример использования:

procedure TForm1.Button1Click(Sender: TObject);
begin
 SetClipboardText(Handle, 'qwerty');
end;
5 HollliGaN
 
31.10.07
13:35
(4) Это делфи? (...by delphibase.endimus.com...)
6 smaharbA
 
31.10.07
14:26
а ты безопасность позырь ИЕ и все заработает, а (4) это не наш метод, это ламерам...
7 Гений 1С
 
гуру
11.01.08
11:29
Добавил эти две функции в свою библиотеку функций. ;-)

//Возвращает текст буфера обмена в виде строки
Функция обПолучитьТекстБуфераОбмена() Экспорт
   Ф=Константы.ПолучитьФорму();
   Ф.ЭлементыФормы.Добавить(Тип("ПолеHTMLДокумента"), "ПолеHTMLДокумента", Ложь);
   Окно=Ф.ЭлементыФормы.ПолеHTMLДокумента.Документ.parentWindow;
   Возврат Окно.clipboardData.GetData("Text");
   Ф=0;
КонецФункции

//Устанавливает текст буфера обмена в виде строки
Функция обУстановитьТекстБуфераОбмена(Текст) Экспорт
   Ф=Константы.ПолучитьФорму();
   Ф.ЭлементыФормы.Добавить(Тип("ПолеHTMLДокумента"), "ПолеHTMLДокумента", Ложь);
   Окно=Ф.ЭлементыФормы.ПолеHTMLДокумента.Документ.parentWindow;
   Окно.clipboardData.SetData("Text", Текст);
   Ф=0;
КонецФункции
8 Kerk
 
11.01.08
11:43
Может под шумок добавить функцию получения картинки из буфера обмена, сделанный по кнопке PrtScn? ;)
9 Кураж
 
11.01.08
11:48
Байда с ПолеHTMLДокумента действительно не работает при определенных настройках политики безопастности, а вот это:
HTML=Новый COMОбъект("htmlfile");
HTML.parentWindow.clipboardData.setData("Text","бла-бла");
наш метод!
10 Гений 1С
 
гуру
11.01.08
11:49
(8) без внешних компонент не получится. Ты не знаешь WSH умеет работать с буфером обмена?
11 Гений 1С
 
гуру
11.01.08
11:52
Лучше так:

//20080111 fixin
//Возвращает текст буфера обмена в виде строки
//=Отлажена
Функция обПолучитьТекстБуфераОбмена() Экспорт
#Если Клиент Тогда
   Ф=Константы.ПолучитьФорму();
   Ф.ЭлементыФормы.Добавить(Тип("ПолеHTMLДокумента"), "_85c2d560073c4494ba5007e881556b1b", Ложь);
   Окно=Ф.ЭлементыФормы._85c2d560073c4494ba5007e881556b1b.Документ.parentWindow;
   Возврат Окно.clipboardData.GetData("Text");
   Ф=0;
#КонецЕсли
КонецФункции

//Устанавливает текст буфера обмена в виде строки
//=Отлажена
Функция обУстановитьТекстБуфераОбмена(Текст) Экспорт
#Если Клиент Тогда
   Ф=Константы.ПолучитьФорму();
   Ф.ЭлементыФормы.Добавить(Тип("ПолеHTMLДокумента"), "_85c2d560073c4494ba5007e881556b1b", Ложь);
   Окно=Ф.ЭлементыФормы._85c2d560073c4494ba5007e881556b1b.Документ.parentWindow;
   Окно.clipboardData.SetData("Text", Текст);
   Ф=0;
#КонецЕсли
КонецФункции
12 ЫЫЫЫ
 
11.01.08
11:59
(9)Нифига подобного.
Настройка "Разрешить операции вставки из сценария" на этод метод также распространяется...
13 smaharbA
 
11.01.08
12:00
(3) безопасность снизь
14 smaharbA
 
11.01.08
12:00
+ в ИЕ
15 Кураж
 
11.01.08
12:02
(12) У меня первый не работает, а второй работает. Почему?
16 Kerk
 
11.01.08
12:05
(10) Написано, что "Дополнительно предоставляются возможности: работы с буффером обмена и проигрывания звуковых файлов." для версии WSH.GUI v2.2
17 Гений 1С
 
гуру
11.01.08
13:14
//20080111 fixin
//Возвращает текст буфера обмена в виде строки
//=Отлажена
Функция ___обПолучитьТекстБуфераОбмена() Экспорт
#Если Клиент Тогда
   Объект = Новый COMОбъект("htmlfile");
   Возврат Объект.ParentWindow.ClipboardData.Getdata("Text");
#КонецЕсли
КонецФункции

//20080111 fixin
//Устанавливает текст буфера обмена в виде строки
//=Отлажена
Функция ___обУстановитьТекстБуфераОбмена(Текст) Экспорт
#Если Клиент Тогда
   Объект = Новый COMОбъект("htmlfile");
   Объект.ParentWindow.ClipboardData.Setdata("Text", Текст);
   Возврат Текст;
#КонецЕсли
КонецФункции
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший