Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
2-1312809401
Onyx2012
2011-08-08 17:16
2011.11.27
Drag&Drop в Express Quantum Grid


15-1312316995
Юрий
2011-08-03 00:29
2011.11.27
С днем рождения ! 3 августа 2011 среда


2-1312311743
Aleks1995
2011-08-02 23:02
2011.11.27
Компиляция проги для Виндовс 7


15-1312562196
NailMan
2011-08-05 20:36
2011.11.27
Как я стал мультитриллионером


15-1312191507
Dennis I. Komarov
2011-08-01 13:38
2011.11.27
Воздушные шарики





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский