Форум: "Система";
Текущий архив: 2002.11.18;
Скачать: [xml.tar.bz2];
ВнизClipBoard и кодировки Найти похожие ветки
← →
say (2002-09-16 12:15) [0]Подскажите пожалуйста.
копирую из StringList в буфер русский текст и при вставке в Word или любой Виндусовый редактор кодировка не "совпадает"
Фар - нормально
← →
MBo (2002-09-18 06:33) [1]попробуй перед вставкой в буфер переключать раскладку клавиатуры
← →
igoreha (2002-09-18 10:39) [2]У меня тоже есть такой проблем :-(
С раскладкой клавиатуры тут понятно, работать будет :-)
А вот как скопировать в буфер вне зависимости от раскладки ?
← →
Steven (2002-09-18 10:50) [3]Мы с тобой над одной задачей бьёмся. Я посмотрел хелп про раскладки, чтот очень муторно их перключать. Для 95 свой способ для NT свой.
Хоть к Рошалу обращайся за советом :-)
← →
Севостьянов Игорь (2002-09-18 11:07) [4]Используйте Unicode (WideString)
← →
Zemal (2002-09-18 11:51) [5]Я чего-то не понимаю... причём тут раскладка клавиатуры при копировании в буфер? Что за шаманство такое? Надо во-первых знать в какой кодировке текст, а во вторых знать функции перевода из одной кодировки в другую. Посмотрите в хелпах по Делфи функции преобразования текста из одной кодировки в другую - CharToOEM, OEMToChar. И потом, если строка в Unicode, то там символ уже записывается двумя битами.
Так что бросьте свои шаманские расклады и посмотрите что из себя представляет строка символов в Hex-редакторе. Там вы увидите, что каждуй символ записывается не буквой, а номером в таблице. Так вот, для корректного отображения строки символов где либо, надо сначало выяснить какую кодовую таблицу этот редактор поддерживает, если это типа FAR, то он и OEM 866 (DOS) и ANSII 1256 поддерживает, т.е. может менять таблицу символов сам, не меняя номера. А вот если это виндовая прога, то наверняка она понимает только своё... вот такой вот Билл козёл, но это уже другая история :). Тогда надо взять и переконвертировать, т.е. поменять корректно номера символов, это и делают функции, упомянутые мной ранее. Если возникнут вопросы как они работают, то могу прислать куски своего исходника, в котором я перевожу строки в экземпляре класса TStringList из кодировки DOS866 в кодировку WIN1251. Удачи.
← →
Steven (2002-09-18 12:02) [6]Меня тут умный человек Shaman_Naydak послал:
http://delphibase.endimus.com/?action=viewtopic&topic=sysiface
И я пошёл.
← →
Steven (2002-09-18 12:20) [7]Zemal © (18.09.02 11:51)
Тут дело в том что простой (не уникод) текст распознаётся получателем на своё усмотрение.
Вот принимает он текст в американской кодировке и всё тут. И беда в том что в этой кодироке нет кирилицы.
В предыдущей ссылке процедура конвертит текст в уникод (заметь, мы знаем кодировку, мы и конвертим).
Если есть способ указать (прицепить к буферу) какая именно кодировка используется, то будет выход и для однобайтных строк. А так врядли.
← →
Севостьянов Игорь (2002-09-18 12:35) [8]Изобрази ка как ты копируешь в буфер (можно по разному - минимум 2 способа)
← →
Steven (2002-09-18 12:41) [9]Clipboard.AsText := s; //s: String
← →
Севостьянов Игорь (2002-09-18 12:54) [10]Посмотри еще функции
Clipboard Functions
Following are the functions used with the clipboard.
ChangeClipboardChain
CloseClipboard
CountClipboardFormats
EmptyClipboard
EnumClipboardFormats
GetClipboardData
GetClipboardFormatName
GetClipboardOwner
GetClipboardViewer
GetOpenClipboardWindow
GetPriorityClipboardFormat
IsClipboardFormatAvailable
OpenClipboard
RegisterClipboardFormat
SetClipboardData
SetClipboardViewer
Вот на это обрати внимание
The operating system performs implicit data format conversions between certain clipboard formats when an application calls the GetClipboardData function. For example, if the CF_OEMTEXT format is on the clipboard, a window can retrieve data in the CF_TEXT format. The format on the clipboard is converted to the requested format on demand. The following table shows the clipboard data type conversions that are available. Note that some of these automatic type conversions are not available on all platforms.
Clipboard Format Conversion Format Platform Support
CF_BITMAP CF_DIB Windows NT, Windows 95
CF_DIB CF_BITMAP Windows NT, Windows 95
CF_DIB CF_PALETTE Windows NT, Windows 95
CF_ENHMETAFILE CF_METAFILEPICT Windows NT, Windows 95
CF_METAFILEPICT CF_ENHMETAFILE Windows NT, Windows 95
CF_OEMTEXT CF_TEXT Windows NT, Windows 95
CF_OEMTEXT CF_UNICODETEXT Windows NT
CF_TEXT CF_OEMTEXT Windows NT, Windows 95
CF_TEXT CF_UNICODETEXT Windows NT
CF_UNICODETEXT CF_OEMTEXT Windows NT
CF_UNICODETEXT CF_TEXT Windows NT
If the operating system provides an automatic type conversion for a particular clipboard format, there is no advantage to placing the conversion format(s) on the clipboard.
← →
Steven (2002-09-18 13:12) [11]в последствие я использовал вот это:
procedure PutStringIntoClipBoard(const 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;
Это код дал Shaman_Naydak. В моём случае это оптимальный вариант.
← →
igoreha (2002-09-18 14:57) [12]Ну тут в полном разгаре :-)
Вот и мои пару слов ...
Вылечилось. Вот только просьба проверить владельцев NT4 и 98. В SDK написано что работает, а все-же. Просьба результат сюда ...
А вот и решение:
uses ..., Windows;
...
memError: TMemo;
...
var CurrentHKL: HKL;
begin
// Запомнить текущее значение раскладки
CurrentHKL:= GetKeyboardLayout(0);
// Установить русскую раскладку
ActivateKeyboardLayout($0419, KLF_ACTIVATE);
// Записать в Clipboard
Clipboard.AsText:= memError.Lines.Text;
// Восстановить раскладку
ActivateKeyboardLayout(CurrentHKL, KLF_ACTIVATE);
end;
...
← →
Севостьянов Игорь (2002-09-18 16:38) [13]Продолжим обсуждение...
> Steven © (18.09.02 13:12)
Это хорошо только при варианте, когда ты допустим установил в НапримерMemo1.Font.Charset = RUSSIAN_CHARSET
если же установишь DEFAULT_CHARSET это не сработает
В другом же случае можно для окна делать следующее:
при установленном Memo1.Font.Charset = RUSSIAN_CHARSET
Сделать так
procedure TfrmOpen.btnCopyClick(Sender: TObject);
begin
Memo1.SelectAll;
SendMessage(Memo1.Handle, WM_COPY, 0, 0);
end;
procedure TfrmOpen.btnPasteClick(Sender: TObject);
begin
SendMessage(Memo1.Handle, WM_PASTE, 0, 0);
end;
← →
Севостьянов Игорь (2002-09-18 16:49) [14]Не сработает, если сделать вставку в Memo1
А вот при копировании в Clipboard из Word такого не происходит...
Надо все же придумать более идельный вариант
Я в свое время писал ловушку для переназначения клавиш копирования в Clipboard - так вот у меня не было проблем с кодировками - основа та же WM_COPY, WM_PASTE, но использовал только для текста...хотя по идее должен все хватать - так вот всякие там msword и mspaint переопределяли эти клавиши в свою сторону
← →
igoreha (2002-09-18 18:12) [15]> Севостьянов Игорь © (18.09.02 16:49)
Ежели речь о коде предоставленом Steven то он справедлив для операционок W2k и выше:
MS SDK : CF_UNICODETEXT - Windows NT/2000 or later,
поэтому для 98 и МЕ надо чето другое думать :-(
в коде от Steven сворачивает:
if not IsClipboardFormatAvailable(CF_UNICODETEXT) then
Clipboard.AsText:=Str
а это тот-же путь :-(
> если же установишь DEFAULT_CHARSET это не сработает
На W2k в обоих вариантах все чудненько с любым чарсетом в фонтах.
На 98 проверить не могу ...
У меня с посылкой WM_COPY в контексте приложений написаных на Делфи все клас :-) А к примеру с вордом нет :-(
Какая у тебя ОС ?
← →
Steven (2002-09-19 06:55) [16]Чудится мне, что Font.Charset это не из той области которую мы затронули. Font.Charset определяет формат отображения, а не содержимого.
И вообще, я не указывал ни какого TMemo. Я копировал простой стринг, а создавать для копирования в буфер мемо считаю ещё более изощрённым чем замена раскладки. И вообще подозреваю, что установка не американской раскладки сообщает буферу, что копировать нужно в уникоде. Сомневаюсь что он прикрепляет кодировку.
← →
igoreha (2002-09-19 09:37) [17]Вы писали:
Steven © (19.09.02 06:55)
Да мы и не затрагиваем TMemo и Font.Charset, это как часный случай, вопрос как раз и состоит в том, чтоб скопировать строку правильно в буфер. Приведенный вами код от Shaman_Naydak с W2k работает чудненько а с W98 ? Придется его родимого ставить и смотреть чего у него там получается :-(
← →
Карелин Артем (2002-09-19 13:54) [18]http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1030716227&n=5
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2002.11.18;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.169 c