Форум: "Основная";
Текущий архив: 2011.11.27;
Скачать: [xml.tar.bz2];
ВнизЗагадка с Memo и TntMemo Найти похожие ветки
← →
Zoom © (2010-04-13 16:28) [0]Ситуация такая
Memo1.Lines.Add("Проверка");
TntMemo1.Lines.Add("Проверка");
///
если теперь скопировать клавиатурой из Memo1 слово "Проверка" в TntMemo1 либо в другое юникодовое приложение у вас будет "ïðîâåðêà", однако если напечатать хоть одну букву в Memo1, с клавиатуры на русском, затем эту букву можно даже стереть, и скопировать слово "Проверка" в TntMemo1 либо в другое юникодовое приложение у вас будет "Проверка"...
теперь с TntMemo1
если скопировать клавиатурой из TntMemo1 слово "Проверка" в Memo1 у вас будет "????????", однако если напечатать хоть одну букву в TntMemo1, с клавиатуры на русском, затем эту букву можно даже стереть, и скопировать слово "Проверка" в Memo1 у вас будет "Проверка"...
помогите пожалуйста, где в этих memo кроится режим после набора в них хоть одной русской буквы они становятся не глючными ???
← →
Anatoly Podgoretsky © (2010-04-13 16:33) [1]> Zoom (13.04.2010 16:28:00) [0]
Надо работать с приведением к WideString, а не с ANSI
← →
anonims (2010-04-13 16:39) [2]режим кроется в буфере обмена и языковой панели windows
← →
Anatoly Podgoretsky © (2010-04-13 16:40) [3]Буфер обмена в TNT остался ANSI а значит общие правила при копировании из приложения в приложение.
← →
Zoom © (2010-04-13 17:04) [4]>Надо работать с приведением к WideString, а не с ANSI
это конечно хорошо, но существует много других приложений которые уже написаны для ANSI их-то всех не перепишешь, а сними приходится иногда иметь дело...
тем более проблема не с символами, а с клипбоард, как сказал anonims !
вот посмотрите нашел что-то похожее
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=780
но оно на memo никак не влияет , лучше подскажите как добраться до буфера обмена в самой memo, где он там скрылся ?
← →
Amoeba_ (2010-04-13 17:33) [5]
> как добраться до буфера обмена в самой memo, где он там
> скрылся ?
В "самой memo" нет своего особого буфера обмена, так что скрываться там нечему.
← →
Zoom © (2010-04-13 18:36) [6]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;
← →
Anatoly Podgoretsky © (2010-04-13 18:41) [7]> Zoom (13.04.2010 17:04:04) [4]
Но TntMemo1.Lines.Add("Проверка"); это же Юникод, а не ANSI
← →
Anatoly Podgoretsky © (2010-04-13 18:45) [8]
{*******************************************************}
{ }
{ Vladimir Gaitanoff Delphi VCL Library }
{ Clipboard utility routines }
{ }
{ Copyright (c) 1997, 2000 }
{ }
{*******************************************************}
{$I VG.INC }
{$D-,L-}
unit vgClpbrd;
interface
procedure ClipboardCopy(const Text: String);
procedure ClipboardPaste(var Text: String);
{ Clipboard operations with Windows NT unicode support }
{ Originally by Alex Konshin }
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); // lstrlen and StrLen doesn"t work
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 // Win95
hClip := GetAsHandle(CF_TEXT);
Len := GlobalSize(hClip);
SetLength(Text, Len);
SetLength(Text, GetTextBuf(PChar(Text), Len));
end;
end;
finally
Close;
end;
end;
end.
← →
Zoom © (2010-04-14 00:06) [9]>Но TntMemo1.Lines.Add("Проверка"); это же Юникод, а не ANSI
правильно слово "Проверка" написанное в ANSI нормально конвертируется в юникод
TntMemo1.Lines.Add("Проверка");
Tntmemo1.Lines.SaveToFile("tntmemo.txt");
в файле tntmemo.txt "Проверка" будет в юникоде а не в ANSI
но речь то совсем не об этом, а о том как установить локаль $0419 для клипборда !
← →
Игорь Шевченко © (2010-04-14 00:22) [10]
> а о том как установить локаль $0419 для клипборда !
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=37007
← →
Zoom © (2010-04-14 00:47) [11]Игорь Шевченко, спасибо но это немного не то...
там речь о том как переконвертировать уже "испорченные данные"...
дело немного прояснилось, текст начинает нормально копироваться если включить русский язык, однако закорючки снова появляются если переключится на английский...
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). А хотелось бы, т.к. проблема
> не в том как просто сунуть строку в буфер, а в том что надо
> перекрывать стандартную обработку событий для всех контролов.
>
← →
Германн © (2010-04-14 00:52) [12]Пример из [8] пробовал?
← →
Zoom © (2010-04-14 01:11) [13]Германн,
Пример из [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+С тоже почему-то не перехватывается любая другая клавиша работает...
← →
Германн © (2010-04-14 01:46) [14]
> Zoom © (14.04.10 01:11) [13]
>
> Германн,
>
> Пример из [8] пробовал? что такое [8] ??
>
Попробуй разобраться в этом примере.
А перехват
> Ctrl+C, Ctrl+Insert, и контекстное меню правой кнопки мышки
> "Копировать"
с программной установкой русской локали и последующим возвращением к первоначальной локали это костыли.
Или переходи на последние версии Дельфи. Они вроде поддерживают Юникод.
← →
HF-Trade © (2010-04-14 08:45) [15]Где то уже было это...
Смутно помню про реестр и замену 1251 \ 1252 на 1250..
Яндекс помнит точнее)
← →
Anatoly Podgoretsky © (2010-04-14 09:04) [16]> HF-Trade (14.04.2010 08:45:15) [15]
Вот еще один диверсант появился и долго ждать не пришлось
← →
han_malign (2010-04-14 15:07) [17]что-то терзают меня смутные сомнения, что TFont.Charset зачем то нужен... еще большие сомнения, что для этого... но вдруг?
← →
Zoom © (2010-04-15 23:43) [18]Германн, а кто сказал d7 не юникодовая ???
ведь она прекрасно работает WideChar, и WideString....
> переходи на последние версии Дельфи
:) нет уж спасибо...
а ты точно знаешь что последняя юникодовая версия будет копировать клипбоард иначе чем это происходит с tnt компонентами в D7 ?
а именно в D7 и tnt при включенной русской раскладке, символы конвертируются в анси согласно 419 локали, а когда включены нерусские буквы копируются юникод символы... а вот тут уже меня терзают смутные сомнения стоит ли затевать такую бодягу... такой вопрос так просто с кондачка не решается :) копирует в RU и то хорошо... может что со временем придумается...
← →
Германн © (2010-04-16 02:00) [19]
> Zoom © (15.04.10 23:43) [18]
>
> Германн, а кто сказал d7 не юникодовая ???
Хм. Даже не найду что так сразу ответить. Ну Борланд сказал. И его наследники подтвердили.
> ведь она прекрасно работает WideChar, и WideString
Т.е. строка в Мемо (TMemo.Lines[]) имеет тип WideString?
Не путай возможность и встроенную реализацию. Возможность показана в [8]. Она реализована через функции WinAPI, которые естеcтвенно появились в Windows после принятия Юникода. Встроенная в VCL реализация декларирована в Д2010.
> :) нет уж спасибо...
Ну тогда ССЗБ.
> а ты точно знаешь что последняя юникодовая версия будет
> копировать клипбоард иначе чем это происходит с tnt компонентами
> в D7 ?
Нет не знаю, т.е. сам не проверял. Но думаю что да. Поскольку копироваться будет именно строка в юникоде. Тем более что судя по сабжу проблема не в tnt контролле.
← →
Плохиш © (2010-04-16 11:35) [20]
> Германн © (16.04.10 02:00) [19]
>
>
> > Zoom © (15.04.10 23:43) [18]
> >
> > Германн, а кто сказал d7 не юникодовая ???
>
> Хм. Даже не найду что так сразу ответить. Ну Борланд сказал.
> И его наследники подтвердили.
VCL - это не вся делфи ;-)
← →
Zoom © (2010-04-17 16:14) [21]согласен с вами отчасти :)
во-первых дайте четкую спецификацию юникод приложения:
1) текст исходника pas будет поддерживать юникод ?
2) все стринги в exe будут иметь двойную длину ?
3) названия функций можно будет писать на любом языке ?
4) названия импортируемых dll , тоже будут иметь юникод имина и их тоже можно называть по-русски, или любом другом языке мира...
вопрос в том, нужно ли все это ?
если нужны функции для работы с файловой системой пожалуйста они есть в tnt компонентах WideFindFirst, WideFindNext , WideExtractFileExt, WideRenameFile... и.т.д.
куда еще можно применить юникод у меня фантазия закончилась...
база данных... меню... кнопочки... все это уже есть в tnt....
← →
Zoom © (2010-04-17 16:36) [22]вот лишь одно из последствий "губительной" для оперативной памяти юниконизации arialuni.ttf = 23,274,572 байт, и то там не все символы :)
бедное GUI от такой порции символов, может случится несварение:)
и теперь что нужен целый sql сервер для работы со шрифтами :)
одно радует японский и китайский не имеют разных шрифтов :)
← →
Anatoly Podgoretsky © (2010-04-17 17:03) [23]Юникод это не для тебя.
← →
Zoom © (2010-04-17 23:53) [24]Anatoly Podgoretsky
ок, как раз надо будет подчистить все ненужные шрифты глядишь и винда ускорится в раза 2 - 3 :) а еслиб еще ttf контейнер расковырять можно прямо в пакетном режиме удалять все ненужные символы :) тогда еще получим уйму ускорения :)
← →
Дмитрий (2010-05-19 09:26) [25]Удалено модератором
Примечание: У нас есть форум "Прочее" и никто не запрещает там задать свой вопрос.
← →
Плохиш © (2010-05-19 11:02) [26]Tnt library
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2011.11.27;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.004 c