Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Загадка с Memo и TntMemo [D7, WinXP]


Страницы:   1 2

Zoom ©   (2010-04-13 16:28:00) 

Ситуация такая

Memo1.Lines.Add('Проверка');
TntMemo1.Lines.Add('Проверка');
///

если теперь скопировать клавиатурой из Memo1 слово "Проверка" в TntMemo1 либо в другое юникодовое приложение у вас будет "ïðîâåðêà", однако если напечатать хоть одну букву в Memo1, с клавиатуры на русском, затем эту букву можно даже стереть, и скопировать слово "Проверка" в TntMemo1 либо в другое юникодовое приложение у вас будет "Проверка"...

теперь с TntMemo1

если скопировать клавиатурой из TntMemo1 слово "Проверка" в Memo1 у вас будет "????????", однако если напечатать хоть одну букву в TntMemo1, с клавиатуры на русском, затем эту букву можно даже стереть, и скопировать слово "Проверка" в Memo1 у вас будет "Проверка"...

помогите пожалуйста, где в этих memo кроится режим после набора в них хоть одной русской буквы они становятся не глючными ???


Плохиш   (2010-05-19 11:02:00) [1]

Tnt library


Дмитрий   (2010-05-19 09:26:00) [2]

Удалено модератором
Примечание: У нас есть форум "Прочее" и никто не запрещает там задать свой вопрос.


Zoom   (2010-04-17 23:53:00) [3]

Anatoly Podgoretsky

ок, как раз надо будет подчистить все ненужные шрифты глядишь и винда ускорится в раза 2 - 3 :) а еслиб еще ttf контейнер расковырять можно прямо в пакетном режиме удалять все ненужные символы :) тогда еще получим уйму ускорения :)


Anatoly Podgoretsky   (2010-04-17 17:03:00) [4]

Юникод это не для тебя.


Zoom   (2010-04-17 16:36:00) [5]

вот лишь одно из последствий 'губительной' для оперативной памяти юниконизации arialuni.ttf = 23,274,572 байт, и то там не все символы :)
бедное GUI от такой порции символов, может случится несварение:)
и теперь что нужен целый sql сервер для работы со шрифтами :)
одно радует японский и китайский не имеют разных шрифтов  :)


Zoom   (2010-04-17 16:14:00) [6]

согласен с вами отчасти :)

во-первых дайте четкую спецификацию юникод приложения:

1) текст исходника pas будет поддерживать юникод ?
2) все стринги в exe будут иметь двойную длину ?
3) названия функций можно будет писать на любом языке ?
4) названия импортируемых dll , тоже будут иметь юникод имина и их тоже можно называть по-русски, или любом другом языке мира...

вопрос в том, нужно ли все это ?

если нужны функции для работы с файловой системой пожалуйста они есть в tnt компонентах WideFindFirst, WideFindNext , WideExtractFileExt, WideRenameFile... и.т.д.

куда еще можно применить юникод у меня фантазия закончилась...
база данных... меню... кнопочки... все это уже есть в tnt....


Плохиш   (2010-04-16 11:35:00) [7]


> Германн ©   (16.04.10 02:00) [19]
>
>
> > Zoom ©   (15.04.10 23:43) [18]
> >
> > Германн, а кто сказал d7 не юникодовая ???
>
> Хм. Даже не найду что так сразу ответить. Ну Борланд сказал.
>  И его наследники подтвердили.

VCL - это не вся делфи ;-)


Германн   (2010-04-16 02:00:00) [8]


> Zoom ©   (15.04.10 23:43) [18]
>
> Германн, а кто сказал d7 не юникодовая ???

Хм. Даже не найду что так сразу ответить. Ну Борланд сказал. И его наследники подтвердили.


> ведь она прекрасно работает WideChar, и WideString

Т.е. строка в Мемо (TMemo.Lines[]) имеет тип WideString?
Не путай возможность и встроенную реализацию. Возможность показана в [8]. Она реализована через функции WinAPI, которые естеcтвенно появились в Windows после принятия Юникода. Встроенная в VCL реализация декларирована в Д2010.


> :) нет уж спасибо...

Ну тогда ССЗБ.


> а ты точно знаешь что последняя юникодовая версия будет
> копировать клипбоард иначе чем это происходит с tnt компонентами
> в D7 ?

Нет не знаю, т.е. сам не проверял. Но думаю что да. Поскольку копироваться будет именно строка в юникоде. Тем более что судя по сабжу проблема не в tnt контролле.


Zoom   (2010-04-15 23:43:00) [9]

Германн, а кто сказал d7 не юникодовая ???
ведь она прекрасно работает WideChar, и WideString....


>  переходи на последние версии Дельфи

:) нет уж спасибо...

а ты точно знаешь что последняя юникодовая версия будет копировать клипбоард иначе чем это происходит с tnt компонентами в D7 ?
а именно в D7 и tnt при включенной русской раскладке, символы конвертируются в анси согласно 419 локали, а когда включены нерусские буквы копируются юникод символы...  а вот тут уже меня терзают смутные сомнения стоит ли затевать такую бодягу... такой вопрос так просто с кондачка не решается :) копирует в RU и то хорошо... может что со временем придумается...


han_malign   (2010-04-14 15:07:00) [10]

что-то терзают меня смутные сомнения, что TFont.Charset зачем то нужен... еще большие сомнения, что для этого... но вдруг?


Anatoly Podgoretsky   (2010-04-14 09:04:00) [11]

> HF-Trade  (14.04.2010 08:45:15)  [15]

Вот еще один диверсант появился и долго ждать не пришлось


HF-Trade   (2010-04-14 08:45:00) [12]

Где то уже было это...
Смутно помню про реестр и замену 1251 \ 1252 на 1250..
Яндекс помнит точнее)


Германн   (2010-04-14 01:46:00) [13]


> Zoom ©   (14.04.10 01:11) [13]
>
> Германн,
>
> Пример из [8] пробовал?  что такое [8] ??
>

Попробуй разобраться в этом примере.
А перехват
> Ctrl+C, Ctrl+Insert, и контекстное меню правой кнопки мышки
> "Копировать"

с программной установкой русской локали и последующим возвращением к первоначальной локали это костыли.
Или переходи на последние версии Дельфи. Они вроде поддерживают Юникод.


Zoom   (2010-04-14 01:11:00) [14]

Германн,

Пример из [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 00:52:00) [15]

Пример из [8] пробовал?


Zoom   (2010-04-14 00:47:00) [16]

Игорь Шевченко, спасибо но это немного не то...
там речь о том как переконвертировать уже "испорченные данные"...  

дело немного прояснилось, текст начинает нормально копироваться если включить русский язык, однако закорючки снова появляются если переключится на английский...

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:22:00) [17]


>  а о том как установить локаль $0419 для клипборда !


http://www.delphikingdom.com/asp/answer.asp?IDAnswer=37007


Zoom   (2010-04-14 00:06:00) [18]

>Но TntMemo1.Lines.Add('Проверка'); это же Юникод, а не ANSI

правильно слово 'Проверка' написанное в ANSI нормально конвертируется в юникод

TntMemo1.Lines.Add('Проверка');
Tntmemo1.Lines.SaveToFile('tntmemo.txt');

в файле tntmemo.txt 'Проверка' будет в юникоде а не в ANSI
но речь то совсем не об этом, а о том как установить локаль $0419 для клипборда !


Anatoly Podgoretsky   (2010-04-13 18:45:00) [19]

{*******************************************************}
{                                                       }
{         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.


Anatoly Podgoretsky   (2010-04-13 18:41:00) [20]

> Zoom  (13.04.2010 17:04:04)  [4]

Но TntMemo1.Lines.Add('Проверка'); это же Юникод, а не ANSI


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо