Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.26;
Скачать: CL | DM;

Вниз

Добавление информации в поток   Найти похожие ветки 

 
Rocker ©   (2003-05-12 10:24) [0]

Мастера! Подскажите, как информацию из буфера обмена (TClipboard) добавить (поместить) в поток (TStream)?


 
Rocker ©   (2003-05-12 11:20) [1]

Help!


 
Palladin ©   (2003-05-12 11:45) [2]

по мотивам метода TClipBoard.GetComponent - "ClipBrd.pas" 160


procedure ClipBoardToStream(p_wFormat:Word;Stream:TStream);
var
CBHandle:THandle;
CBData:Pointer;
begin
CBHandle:=ClipBoard.GetAsHandle(p_wFormat);
CBData:=GlobalLock(CBHandle);
try
Stream.WriteBuffer(CBData^,GlobalSize(CBHandle));
finally
GlobalUnLock(CBHandle);
end;
end;


 
Дмитрий Баранов ©   (2003-05-12 11:50) [3]

Буфер обмена может хранить данные в десятке форматов (при копировании куска из ворда - Plain text, unicode plain text, rtf, html, xml ).
Принцип такой: вызвать OleGetClipboard, получить указатель на IDataObject, вызвать IDataObject::EnumFormatEtc, получить указатель на IEnumFORMATETC, для каждого элемента перечисления (соответствующего разным форматам данных в буфере обмена) вызвать IDataObjectIDataObject::GetData, из STGMEDIUM получить HGLOBAL, залочить его, вызвать CreateStreamOnHGlobal и получить указатель на инициализированный IStream.
Затем тупо скопировать байты из IStream в TStream.


 
Palladin ©   (2003-05-12 12:04) [4]


> Дмитрий Баранов © (12.05.03 11:50)

:))
нюню


 
Дмитрий Баранов ©   (2003-05-12 12:17) [5]

На самом деле все не так уж и сложно, зато грамотно :-) Я пример кода как-то уже сюда постил, там строчек 50 всего.


 
Palladin ©   (2003-05-12 12:31) [6]

Конечно грамотно. Кто спорит, то. Просто сдается мне, что рановато автору топика такое.


 
Rocker ©   (2003-05-14 03:22) [7]

Мне тоже так кажется.
Спасибо, конечно, Palladin, за приведенный код, но почему-то он у меня работает только с текстом:


procedure TForm1.Button1Click(Sender: TObject);
var
Handle: THandle;
MemPtr: Pointer;
st: TFileStream;
begin
if clipboard.HasFormat(cf_text) then
begin
st:=TFileStream.Create("1.txt",fmcreate);
try
Handle := Clipboard.GetAsHandle(cf_text);
MemPtr := GlobalLock(Handle);
st.write(MemPtr^,GlobalSize(Handle));
finally
GlobalUnlock(Handle);
st.Destroy;
end;
end;
end;


Если же я попытаюсь прочитать из буфера, например формат cf_picture (зная, что он там точно содержится), данные просто будут игнорированы.(Как видно, я использовал запись из буфера в файл 1.txt)Может я чего-то не учел?

В файловый поток я, правда, записал другим способом (конечно неграмотно, но зато работоспособно!):


procedure TForm1.Button1Click(Sender: TObject);
var st:TfileStream;
rx:TRxRichEdit;
begin
st:=tfilestream.Create("1.txt",fmcreate);
rx:=trxrichedit.Create(self);
rx.parent:=self;
rx.Visible:=false;
rx.PasteFromClipboard;
rx.Lines.SaveToStream(st);
rx.Destroy;
st.destroy;
end;



Хотел бы услышать оценку этого способа, а также причину неработоспособности предыдущего.


 
MBo ©   (2003-05-14 05:20) [8]

OpenClipBoard
EnumClipboardFormats
GetClipboardData
GlobalSize
GlobalLock
запись
GlobalUnlock
CloseClipBoard



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

Текущий архив: 2003.05.26;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.015 c
14-83708
Sherbacov
2003-05-06 19:50
2003.05.26
Хеш вектор


11-83430
Jazzy$
2002-08-20 15:36
2003.05.26
Listview + ImageList


1-83440
fool
2003-05-14 18:09
2003.05.26
Автоматизация Microsoft Word


3-83337
Dimitry
2003-05-05 14:19
2003.05.26
сжатие базы Access


3-83358
proc
2003-04-30 19:29
2003.05.26
RecNo i Filter