![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как извлечь из буфера обмена первые N символов текста. [D7, WinXP]
MasteroK © (2006-12-26 17:12:00)Или как извлечь текст из буфера средствами API. TClipboard - таких возможностей не даёт.
MasteroK (2006-12-27 16:55:00) [1]Нашёл:
len:=GlobalSize(hMem);
MasteroK (2006-12-27 16:54:00) [2]А если буфер меньше 100 байт - как не скопировать лишнее?
p := GlobalLock(hmem); - какого формата? PChar?
Хочу узнать размер буфера перед копированием.
ors_archangel (2006-12-27 06:14:00) [3]Хитро, неяно... ....значит нужно копировать перед преведением к string
Джо (2006-12-27 03:56:00) [4]А впрочем, не нужно. Ведь result := String(PAnsiChar(p)); приведет к вызову _LStrFromChar, если не ошибаюсь, так что все OK.
Джо (2006-12-27 03:52:00) [5]> [6] ors_archangel © (27.12.06 03:37)
>
> > Только не нужно ли в [2] копировать данные явно?
>
> SOLUTION - Пусть явно скопирует N байт!
Так я вот о чем и говорю.
ors_archangel (2006-12-27 03:41:00) [6]RTFM, вобщем, и все понты, а что там в кармане такого большого может быть?
Да винда вообще только память-гонянием и занимается, так что не помешает и нам (а то будешь блой вороной!), вот моя позиция, товарищи, Ленин! Партия! Комсомол! Борланд! Майкрософт! Но если Ленин уже, то Майрософт только must
ors_archangel (2006-12-27 03:37:00) [7]
> Только не нужно ли в [2] копировать данные явно?
SOLUTION - Пусть явно скопирует N байт!
ors_archangel (2006-12-27 03:37:00) [8]GlobalLock ведь не не не копирует память!! тру-ля-ля, тру-ля-ля
Джо (2006-12-27 03:08:00) [9]Только не нужно ли в [2] копировать данные явно?
Джо (2006-12-27 03:07:00) [10]> [3] MasteroK (27.12.06 02:22)
> Мне нужны только первые 100 байт.
Так тебе никто все и не предлагает. Память выделена системой в своей собственной системной куче. Ты получаешь на нее ссылку, а оттуда уже копируешь. В общем, как в [1] я и сказал. Хоть с помощью TClipboard, хоть на WinAPI как в [2].
MasteroK (2006-12-27 02:22:00) [11]hmem := GetClipboardData(CF_TEXT);//не знаю чо происходит здесь
p := GlobalLock(hmem);//но в этом месте есть подозрения, что выделяется новая пямять по размеру буфера и туда копируется всё его содержимое.
Мне нужны только первые 100 байт.
Если буфер будет слишком большим - моя прога тормозить не будет, если я не буду гонять туда сюда большие куски памяти.
ors_archangel (2006-12-26 19:48:00) [12]Средствами 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;
Джо (2006-12-26 17:26:00) [13]Получить весь. Затем обрезать ненужное или скопировать нужное.