![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Текст в Clipboard. CF_TEXT или CF_UNICODETEXT
DevilDevil © (2010-06-15 15:28:00)Как определить, в каком формате сейчас буфер обмена ?
DevilDevil (2010-06-24 10:54:00) [1]Ребят, спасибо, всё работает превосходно
procedure SetClipboardString(const Value: string);
var
LangId: integer;
StrData: pointer absolute Value;
procedure FillClipboardData(const Flag: integer; Data: pointer; Size: integer);
var
Handle: HGlobal;
begin
Handle := GlobalAlloc(GMEM_DDESHARE or GMEM_MOVEABLE, Size);
CopyMemory(GlobalLock(Handle), Data, Size);
GlobalUnlock(Handle);
SetClipboardData(Flag, Handle);
GlobalFree(Handle);
end;
begin
OpenClipboard(0);
EmptyClipboard();
if (StrData <> nil) then
begin
FillClipboardData(CF_TEXT, StrData, Length(Value)+1);
LangId := GetUserDefaultLangID;
FillClipboardData(CF_LOCALE, @LangId, sizeof(LangId));
end;
CloseClipboard();
end;
function GetClipboardString(): string;
var
Len: integer;
Handle: HGlobal;
ADest: pansichar;
begin
Result := '';
OpenClipboard(0);
Handle := GetClipboardData(CF_TEXT);
if (Handle <> 0) then
begin
Len := integer(GlobalSize(Handle)) - 1;
if (Len > 0) then
begin
ADest := GlobalLock(Handle);
SetLength(Result, Len);
CopyMemory(pchar(Result), ADest, Len);
GlobalUnlock(Handle);
end;
end;
CloseClipboard();
end;
QAZ (2010-06-18 20:20:00) [2]
> Бредятина там написана.
> Если программа не юникодовская, то ничего всё равно не поможет.
да это ты бредиш
Dimka Maslov (2010-06-18 16:34:00) [3]Для чтения ничего не надо. Достаточно стандартными способами вставить текст. Если программа не юникодовская, то ничего всё равно не поможет.
DevilDevil (2010-06-18 16:17:00) [4]Dimka Maslov,
ok, для чтения что-то кардинально отличается ?
Dimka Maslov (2010-06-18 16:06:00) [5]
> QAZ (18.06.10 13:35) [15]
Бредятина там написана. Всё гораздо проще
procedure SetClipboard(Str: String);
var
hData: HGlobal;
pData: pointer;
Len: integer;
begin
if OpenClipboard(Application.MainForm.Handle) then begin
try
Len:=Length(Str)+1;
hData:=GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE, Len);
try
pData:=GlobalLock(hData);
try
Move(PChar(Str)^, pData^, Len);
EmptyClipboard;
SetClipboardData(CF_Text, hData);
finally
GlobalUnlock(hData);
end;
except
GlobalFree(hData);
raise
end;
hData:=GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE, 4);
try
pData:=GlobalLock(hData);
try
PInteger(pData)^ := GetUserDefaultLangID;
SetClipboardData(CF_LOCALE, hData);
finally
GlobalUnlock(hData);
end;
except
GlobalFree(hData);
raise
end;
finally
CloseClipboard;
end;
end else raise EOutOfResources.CreateRes(@SCannotOpenClipboard);
end;
DevilDevil (2010-06-18 14:10:00) [6]на днях попробую, спасибо
если есть готовые функции - буду рад посмотреть и использовать
QAZ (2010-06-18 13:35:00) [7]http://www.delphimaster.ru/cgi-bin/forum.pl?id=1274404034&n=5&p=2
Dimka Maslov (2010-06-18 13:30:00) [8]При вставке в неюникодовское приложение помочь может только переход на юникод.
При копировании из неюникодовского приложения помочь может смена раскладки клавиатуры или копирование в буфер обмена целочисленного значения, полученного функцией GetUserDefaultLangID с указанием формата CF_LOCALE
QAZ (2010-06-18 13:28:00) [9]эту "проблему" эже решали буквально месяц назад
DevilDevil (2010-06-18 13:27:00) [10]QAZ, так как узнать что ?
если возвращает и то
иIsClipboardFormatAvailable(CF_UNICODETEXT), иCF_TEXT
QAZ (2010-06-18 13:24:00) [11]
> В буфере всегда лежит и CF_TEXT и CF_UNICODETEXT, а также
> CF_LOCALE
нет
там лежит то что положат
DevilDevil (2010-06-18 13:12:00) [12]проблема клипборда какая
скопированный текст в одном приложении может не вставиться в другой
я хочу максимально оптимизировать функции копирования вставки под реальные нужды
чувствую, нужен CF_UNICODETEXT
но вместе с тем, я хочу читать клипборд и из формата CF_UNICODETEXT, и из формата CF_TEXT
в этом случае нужно отслеживать, что-же находится в клипборде
Anatoly Podgoretsky (2010-06-18 10:24:00) [13]Ты используешь? Вот и они тоже.
DevilDevil (2010-06-18 09:37:00) [14]Dimka Maslov,
спасибо большое
какой-то пример сему есть ?
и почему тогда многие софтины не используют этот CF_LOCALE или как его там
Dimka Maslov (2010-06-17 17:14:00) [15]В буфере всегда лежит и CF_TEXT и CF_UNICODETEXT, а также CF_LOCALE, который надо учитывать как при копировании в буфер обмена, так и при вставке из него.
DevilDevil (2010-06-16 12:32:00) [16]Удалено модератором
Примечание: Создание пустых сообщений
DevilDevil (2010-06-15 17:40:00) [17]ок
только если в буфере обмена лежит CF_TEXT, а я беру CF_UNICODETEXT, то получается кракозябра. И наоборот
procedure SetClipboardString(const Value: string; WideMode: boolean = false);
const
FLAGS: array[boolean] of integer = (CF_TEXT, CF_UNICODETEXT);
var
Len: integer;
Handle: HGlobal;
WDest: pwidechar;
ADest: pansichar absolute WDest;
begin
OpenClipboard(0);
EmptyClipboard();
if (WideMode) then WideMode := IsClipboardFormatAvailable(CF_UNICODETEXT);
Handle := 0;
Len := Length(Value);
if (Len <> 0) then
begin
Handle := GlobalAlloc(GMEM_DDESHARE or GMEM_MOVEABLE, (Len+1)*(1 + ord(WideMode)));
WDest := GlobalLock(Handle);
if (WideMode) then
begin
MultiByteToWideChar(0, 0, pchar(Value), Len, WDest, Len);
WDest[Len] := #0;
end else
begin
CopyMemory(ADest, pchar(Value), Len);
ADest[Len] := #0;
end;
GlobalUnlock(Handle);
SetClipboardData(FLAGS[WideMode], Handle);
end;
CloseClipboard();
if (Len <> 0) then GlobalFree(Handle);
end;
function GetClipboardString(): string;
const
FLAGS: array[boolean] of integer = (CF_TEXT, CF_UNICODETEXT);
var
WideMode: boolean;
Len: integer;
Handle: HGlobal;
WDest: pwidechar;
ADest: pansichar absolute WDest;
begin
Result := '';
OpenClipboard(0);
//WideMode := IsClipboardFormatAvailable(CF_UNICODETEXT);
//if (not WideMode) and (not IsClipboardFormatAvailable(CF_TEXT)) then
WideMode := (not IsClipboardFormatAvailable(CF_TEXT));
if (WideMode) and (not IsClipboardFormatAvailable(CF_UNICODETEXT)) then
begin
CloseClipboard();
exit;
end;
Handle := GetClipboardData(FLAGS[WideMode]);
if (Handle <> 0) then
begin
Len := integer(GlobalSize(Handle)) div (1 + ord(WideMode)) - 1;
if (Len > 0) then
begin
WDest := GlobalLock(Handle);
SetLength(Result, Len);
if (WideMode) then
begin
WideCharToMultiByte(0, 0, WDest, Len, pchar(Result), Len, nil, nil);
end else
begin
CopyMemory(pchar(Result), ADest, Len);
end;
GlobalUnlock(Handle);
end;
end;
CloseClipboard();
end;
Правильный$Вася (2010-06-15 17:01:00) [18]
> в каком формате сейчас буфер обмена ?
фокус в том, что интерпретация содержимого - задача программиста, а не буфера
Anatoly Podgoretsky (2010-06-15 15:44:00) [19]> DevilDevil (15.06.2010 15:42:02) [2]
Это значит что оба формата доступны.
DevilDevil (2010-06-15 15:42:00) [20]HasFormat возвращает true и на CF_TEXT, и на CF_UNICODETEXT