Вниз
Скачать: CL | DM;

Вопрос по MS Word...   Найти похожие ветки 

 
kull ©   (2002-11-15 17:11) [0]

Как скопировать все содержимое документа (ActiveDocument) в новый документ (Documents.Add) не пользуясь буфером обмена?


 
Calm ©   (2002-11-15 17:15) [1]

Ну если без картинок, таблиц, в общем, только текст,
то можно перебирать по параграфам. Читаем параграф из одного документа, записываем в другой. И так до конца.
Если есть картинки и таблицы, то возникает проблема с их порядком.

А почему нельзя использовать буфер обмена? Если там что важное находится, то это "что-то" можно сохранить, а потом вернуть в буфер.


 
kull ©   (2002-11-15 17:32) [2]


> Calm © (15.11.02 17:15)

Тогда вопрос: А как сохранить содержимое буфера обмена?


 
MBo ©   (2002-11-15 17:56) [3]

Сохранение всего содержимого буфера обмена в файл

var FS:TFileStream;

procedure TForm1.bClearClick(Sender: TObject);
begin
OpenClipBoard(0);
EmptyClipboard;
CloseClipBoard;
end;

procedure TForm1.BSaveClick(Sender: TObject);
var CBF:Cardinal;
CBFList:TList;
i:Integer;
h:THandle;
p:Pointer;
CBBlockLength,Temp:Cardinal;
FS:TFileStream;
begin
if OpenClipBoard(0)then begin
CBFList:=TList.Create;
CBF:=0;
repeat
CBF:=EnumClipboardFormats(CBF);
if CBF<>0 then
CBFList.Add(pointer(CBF));
until CBF=0;
edit1.text:=IntToStr(CBFList.Count);
if CBFList.Count>0 then begin
FS:=TFileStream.Create("e:\cp.dat",fmCreate);
Temp:=CBFList.Count;
FS.Write(Temp,SizeOf(Integer));
for i:=0 to CBFList.Count-1 do begin
h:=GetClipboardData(Cardinal(CBFList[i]));
if h>0 then begin
CBBlockLength:=GlobalSize(h);
if h>0 then begin
p:=GlobalLock(h);
if p <> nil then begin
Temp:=Cardinal(CBFList[i]);
FS.Write(Temp,SizeOf(Cardinal));
FS.Write(CBBlockLength,SizeOf(Cardinal));
FS.Write(p^,CBBlockLength);
end;
GlobalUnlock(h);
end;
end;
end;
FS.Free;
end;
CBFList.Free;
CloseClipBoard;
end;
end;

procedure TForm1.bLoadClick(Sender: TObject);
var h:THandle;
p:Pointer;
CBF:Cardinal;
CBBlockLength:Cardinal;
i,CBCount:Integer;
FS:TFileStream;
begin
if OpenClipBoard(0)then begin
FS:=TFileStream.Create("e:\cp.dat",fmOpenRead);
if FS.Size=0 then Exit;
FS.Read(CBCount,sizeOf(Integer));
if CBCount=0 then Exit;
for i:=1 to CBCount do begin
FS.Read(CBF,SizeOf(Cardinal));
FS.Read(CBBlockLength,SizeOf(Cardinal));
h:=GlobalAlloc(GMEM_MOVEABLE or GMEM_SHARE or GMEM_ZEROINIT,CBBlockLength);
if h>0 then begin
p:=GlobalLock(h);
if p=nil then
GlobalFree(h)
else begin
FS.Read(p^,CBBlockLength);
GlobalUnlock(h);
SetClipboardData(CBF,h);
end;
end;
end;
FS.Free;
CloseClipBoard;
end;
end;

(использованы идеи Peter Below)


 
kull ©   (2002-11-16 00:05) [4]


> MBo © (15.11.02 17:56)

Спасибо! Вот это очень полезный совет.


 
MBo ©   (2002-11-16 09:36) [5]

>kull
Надо только учитывать, что это не сработает при отложенном копировании по запросу (render...), когда приложение-источник данных реально не записывает их в область, доступную через клипборд, а ждет запроса от приемника. Это иногда используется при копировании больших объемов.


 
kull ©   (2002-11-18 11:44) [6]


> MBo © (16.11.02 09:36)

Да, вот это нехорошо...
Значит мне не подойдет. Поэтому-то я и нехочу использовать буфер.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.01 c
3-92938
Mic_2000
2002-11-08 18:35
2002.11.28
Не могу занести в поле char русскую строку, помогите


8-93146
Bars
2002-07-30 22:01
2002.11.28
Mediaplayer


1-93090
AVD
2002-11-14 15:25
2002.11.28
Задачка....


3-92898
alex_ran
2002-11-11 10:32
2002.11.28
Передача переменной в FastReport


3-92924
GAlexis
2002-11-11 16:49
2002.11.28
Как выгрузить данные в MS Word




   Наверх