Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > функция Юникода возвращает знаки вопроса


Автор: elementos 15.2.2008, 01:53
Код

procedure tForm1.PutStringIntoClipBoard(var Str: WideString);
var Size: Integer;
Data: THandle;
DataPtr: Pointer;
begin
Size := Length(Str);
if Size = 0 then
exit;
if not IsClipboardFormatAvailable(CF_UNICODETEXT) then
Clipboard.AsText := Str
else begin
Size := Size shl 1 + 2;
Data := GlobalAlloc(GMEM_MOVEABLE + GMEM_DDESHARE, Size);
try
DataPtr := GlobalLock(Data);
try
Move(Pointer(Str)^, DataPtr^, Size);
Clipboard.SetAsHandle(CF_UNICODETEXT, Data);
finally
GlobalUnlock(Data);
end;
except
GlobalFree(Data);
raise;
end;
end;
end;



здрасьте,
вот такая процедура. 
у меня немецкая виндоус и она работает нормально, возвращает русский текст, а у других людей с немецкой виндоус возвращает знаки вопроса, скажите,где проблема?

Автор: aktuba 15.2.2008, 03:58
Скорее всего проблемы и нет... Ты проверял, что у них в буфере есть текст в юникоде?

Автор: elementos 15.2.2008, 10:43
Цитата(aktuba @  15.2.2008,  03:58 Найти цитируемый пост)
Ты проверял, что у них в буфере есть текст в юникоде? 

в смысле текст в блокнот вставить после копирования, и посмотреть что будет?

еще вопрос,
не знаете, почему данная процедуре иногда глючит, и дает вместо нового текста старый, скопированный ранее?

Автор: elementos 15.2.2008, 14:13
Цитата(aktuba @  15.2.2008,  03:58 Найти цитируемый пост)
Ты проверял, что у них в буфере есть текст в юникоде?

пишет -- знаки вопроса.

Автор: MetalFan 15.2.2008, 17:10
Цитата(elementos @  15.2.2008,  01:53 Найти цитируемый пост)
if not IsClipboardFormatAvailable(CF_UNICODETEXT) then

в чем тайный смысл этой проверки? зачем ты проверяешь наличие данных в клипе в формате уникода?

Добавлено через 8 минут и 56 секунд
для корректной установки текста в клип я пользую (и всем рекомендую) такую функцию:
Код

  function SetClipboardText( const AText: string ): Boolean;
  var
    h:THandle;
  begin
    Clipboard.Open;
    Clipboard.AsText := AText;
    h := Clipboard.GetAsHandle(CF_TEXT);
    SetClipboardData(CF_LOCALE, h);
    Clipboard.Close;
  end;

Автор: elementos 15.2.2008, 17:44
MetalFan
если у человека немецкая виндос, в которой просто нет русской раскладки и нет русской codepage
то будет ли эта ф-ция возвращать русские буквы из буфера?

Автор: MetalFan 15.2.2008, 22:16
попробуй

Автор: elementos 15.2.2008, 22:41
Цитата(MetalFan @  15.2.2008,  17:10 Найти цитируемый пост)
h := Clipboard.GetAsHandle(CF_TEXT);


такой вопрос, почему не CF_UNICODETEXT?

Автор: elementos 15.2.2008, 23:01
Цитата(MetalFan @  15.2.2008,  17:10 Найти цитируемый пост)
 

function SetClipboardText( const AText: string ): Boolean;
  var
    h:THandle;
  begin
    Clipboard.Open;
    Clipboard.AsText := AText;
    h := Clipboard.GetAsHandle(CF_TEXT);
    SetClipboardData(CF_LOCALE, h);
    Clipboard.Close;
  end;



получаетса, что эта функция не будет корректно возвращать русский текст при отсутствии у юзера
русской кодовой страницы (CF_LOCALE) 

посмотри пож., поможет-ли функция Питона http://www.delphikingdom.com/asp/answer.asp?IDAnswer=37007 ? 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)