-
Ситуация такая
Memo1.Lines.Add('Проверка'); TntMemo1.Lines.Add('Проверка'); ///
если теперь скопировать клавиатурой из Memo1 слово "Проверка" в TntMemo1 либо в другое юникодовое приложение у вас будет "ïðîâåðêà", однако если напечатать хоть одну букву в Memo1, с клавиатуры на русском, затем эту букву можно даже стереть, и скопировать слово "Проверка" в TntMemo1 либо в другое юникодовое приложение у вас будет "Проверка"...
теперь с TntMemo1
если скопировать клавиатурой из TntMemo1 слово "Проверка" в Memo1 у вас будет "????????", однако если напечатать хоть одну букву в TntMemo1, с клавиатуры на русском, затем эту букву можно даже стереть, и скопировать слово "Проверка" в Memo1 у вас будет "Проверка"... помогите пожалуйста, где в этих memo кроится режим после набора в них хоть одной русской буквы они становятся не глючными ???
-
> Zoom (13.04.2010 16:28:00) [0]
Надо работать с приведением к WideString, а не с ANSI
-
режим кроется в буфере обмена и языковой панели windows
-
Буфер обмена в TNT остался ANSI а значит общие правила при копировании из приложения в приложение.
-
>Надо работать с приведением к WideString, а не с ANSI это конечно хорошо, но существует много других приложений которые уже написаны для ANSI их-то всех не перепишешь, а сними приходится иногда иметь дело... тем более проблема не с символами, а с клипбоард, как сказал anonims ! вот посмотрите нашел что-то похожее http://www.delphikingdom.com/asp/viewitem.asp?catalogid=780но оно на memo никак не влияет , лучше подскажите как добраться до буфера обмена в самой memo, где он там скрылся ?
-
> как добраться до буфера обмена в самой memo, где он там > скрылся ?
В "самой memo" нет своего особого буфера обмена, так что скрываться там нечему.
-
Amoeba_ , тогда буду искать в других местах :)
и так тоже не получается...
var Data: THandle; DataPtr: Pointer; CodePage : longint; begin
CodePage:=$0419; Data:= GlobalAlloc(GMEM_MOVEABLE + GMEM_DDESHARE, 4); try DataPtr := GlobalLock(Data); try Move(CodePage, DataPtr^, 4); SetClipboardData(CF_LOCALE, Data); finally GlobalUnlock(Data); end; except GlobalFree(Data); end;
memo1.PasteFromClipboard;
-
> Zoom (13.04.2010 17:04:04) [4]
Но TntMemo1.Lines.Add('Проверка'); это же Юникод, а не ANSI
-
unit vgClpbrd;
interface
procedure ClipboardCopy(const Text: String);
procedure ClipboardPaste(var Text: String);
implementation
uses Windows, SysUtils, Clipbrd;
procedure ClipboardCopy(const Text: String);
var
Len, wLen: Integer;
hClip: THandle;
pwStr: PWideChar;
begin
with Clipboard do
begin
Open;
try
if (Win32Platform = VER_PLATFORM_WIN32_NT) then
begin
Len := Length(Text) + 1;
wLen := Len shl 1;
hClip := GlobalAlloc(GMEM_MOVEABLE, wLen);
try
pwStr := PWideChar(GlobalLock(hClip));
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, PChar(Text), Len, pwStr, wLen);
GlobalUnlock(hClip);
SetAsHandle(CF_UNICODETEXT, hClip);
except
GlobalFree(hClip);
raise;
end;
end else
SetTextBuf(PChar(Text));
finally
Close;
end;
end;
end;
procedure ClipboardPaste(var Text: String);
var
Len, wLen: Integer;
hClip: THandle;
pwStr: PWideChar;
begin
Text := '';
with Clipboard do
try
Open;
if HasFormat(CF_TEXT) or HasFormat(CF_UNICODETEXT) then
begin
if (Win32Platform = VER_PLATFORM_WIN32_NT) then
begin
hClip := GetAsHandle(CF_UNICODETEXT);
wlen := GlobalSize(hClip); pwStr := GlobalLock(hClip);
try
Len := (wLen div 2) - 1;
SetLength(Text, Len);
WideCharToMultiByte(CP_ACP, 0, pwStr, wlen, PChar(Text), Len, nil, nil);
finally
GlobalUnlock(hClip);
end;
end else begin hClip := GetAsHandle(CF_TEXT);
Len := GlobalSize(hClip);
SetLength(Text, Len);
SetLength(Text, GetTextBuf(PChar(Text), Len));
end;
end;
finally
Close;
end;
end;
end.
-
>Но TntMemo1.Lines.Add('Проверка'); это же Юникод, а не ANSI
правильно слово 'Проверка' написанное в ANSI нормально конвертируется в юникод
TntMemo1.Lines.Add('Проверка'); Tntmemo1.Lines.SaveToFile('tntmemo.txt');
в файле tntmemo.txt 'Проверка' будет в юникоде а не в ANSI но речь то совсем не об этом, а о том как установить локаль $0419 для клипборда !
-
-
Игорь Шевченко, спасибо но это немного не то... там речь о том как переконвертировать уже "испорченные данные"... дело немного прояснилось, текст начинает нормально копироваться если включить русский язык, однако закорючки снова появляются если переключится на английский... procedure TForm1.FormCreate(Sender: TObject); begin LoadKeyboardLayout('00000419',KLF_ACTIVATE); end; этот пример правильный: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=780только он не работает толи на xp ru, толи на d7. толи вообще не работает :( > 14-08-2007 08:10 > Не работает, пробовал делать как написано и руками подменять > в FormCreate не помогает! > (WinXP SP2 RUS + Delphi7). А хотелось бы, т.к. проблема > не в том как просто сунуть строку в буфер, а в том что надо > перекрывать стандартную обработку событий для всех контролов. >
-
Пример из [8] пробовал?
-
Германн,
Пример из [8] пробовал? что такое [8] ??
/// пришел тоже к выводу, как советуют люди, что нужно как-то перехватить Ctrl+C, Ctrl+Insert, и контекстное меню правой кнопки мышки "Копировать"
Procedure TextInRussian(AText: WideString); var Clp: TClipboard; LKL: array [0..1023] of char; begin GetKeyboardLayoutName(LKL); // запоминаем какая была раскладка LoadKeyboardLayout('00000419',KLF_ACTIVATE); // переключаем на русский Clp := TClipboard.Create; Clp.AsText := AText; Clp.Free; LoadKeyboardLayout(LKL,KLF_ACTIVATE); // возвращаемся к запомненному end ;
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Shift = [ssCtrl]) and (Key = ord('С')) then TextInRussian(memo1.selText); end;
но Ctrl+С тоже почему-то не перехватывается любая другая клавиша работает...
-
> Zoom © (14.04.10 01:11) [13] > > Германн, > > Пример из [8] пробовал? что такое [8] ?? >
Попробуй разобраться в этом примере. А перехват > Ctrl+C, Ctrl+Insert, и контекстное меню правой кнопки мышки > "Копировать"
с программной установкой русской локали и последующим возвращением к первоначальной локали это костыли. Или переходи на последние версии Дельфи. Они вроде поддерживают Юникод.
-
Где то уже было это... Смутно помню про реестр и замену 1251 \ 1252 на 1250.. Яндекс помнит точнее)
-
> HF-Trade (14.04.2010 08:45:15) [15]
Вот еще один диверсант появился и долго ждать не пришлось
-
что-то терзают меня смутные сомнения, что TFont.Charset зачем то нужен... еще большие сомнения, что для этого... но вдруг?
-
Германн, а кто сказал d7 не юникодовая ??? ведь она прекрасно работает WideChar, и WideString....
> переходи на последние версии Дельфи
:) нет уж спасибо...
а ты точно знаешь что последняя юникодовая версия будет копировать клипбоард иначе чем это происходит с tnt компонентами в D7 ? а именно в D7 и tnt при включенной русской раскладке, символы конвертируются в анси согласно 419 локали, а когда включены нерусские буквы копируются юникод символы... а вот тут уже меня терзают смутные сомнения стоит ли затевать такую бодягу... такой вопрос так просто с кондачка не решается :) копирует в RU и то хорошо... может что со временем придумается...
-
> Zoom © (15.04.10 23:43) [18] > > Германн, а кто сказал d7 не юникодовая ???
Хм. Даже не найду что так сразу ответить. Ну Борланд сказал. И его наследники подтвердили.
> ведь она прекрасно работает WideChar, и WideString
Т.е. строка в Мемо (TMemo.Lines[]) имеет тип WideString? Не путай возможность и встроенную реализацию. Возможность показана в [8]. Она реализована через функции WinAPI, которые естеcтвенно появились в Windows после принятия Юникода. Встроенная в VCL реализация декларирована в Д2010.
> :) нет уж спасибо...
Ну тогда ССЗБ.
> а ты точно знаешь что последняя юникодовая версия будет > копировать клипбоард иначе чем это происходит с tnt компонентами > в D7 ?
Нет не знаю, т.е. сам не проверял. Но думаю что да. Поскольку копироваться будет именно строка в юникоде. Тем более что судя по сабжу проблема не в tnt контролле.
-
> Германн © (16.04.10 02:00) [19] > > > > Zoom © (15.04.10 23:43) [18] > > > > Германн, а кто сказал d7 не юникодовая ??? > > Хм. Даже не найду что так сразу ответить. Ну Борланд сказал. > И его наследники подтвердили.
VCL - это не вся делфи ;-)
-
согласен с вами отчасти :)
во-первых дайте четкую спецификацию юникод приложения:
1) текст исходника pas будет поддерживать юникод ? 2) все стринги в exe будут иметь двойную длину ? 3) названия функций можно будет писать на любом языке ? 4) названия импортируемых dll , тоже будут иметь юникод имина и их тоже можно называть по-русски, или любом другом языке мира...
вопрос в том, нужно ли все это ?
если нужны функции для работы с файловой системой пожалуйста они есть в tnt компонентах WideFindFirst, WideFindNext , WideExtractFileExt, WideRenameFile... и.т.д.
куда еще можно применить юникод у меня фантазия закончилась... база данных... меню... кнопочки... все это уже есть в tnt....
-
вот лишь одно из последствий 'губительной' для оперативной памяти юниконизации arialuni.ttf = 23,274,572 байт, и то там не все символы :) бедное GUI от такой порции символов, может случится несварение:) и теперь что нужен целый sql сервер для работы со шрифтами :) одно радует японский и китайский не имеют разных шрифтов :)
-
Юникод это не для тебя.
-
Anatoly Podgoretsky
ок, как раз надо будет подчистить все ненужные шрифты глядишь и винда ускорится в раза 2 - 3 :) а еслиб еще ttf контейнер расковырять можно прямо в пакетном режиме удалять все ненужные символы :) тогда еще получим уйму ускорения :)
-
Удалено модератором Примечание: У нас есть форум "Прочее" и никто не запрещает там задать свой вопрос.
-
Tnt library
|