Форум: "Основная";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];
ВнизДобавление информации в поток Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c