Вказівка кодування тексту в буфері обміну
Є відомий глюк – якщо копіювати український ANSI текст з однієї програми в буфер обміну та вставити в іншу (наприклад, з TEdit український текст скопіювати та вставити в поле введення на WWW-сторінці в Internet Explorer) – то українські символи перетворюються на кракозябри. Якщо копіювати під час включення української розкладки - то все прибл. А якщо включена англійська - біда: (
Біда пов'язана з тим, що Windows не може розпізнати, якою мовою зберігається текст (приймає його за мову поточної розкладки). І, мабуть, при вставці в контролі unicode відбувається спотворення. Вирішення проблеми, мабуть - це вказівка безпосередньо якою мовою знаходиться текст у буфері обміну.
Є рішення: Але воно криве, у мене не працює. Там таке:
procedure CopyStringToClipboard(const s: string); var Locale: word; begin //Set CF_TEXT & CF_LOCALE CopyDataToClipboard(CF_TEXT, s); Locale := GetSystemDefaultLang > CopyDataToClipboard(CF_LOCALE, Chr(Lo(Locale))+Chr(Hi(Locale)))); end;
procedure CopyDataToClipboard(fmt: word; s: string); var hg: THandle; P: PChar; begin hg:=GlobalAlloc(GMEM_DDESHARE or GMEM_MOVEABLE, Length(S)+1); P:=GlobalLock(hg); StrPCopy(P, s); GlobalUnlock(hg); Clipboard.Open; SetClipboardData(fmt, hg); // fmt = CF_UNICODETEXT CF_OEMTEXT CF_TEXT CF_LOCALE Clipboard.Close; GlobalFree(hg); end;
У мене під час виклику SetClipboardData виходить, що "Неправильний покажчик". А ось Jack128 стверджує, що в нього все гаразд. Не знаю з чим пов'язано: ( Я помістив рядок Clipboard. Open першої:
procedure CopyDataToClipboard(fmt: word; s: string); var hg: THandle; P: PChar; begin Clipboard.Open; //
Начебто запрацювало, все бл. Але потім виявилося, що все ОК тільки за першого копіювання. Якщо цей шматок коду використовуватиме копіювання другого рядка, то вже нічого не копіюється. Взагалі нічого :( Що є в буфері обміну - те й залишається. Причому, SetClipboardData відпрацьовує нормально, повертає не нуль. Нічого не розуміти :(
Відповідно - шукається стабільний, нормальний, перевірений роками спосіб встановити кодування тексту у буфері обміну.
Спробуй http://www.delphimaster.net/view/1-1139210575/ (повідомлення [7]).
ага, дякую - що треба.
Але цікаво все-таки – а як вказати конкретну мову. Наведений спосіб, як я розумію, просто кодує вміст буфера UNICODE у відповідності з налаштуваннями локалі. А якщо локаль англійська, то як вказати, що текст у буфері український? Тільки використовувати UNICODE?