Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.023 c
15-1276784558
Aleks
2010-06-17 18:22
2010.09.19
Armadillo (неожиданное автозакрытие программы)


15-1277497794
Юрий
2010-06-26 00:29
2010.09.19
С днем рождения ! 26 июня 2010 суббота


2-1277427763
Diplomat
2010-06-25 05:02
2010.09.19
Как лучше осуществить триальность программы


15-1277349628
ixen
2010-06-24 07:20
2010.09.19
Не запускается программа. В чем может быть причина?


15-1277585052
AKE
2010-06-27 00:44
2010.09.19
Как звали французского шахматиста конца 18 века?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский