Форум: "Начинающим";
Текущий архив: 2010.09.19;
Скачать: [xml.tar.bz2];
ВнизТекст в Clipboard. CF_TEXT или CF_UNICODETEXT Найти похожие ветки
← →
DevilDevil © (2010-06-15 15:28) [0]Как определить, в каком формате сейчас буфер обмена ?
← →
Anatoly Podgoretsky © (2010-06-15 15:41) [1]> DevilDevil (15.06.2010 15:28:00) [0]
HasFormat
← →
DevilDevil © (2010-06-15 15:42) [2]HasFormat возвращает true и на CF_TEXT, и на CF_UNICODETEXT
← →
Anatoly Podgoretsky © (2010-06-15 15:44) [3]> DevilDevil (15.06.2010 15:42:02) [2]
Это значит что оба формата доступны.
← →
Правильный$Вася (2010-06-15 17:01) [4]
> в каком формате сейчас буфер обмена ?
фокус в том, что интерпретация содержимого - задача программиста, а не буфера
← →
DevilDevil © (2010-06-15 17:40) [5]ок
только если в буфере обмена лежит 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;
← →
DevilDevil © (2010-06-16 12:32) [6]Удалено модератором
Примечание: Создание пустых сообщений
← →
Dimka Maslov © (2010-06-17 17:14) [7]В буфере всегда лежит и CF_TEXT и CF_UNICODETEXT, а также CF_LOCALE, который надо учитывать как при копировании в буфер обмена, так и при вставке из него.
← →
DevilDevil © (2010-06-18 09:37) [8]Dimka Maslov,
спасибо большое
какой-то пример сему есть ?
и почему тогда многие софтины не используют этот CF_LOCALE или как его там
← →
Anatoly Podgoretsky © (2010-06-18 10:24) [9]Ты используешь? Вот и они тоже.
← →
DevilDevil © (2010-06-18 13:12) [10]проблема клипборда какая
скопированный текст в одном приложении может не вставиться в другой
я хочу максимально оптимизировать функции копирования вставки под реальные нужды
чувствую, нужен CF_UNICODETEXT
но вместе с тем, я хочу читать клипборд и из формата CF_UNICODETEXT, и из формата CF_TEXT
в этом случае нужно отслеживать, что-же находится в клипборде
← →
QAZ (2010-06-18 13:24) [11]
> В буфере всегда лежит и CF_TEXT и CF_UNICODETEXT, а также
> CF_LOCALE
нет
там лежит то что положат
← →
DevilDevil © (2010-06-18 13:27) [12]QAZ, так как узнать что ?
если возвращает и то
иIsClipboardFormatAvailable(CF_UNICODETEXT)
, иCF_TEXT
← →
QAZ (2010-06-18 13:28) [13]эту "проблему" эже решали буквально месяц назад
← →
Dimka Maslov © (2010-06-18 13:30) [14]При вставке в неюникодовское приложение помочь может только переход на юникод.
При копировании из неюникодовского приложения помочь может смена раскладки клавиатуры или копирование в буфер обмена целочисленного значения, полученного функцией GetUserDefaultLangID с указанием формата CF_LOCALE
← →
QAZ (2010-06-18 13:35) [15]http://delphimaster.net/view/4-1274404034/
← →
DevilDevil © (2010-06-18 14:10) [16]на днях попробую, спасибо
если есть готовые функции - буду рад посмотреть и использовать
← →
Dimka Maslov © (2010-06-18 16:06) [17]
> 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 16:17) [18]Dimka Maslov,
ok, для чтения что-то кардинально отличается ?
← →
Dimka Maslov © (2010-06-18 16:34) [19]Для чтения ничего не надо. Достаточно стандартными способами вставить текст. Если программа не юникодовская, то ничего всё равно не поможет.
← →
QAZ (2010-06-18 20:20) [20]
> Бредятина там написана.
> Если программа не юникодовская, то ничего всё равно не поможет.
да это ты бредиш
← →
DevilDevil © (2010-06-24 10:54) [21]Ребят, спасибо, всё работает превосходно
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;
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.09.19;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.005 c