IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Excel + буфер обмена (http://www.imho.ws/showthread.php?t=72595)

LAndrew2 03.11.2004 02:11

Excel + буфер обмена
 
Вложений: 3
Необходимо написать на Delphi небольшую программку, которая могла бы помещать в буфер обмена данные так, как будто они были скопированы туда из двух (трех, четырех и т.д.) соседних ячеек Excel'я
/excel.gif/
после вставки содержимого из буфера (скопированного из Excel) в другую программу - получаем следующее:
/progok.gif/
т.е. программа понимает, что текст скопирован из разных ячеек и раскидывает текст в разные поля
когда же моя программа генерирует текст и помещает его в буфер, то после вставки имеем следующее:
/prog.gif/
т.е. программа не раскидала текст по полям :(

после разбора содержимого буфера (скопированного из Excel) обнаружил, что символ разделитель ячеек - Tab - #9, а в конец строки добавляется символ переноса строки - #10#13... аналогично формирую свою строку -
Код:

'text1'+#9+'text2'+#10#13
но это почему-то не помогает...

может кто помочь?

/7y3uK 03.11.2004 12:54

Опиши какими символьными типами ты пользуешься для хранения-передачи данных, и кусок кода покажи, где у тебя не получается выцепить данные правильно. ИМХО тут в типе STRING заморочка.

ЧересЧеловек 03.11.2004 16:21

>'text1'+#9+'text2'+#10#13

А попробуй вот так, если я не туплю, конечно.

'text1'+'#9'+'text2'+'#10#13'

Ну а у меня сейчас вот так получилось в С++ Билдер 5 и вставлял в офис2003

Edit1->Text = Edit2->Text+" "+Edit3->Text; // в ковычках 5 пробелов
Edit1->SetFocus();
Edit1->CopyToClipboard();

Ну а в Делфи просто заменяешь -> на .
" на '

LAndrew2 03.11.2004 19:34

Цитата:

Опиши какими символьными типами ты пользуешься для хранения-передачи данных, и кусок кода покажи, где у тебя не получается выцепить данные правильно. ИМХО тут в типе STRING заморочка.
в буфер я копирую текст так:
Код:

Clipboard.SetTextBuf(PChar(  eBuilding.Text+#9+#9+AnsiUpperCase(cbStreetsList.Text)+#9+#9+AnsiUpperCase(cbCitiesList.Text)+#9+#9+eIndex.Text+#10#13))
соответвственно, все типы - String.
по два #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;

анализирует содержимое буфера по нажатию клавиши, в результате в строку S передается через пробел ASCII коды того, что есть в буфере (может проблема в том, что текст в буфере НЕ надо принимать за текст?). анализ этого показывает, что моя программа и Excel передают данные в одинаковом формате... но вот другая прога (куда их вставляют) понимает их по-разному...

Цитата:

ЧересЧеловек:
'text1'+'#9'+'text2'+'#10#13'
тогда просто в буфере будет строка 'text1#9text2#10#13'

Цитата:

ЧересЧеловек:
и вставлял в офис2003
мне нужно не в офис вставлять, а в другую прогу! (офис сам пробелы или Tab заменяет на некий разделитель ячеек), мне нужно сделать такое содержимое буфера, как будто эти данные были переданы из офиса!

/7y3uK 03.11.2004 22:42

а не пробовал забирать данные вот так: Clipboard.AsText; ? А проверочку содержимого так и так нужно делать. Вроде PChar (указатель с нулем вконце) не должон влиять на получаемы/запихиваемый в буфер текст.

LAndrew2 03.11.2004 23:04

Цитата:

/7y3uK:
а не пробовал забирать данные вот так: Clipboard.AsText;
пробовал - то же самое...

ЧересЧеловек 05.11.2004 12:02

Да, фигнню я напорол с #9. Невыспался был. Звиняй.

>может проблема в том, что текст в буфере НЕ надо принимать за текст?

Но все таки Ехсель должен что то пихать в буфер помимо текста. Ворд по Ехселевскому буферу сразу таблицу рисует.
У класса Clipbord помимо функции GetTextBuf (по сути, то что у тебя), есть и GetComponent.
По GetAsHandle(CF_TEXT) ты выдергиваешь только текст (только, то что в буфере отформатировано как текст), но там одновремено, может быть и CF_BITMAP и CF_METAFILEPICT и CF_COMPONENT и др.
А как сделать я не знаю. Это были так мысли вслух, чисто: "Я тАк думаю"(с)


Часовой пояс GMT +4, время: 10:34.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.