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

Вниз

Текст в 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.019 c
2-1277667083
Terpelo
2010-06-27 23:31
2010.09.19
Управление словарем Lingvo через Alt + щелчок мышки


15-1276586599
brother
2010-06-15 11:23
2010.09.19
Электронные сигареты


15-1277551866
Илья_
2010-06-26 15:31
2010.09.19
Компонент для работы с локальной сетью


15-1277095834
И. Павел
2010-06-21 08:50
2010.09.19
Странное переполнение


3-1245124820
Sirus
2009-06-16 08:00
2010.09.19
UpdateSQL в несколько таблиц?