Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.216.24.243] |
|
Сообщ.
#1
,
|
|
|
А как в буфер отмена вставить некотрые данные , которые бы потом Word считал бы таблицей .Те при вставки в Ворд вставлялася таблица.
В пониманимании офиса талица это форматированный текст , разделенныый #9 и 'прямоугольный' С каим параметром надо обратится к SetClipboardData(тип_вставляемого,ссылка_на_вставляемое); вот пример пихания таблицы в буфер обмена на которую реагируе Ексель. ========================= procedure TForm1.Button2Click(Sender: TObject); var hData: HGlobal; pData: pointer; Len: LongInt; sss:string; begin zzz:=1; //Фрмат 1-текст sss:='1_1'#9'1_2'#13#10'2_1'#9'2_2'; OpenClipboard(Application.Handle); Len:=length( sss); hData:=GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE, Len); pData:=GlobalLock(hData); Move(PChar(sss)^, pData^, Len); EmptyClipboard; SetClipboardData( zzz,hData); GlobalUnlock(hData); CloseClipboard; end; ==================== После этого можно запустить ексель и вставить , и вот чего вставится ----------------- 1_1 | 1_2 | ------------------ 2_1 | 2_2 | ----------------- Чуствую надо парамтр zzz (SetClipboardData) поменять , а на что не знаю. А хочется вставлять именно в ворд , и чтоб он считал что в буфере обмена таблица. Вот... Есть какиенибудь идеи ? |
Сообщ.
#2
,
|
|
|
Ну например:
Procedure CopyStringGridToClipBoard(StringGrid: TStringGrid); { Процедура копирует TStringGrid, переданный в качестве параметра в буфер обмена } Var S: String; t,r: Integer; Begin S:=''; With StringGrid Do For t:=0 to RowCount-1 Do Begin For r:=0 to ColCount-1 Do IF r = ColCount-1 then S:=S+Cells[r,t] else S:=S+Cells[r,t]+#9; S:=S+#13#10; End; {For} { Включаем русский язык на время копирования } ActivateKeyboardLayout(LoadKeyboardLayout('00000419',0),0); ClipBoard.AsText:=S; End; |
Сообщ.
#3
,
|
|
|
Думаю что лучше не через буфер это передавать, а работать с объектом ворд напрямую.
|
Сообщ.
#4
,
|
|
|
var
APP : variant; begin APP:= CreateOleObject('Word.Application'); APP.Visible := true; APP.Documents.Add; APP.Selection.TypeText('Hello'#13#10'Hello'); APP.Selection.TypeText('Hello'#13#10'Hello'); APP.Selection.TypeText('Hello'#13#10'Hello'); APP.Selection.TypeParagraph; APP.Selection.TypeText('Hello1310Hello'); //APP.Selection.Paste; А вот так я хочу вставить таблицу тока сначала надоеё в буфер обмена . end; |
Сообщ.
#5
,
|
|
|
Diamond, лучше то, лучше это. Все молчат как рыбы, как только запостишь пример, начинают лучше то лучше это. Вот бы и дал пример как
Цитата Diamond, 14.01.04, 10:36 а работать с объектом ворд напрямую ? |
Сообщ.
#6
,
|
|
|
Цитата Song @ 14.01.04, 11:46 Вот бы и дал пример как. Ну что ж, тогда я дам пример. Насколько я понимаю, автору важно вставить таблицу в Word, а не важно вставить её именно из буфера обмена или откуда-нибудь ещё, тогда примите обработчик: procedure TForm1.Button2Click(Sender: TObject); var App: OLEVariant; i:integer; arange, tabl, tabls, doc: variant; begin APP:= CreateOleObject('Word.Application'); APP.Visible := true; //берём указатель на документ doc:=APP.Documents.Add; //всё выделяем в документе ARange:=Doc.Range(EmptyParam,EmptyParam); //получаем из всего массив таблиц tabls:=ARange.Tables; // добавляем новую таблицу размером 2 на 4 tabl:=tabls.Add(arange,2,4); // в цикле задаем значение ячеек for i := 1 to 2 do tabl.Cell(i,1).Range.Text := 'Символы строки'+inttostr(i); end; |