-
Здравствуйте!
Проблема в появлении «абрыкадабры» при копировании и вставки русского текста в/из буфера обмена. У меня есть два варианта занесения данных в буфер
Вариант 1
[code]
….
sStr:='';
{}
For i:=t to b do Begin
frmmain.DataSource1.Edit;
If i<>t then sstr:=sstr+Chr(13);
For j:=l to r do Begin
sstr:=sstr+ frmmain.DataSource1.DataSet.FieldByName('Col'+INttostr([j]).AsString;
If j<>r then sstr:=sstr+Chr(9);
End;
If i<>b then frmmain.DataSource1.DataSet.Next;
End ;
Clipboard.Clear;
Clipboard.AsText:=sstr;
End;
procedure TFrmMain.Button1Click(Sender: TObject);
begin
ShowMessage(Clipboard.asText);
end;
[/code]
В этом случае при нажатии на кнопку messageBox содержит нормальные данные, и следовательно после вставки данных внутри программы с кодировкой все будет ОК, но при вставке во внешнюю оболочку, например, Excel возникает абракадабра «Ïîðó÷åíèå 3 Ïîðó÷åíèå 4 Ïîðó÷åíèå 5».
Вариант 2
[code]
{Первая процедура та же самая за исключением последней строки:}
….
SetClipboardText(sstr);
End;
procedure SetClipboardText(const AText: String);
const
CODEPAGE = 1251;
var len, ulen : Integer;
hClip : THandle;
pClip : Pointer;
begin
if Win32Platform=VER_PLATFORM_WIN32_NT then
begin
len := Length(AText)+1;
ulen := len+len;
hClip := GlobalAlloc(GMEM_MOVEABLE,ulen);
if hClip=0 then raise Exception.Create(SysErrorMessage(GetLastError))
else
try
pClip := PWideChar(GlobalLock(hClip));
if pClip=nil then raise Exception.Create(SysErrorMessage(GetLastError))
else
begin
try
MultiByteToWideChar(CODEPAGE,0,PChar(AText),len,pClip,ulen);
finally
GlobalUnlock(hClip);
end;
Clipboard.SetAsHandle(CF_UNICODETEXT,hClip);
end;
except
GlobalFree(hClip);
raise;
end;
end
else
begin
Clipboard.SetTextBuf(PChar(AText));
SetClipboardData(CF_LOCALE,LANG_RUSSIAN);
end;
end;
[/code]
В этом случае данные вставляются во внешнее приложение без проблем, но внутри программы при попытке вставить возникает «абракадабра». По аналогии с первым вариантом но наоборот!
Вопрос: как сделать чтобы все время данные вставлялись «нормально»????
-
переходи на "юникод версию дельфи"
-
> Вариант 2
при копировании следи чтобы текущая локаль была русская.
-
Никогда такого не делал!
Поясните пож-ста как реализовать?
-
1 ставишь версию delphi 2009 и больше
2 перед копированием смотришь на "языковую панель" и сравниваешь буквы там с RU. оно? сделал!
-
offtop, но жутко интересно:
вот это frmmain.DataSource1.Edit вообще для?
-
> вообще для?
повод нажать F1
-
>sniknik © (28.02.12 09:26) [6]
правда-честно не догоняю
грусть и печаль
-
> Кщд (28.02.12 14:18) [7]
Наверное просто лишний кусок кода, так как редактирования данных в указанном фрагменте кода отсутствует.
-
попробуй "прикрутить" utf-8 (или что-то ещё)
посмотри как выглядит текст в sourse, как должен выглядеть в dest и сделай функцию преобразования
для этого надо иметь два файла 1-в кодировке sourse, 2-ой в кодировке dest
потом смотриш файлы побайтно, и медленно втыкаешь логику перевода..)
-
>Сергей (25.09.13 15:03) [9]
дорогой Сергей!
как прекрасно, что Вы именно сейчас, спустя семь месяцев после вопроса, решили дать свой "чумовой" совет
автор Вам, безусловно, благодарен
-
> [10] Кщд (25.09.13 16:32)
> спустя семь месяцев
Если бы семь.
-
>Inovet © (25.09.13 17:44) [11]
оу, год и семь!
true-некрофил
-
А что , автор уже умер?)))
-
или больше никому не понадобится?
false децибел
-
>Сергей (27.09.13 09:57) [14]
ответ дал sniknik
вовремя и правильно