Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-83745
Lola
2003-04-25 16:04
2003.05.26
---|Ветка была без названия|---


4-83801
bobo
2003-03-25 19:06
2003.05.26
Как сделать ПЛАВНУЮ прокрутку в Rich Edit control ?


7-83761
Fedor
2003-03-24 13:03
2003.05.26
Перехват начала печати


14-83688
Mak
2003-05-05 14:04
2003.05.26
Crystal Report


3-83356
Apachi
2003-05-06 07:48
2003.05.26
IB работа с датой





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский