Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.11.27;
Скачать: CL | DM;

Вниз

Загадка с 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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.012 c
2-1312311743
Aleks1995
2011-08-02 23:02
2011.11.27
Компиляция проги для Виндовс 7


15-1312261329
oldman
2011-08-02 09:02
2011.11.27
Вычисление значения функции разложением в ряд с точностью N


15-1312355735
OW
2011-08-03 11:15
2011.11.27
Ошибка Oracle Forms


2-1312652888
Gu
2011-08-06 21:48
2011.11.27
Динамический массив


2-1312809401
Onyx2012
2011-08-08 17:16
2011.11.27
Drag&Drop в Express Quantum Grid