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

Вниз

Как извлечь из буфера обмена первые N символов текста.   Найти похожие ветки 

 
MasteroK   (2006-12-26 17:12) [0]

Или как извлечь текст из буфера средствами API. TClipboard - таких возможностей не даёт.


 
Джо ©   (2006-12-26 17:26) [1]

Получить весь. Затем обрезать ненужное или скопировать нужное.


 
ors_archangel ©   (2006-12-26 19:48) [2]

Средствами Win32 API:

function PasteFromClipboard: string;
var
 hmem: THandle;
 p: pointer;
begin
 if IsClipboardFormatAvailable(CF_TEXT) and OpenClipboard(GetClipboardOwner) then begin
   hmem := GetClipboardData(CF_TEXT);
   if hmem = 0 then
     result := ""
   else begin
     p := GlobalLock(hmem);
     result := String(PAnsiChar(p));
     GlobalUnlock(hmem);
   end;
   CloseClipboard;
 end;
end;


 
MasteroK   (2006-12-27 02:22) [3]

hmem := GetClipboardData(CF_TEXT);//не знаю чо происходит здесь
p := GlobalLock(hmem);//но в этом месте есть подозрения, что выделяется новая пямять по размеру буфера и туда копируется всё его содержимое.

Мне нужны только первые 100 байт.

Если буфер будет слишком большим - моя прога тормозить не будет, если я не буду гонять туда сюда большие куски памяти.


 
Джо ©   (2006-12-27 03:07) [4]

> [3] MasteroK   (27.12.06 02:22)
> Мне нужны только первые 100 байт.

Так тебе никто все и не предлагает. Память выделена системой в своей собственной системной куче. Ты получаешь на нее ссылку, а оттуда уже копируешь. В общем, как в [1] я и сказал. Хоть с помощью TClipboard, хоть на WinAPI как в [2].


 
Джо ©   (2006-12-27 03:08) [5]

Только не нужно ли в [2] копировать данные явно?


 
ors_archangel ©   (2006-12-27 03:37) [6]


> Только не нужно ли в [2] копировать данные явно?

SOLUTION - Пусть явно скопирует N байт!


 
ors_archangel ©   (2006-12-27 03:37) [7]

GlobalLock ведь не не не копирует память!! тру-ля-ля, тру-ля-ля


 
ors_archangel ©   (2006-12-27 03:41) [8]

RTFM, вобщем, и все понты, а что там в кармане такого большого может быть?
Да винда вообще только память-гонянием и занимается, так что не помешает и нам (а то будешь блой вороной!), вот моя позиция, товарищи, Ленин! Партия! Комсомол! Борланд! Майкрософт! Но если Ленин уже, то Майрософт только must


 
Джо ©   (2006-12-27 03:52) [9]

> [6] ors_archangel ©   (27.12.06 03:37)
>
> > Только не нужно ли в [2] копировать данные явно?
>
> SOLUTION - Пусть явно скопирует N байт!

Так я вот о чем и говорю.


 
Джо ©   (2006-12-27 03:56) [10]

А впрочем, не нужно. Ведь result := String(PAnsiChar(p)); приведет к вызову _LStrFromChar, если не ошибаюсь, так что все OK.


 
ors_archangel ©   (2006-12-27 06:14) [11]

Хитро, неяно... ....значит нужно копировать перед преведением к string


 
MasteroK   (2006-12-27 16:54) [12]

А если буфер меньше 100 байт - как не скопировать лишнее?
p := GlobalLock(hmem); - какого формата? PChar?
Хочу узнать размер буфера перед копированием.


 
MasteroK   (2006-12-27 16:55) [13]

Нашёл:
len:=GlobalSize(hMem);



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

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

Наверх




Память: 0.49 MB
Время: 0.048 c
15-1178804675
Rouse_
2007-05-10 17:44
2007.06.03
INTERFACE_TYPE


3-1173788472
Thely
2007-03-13 15:21
2007.06.03
IBExpress & FastReport3 ?


2-1179071022
Kostafey
2007-05-13 19:43
2007.06.03
SQL Query Analyzer vs ADO: различия в интерпритации даты


8-1158909536
ZSergey
2006-09-22 11:18
2007.06.03
Как победить мерцание JPG при перемещении


4-1167337456
BreakPoint
2006-12-28 23:24
2007.06.03
Многопоточность на SMP-системах