imho.ws |
![]() |
![]() |
![]() |
# 1 |
Full Member
Регистрация: 15.11.2002
Адрес: Moscow
Сообщения: 834
![]() ![]() ![]() ![]() ![]() |
Excel + буфер обмена
Необходимо написать на Delphi небольшую программку, которая могла бы помещать в буфер обмена данные так, как будто они были скопированы туда из двух (трех, четырех и т.д.) соседних ячеек Excel'я
/excel.gif/ после вставки содержимого из буфера (скопированного из Excel) в другую программу - получаем следующее: /progok.gif/ т.е. программа понимает, что текст скопирован из разных ячеек и раскидывает текст в разные поля когда же моя программа генерирует текст и помещает его в буфер, то после вставки имеем следующее: /prog.gif/ т.е. программа не раскидала текст по полям ![]() после разбора содержимого буфера (скопированного из Excel) обнаружил, что символ разделитель ячеек - Tab - #9, а в конец строки добавляется символ переноса строки - #10#13... аналогично формирую свою строку - Код:
'text1'+#9+'text2'+#10#13 может кто помочь? |
![]() |
![]() |
# 3 |
Guest
Сообщения: n/a
|
>'text1'+#9+'text2'+#10#13
А попробуй вот так, если я не туплю, конечно. 'text1'+'#9'+'text2'+'#10#13' Ну а у меня сейчас вот так получилось в С++ Билдер 5 и вставлял в офис2003 Edit1->Text = Edit2->Text+" "+Edit3->Text; // в ковычках 5 пробелов Edit1->SetFocus(); Edit1->CopyToClipboard(); Ну а в Делфи просто заменяешь -> на . " на ' |
![]() |
# 4 | |||
Full Member
Регистрация: 15.11.2002
Адрес: Moscow
Сообщения: 834
![]() ![]() ![]() ![]() ![]() |
Цитата:
Код:
Clipboard.SetTextBuf(PChar( eBuilding.Text+#9+#9+AnsiUpperCase(cbStreetsList.Text)+#9+#9+AnsiUpperCase(cbCitiesList.Text)+#9+#9+eIndex.Text+#10#13)) по два #9 - это так и надо, ибо надо вставлять данные в поля через 2 для проверки того, как передаются поля из Excel'a в буфер и из моей проги, использовал следующий код: Код:
procedure TZipForm.Button2Click(Sender: TObject); var MyHandle: THandle; TextPtr: PChar; MyString,S: string; i:Integer; begin ClipBoard.Open; try MyHandle := Clipboard.GetAsHandle(CF_TEXT); TextPtr := GlobalLock(MyHandle); MyString := StrPas(TextPtr); GlobalUnlock(MyHandle); finally Clipboard.Close; end; if Clipboard.HasFormat(CF_TEXT) then S:=''; lFullStreet.Caption:=MyString ; for i:=1 to length(MyString) do S:=S+IntToStr(Ord(MyString[i]))+' '; lFullStreet.Caption:=S; end; Цитата:
Цитата:
|
|||
![]() |
![]() |
# 5 |
Advanced Member
Регистрация: 09.03.2004
Адрес: толстозадая Москва
Сообщения: 498
![]() ![]() ![]() ![]() |
а не пробовал забирать данные вот так: Clipboard.AsText; ? А проверочку содержимого так и так нужно делать. Вроде PChar (указатель с нулем вконце) не должон влиять на получаемы/запихиваемый в буфер текст.
|
![]() |
![]() |
# 7 |
Guest
Сообщения: n/a
|
Да, фигнню я напорол с #9. Невыспался был. Звиняй.
>может проблема в том, что текст в буфере НЕ надо принимать за текст? Но все таки Ехсель должен что то пихать в буфер помимо текста. Ворд по Ехселевскому буферу сразу таблицу рисует. У класса Clipbord помимо функции GetTextBuf (по сути, то что у тебя), есть и GetComponent. По GetAsHandle(CF_TEXT) ты выдергиваешь только текст (только, то что в буфере отформатировано как текст), но там одновремено, может быть и CF_BITMAP и CF_METAFILEPICT и CF_COMPONENT и др. А как сделать я не знаю. Это были так мысли вслух, чисто: "Я тАк думаю"(с) |