Конференция "Основная" » Загадка с Memo и TntMemo [D7, WinXP]
 
  • Zoom © (13.04.10 16:28) [0]
    Ситуация такая

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

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

    теперь с TntMemo1

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

    помогите пожалуйста, где в этих memo кроится режим после набора в них хоть одной русской буквы они становятся не глючными ???
  • Anatoly Podgoretsky © (13.04.10 16:33) [1]
    > Zoom  (13.04.2010 16:28:00)  [0]

    Надо работать с приведением к WideString, а не с ANSI
  • anonims (13.04.10 16:39) [2]
    режим кроется в буфере обмена и языковой панели windows
  • Anatoly Podgoretsky © (13.04.10 16:40) [3]
    Буфер обмена в TNT остался ANSI а значит общие правила при копировании из приложения в приложение.
  • Zoom © (13.04.10 17:04) [4]
    >Надо работать с приведением к WideString, а не с ANSI
    это конечно хорошо, но существует много других приложений которые уже написаны для ANSI их-то всех не перепишешь, а сними приходится иногда иметь дело...

    тем более проблема не с символами, а с клипбоард, как сказал anonims !

    вот посмотрите нашел что-то похожее
    http://www.delphikingdom.com/asp/viewitem.asp?catalogid=780
    но оно на memo никак не влияет , лучше подскажите как добраться до буфера обмена в самой memo, где он там скрылся ?
  • Amoeba_ (13.04.10 17:33) [5]

    > как добраться до буфера обмена в самой memo, где он там
    > скрылся ?

    В "самой memo" нет своего особого буфера обмена, так что скрываться там нечему.
  • Zoom © (13.04.10 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 © (13.04.10 18:41) [7]
    > Zoom  (13.04.2010 17:04:04)  [4]

    Но TntMemo1.Lines.Add('Проверка'); это же Юникод, а не ANSI
  • Anatoly Podgoretsky © (13.04.10 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 © (14.04.10 00:06) [9]
    >Но TntMemo1.Lines.Add('Проверка'); это же Юникод, а не ANSI

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

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

    в файле tntmemo.txt 'Проверка' будет в юникоде а не в ANSI
    но речь то совсем не об этом, а о том как установить локаль $0419 для клипборда !
  • Игорь Шевченко © (14.04.10 00:22) [10]

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


    http://www.delphikingdom.com/asp/answer.asp?IDAnswer=37007
  • Zoom © (14.04.10 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). А хотелось бы, т.к. проблема
    > не в том как просто сунуть строку в буфер, а в том что надо
    > перекрывать стандартную обработку событий для всех контролов.
    >
  • Германн © (14.04.10 00:52) [12]
    Пример из [8] пробовал?
  • Zoom © (14.04.10 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+С тоже почему-то не перехватывается любая другая клавиша работает...
  • Германн © (14.04.10 01:46) [14]

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

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

    с программной установкой русской локали и последующим возвращением к первоначальной локали это костыли.
    Или переходи на последние версии Дельфи. Они вроде поддерживают Юникод.
  • HF-Trade © (14.04.10 08:45) [15]
    Где то уже было это...
    Смутно помню про реестр и замену 1251 \ 1252 на 1250..
    Яндекс помнит точнее)
  • Anatoly Podgoretsky © (14.04.10 09:04) [16]
    > HF-Trade  (14.04.2010 08:45:15)  [15]

    Вот еще один диверсант появился и долго ждать не пришлось
  • han_malign (14.04.10 15:07) [17]
    что-то терзают меня смутные сомнения, что TFont.Charset зачем то нужен... еще большие сомнения, что для этого... но вдруг?
  • Zoom © (15.04.10 23:43) [18]
    Германн, а кто сказал d7 не юникодовая ???
    ведь она прекрасно работает WideChar, и WideString....


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

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

    а ты точно знаешь что последняя юникодовая версия будет копировать клипбоард иначе чем это происходит с tnt компонентами в D7 ?
    а именно в D7 и tnt при включенной русской раскладке, символы конвертируются в анси согласно 419 локали, а когда включены нерусские буквы копируются юникод символы...  а вот тут уже меня терзают смутные сомнения стоит ли затевать такую бодягу... такой вопрос так просто с кондачка не решается :) копирует в RU и то хорошо... может что со временем придумается...
  • Германн © (16.04.10 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 контролле.
  • Плохиш © (16.04.10 11:35) [20]

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

    VCL - это не вся делфи ;-)
  • Zoom © (17.04.10 16:14) [21]
    согласен с вами отчасти :)

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

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

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

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

    куда еще можно применить юникод у меня фантазия закончилась...
    база данных... меню... кнопочки... все это уже есть в tnt....
  • Zoom © (17.04.10 16:36) [22]
    вот лишь одно из последствий 'губительной' для оперативной памяти юниконизации arialuni.ttf = 23,274,572 байт, и то там не все символы :)
    бедное GUI от такой порции символов, может случится несварение:)
    и теперь что нужен целый sql сервер для работы со шрифтами :)
    одно радует японский и китайский не имеют разных шрифтов  :)
  • Anatoly Podgoretsky © (17.04.10 17:03) [23]
    Юникод это не для тебя.
  • Zoom © (17.04.10 23:53) [24]
    Anatoly Podgoretsky

    ок, как раз надо будет подчистить все ненужные шрифты глядишь и винда ускорится в раза 2 - 3 :) а еслиб еще ttf контейнер расковырять можно прямо в пакетном режиме удалять все ненужные символы :) тогда еще получим уйму ускорения :)
  • Дмитрий (19.05.10 09:26) [25]
    Удалено модератором
    Примечание: У нас есть форум "Прочее" и никто не запрещает там задать свой вопрос.
  • Плохиш © (19.05.10 11:02) [26]
    Tnt library
 
Конференция "Основная" » Загадка с Memo и TntMemo [D7, WinXP]
Есть новые Нет новых   [119105   +99][b:0][p:0.003]