Конференция "Базы" » «Абракадабра» после копирования данных из TdbGrid через Dataset!! [D7, WinXP]
 
  • fffds (27.02.12 15:56) [0]
    Здравствуйте!
    Проблема в появлении «абрыкадабры»  при копировании и вставки русского текста в/из буфера обмена. У меня есть  два варианта занесения данных в буфер

    Вариант 1
    [code]
    ….
      sStr:='';
    {}
     For i:=t to b do Begin
        frmmain.DataSource1.Edit;
        If i<>t then sstr:=sstr+Chr(13);
        For j:=l to r  do Begin
         sstr:=sstr+ frmmain.DataSource1.DataSet.FieldByName('Col'+INttostr([j]).AsString;
         If j<>r then sstr:=sstr+Chr(9);
        End;
       If i<>b then frmmain.DataSource1.DataSet.Next;
     End ;
    Clipboard.Clear;
    Clipboard.AsText:=sstr;
    End;

    procedure TFrmMain.Button1Click(Sender: TObject);
    begin
     ShowMessage(Clipboard.asText);
    end;
    [/code]

    В этом случае при нажатии на кнопку messageBox содержит  нормальные данные, и следовательно после вставки данных внутри программы с кодировкой все будет ОК, но при  вставке во внешнюю оболочку, например, Excel возникает абракадабра «Ïîðó÷åíèå 3 Ïîðó÷åíèå 4 Ïîðó÷åíèå 5».

    Вариант 2
    [code]
    {Первая процедура та же самая за исключением последней строки:}
    ….
    SetClipboardText(sstr);  
    End;

    procedure SetClipboardText(const AText: String);
     const
    CODEPAGE = 1251;
    var len, ulen : Integer;
      hClip : THandle;
      pClip : Pointer;
    begin
    if Win32Platform=VER_PLATFORM_WIN32_NT then
      begin
        len := Length(AText)+1;
        ulen := len+len;
        hClip := GlobalAlloc(GMEM_MOVEABLE,ulen);
        if hClip=0 then raise Exception.Create(SysErrorMessage(GetLastError))
        else
          try
            pClip := PWideChar(GlobalLock(hClip));
            if pClip=nil then raise Exception.Create(SysErrorMessage(GetLastError))
            else
              begin
                try
                  MultiByteToWideChar(CODEPAGE,0,PChar(AText),len,pClip,ulen);
                finally
                  GlobalUnlock(hClip);
                end;
                Clipboard.SetAsHandle(CF_UNICODETEXT,hClip);
              end;
          except
            GlobalFree(hClip);
            raise;
          end;
      end
    else
      begin
        Clipboard.SetTextBuf(PChar(AText));
        SetClipboardData(CF_LOCALE,LANG_RUSSIAN);
           end;
    end;
    [/code]

    В этом случае данные вставляются во внешнее приложение без проблем, но внутри программы при попытке вставить возникает «абракадабра». По аналогии с первым  вариантом но наоборот!

    Вопрос: как сделать чтобы все время данные вставлялись «нормально»????
  • sniknik © (27.02.12 16:40) [1]
    переходи на "юникод версию дельфи"
  • sniknik © (27.02.12 16:41) [2]
    > Вариант 2
    при копировании следи чтобы текущая локаль была русская.
  • fffds (27.02.12 19:54) [3]
    Никогда такого не делал!
    Поясните пож-ста как реализовать?
  • sniknik © (27.02.12 20:04) [4]
    1 ставишь версию delphi 2009 и больше
    2 перед копированием смотришь на "языковую панель" и сравниваешь буквы там с RU. оно? сделал!
  • Кщд (28.02.12 07:27) [5]
    offtop, но жутко интересно:
    вот это frmmain.DataSource1.Edit вообще для?
  • sniknik © (28.02.12 09:26) [6]
    > вообще для?
    повод нажать F1
  • Кщд (28.02.12 14:18) [7]
    >sniknik ©   (28.02.12 09:26) [6]
    правда-честно не догоняю
    грусть и печаль
  • Вариант (28.02.12 15:06) [8]

    > Кщд   (28.02.12 14:18) [7]

    Наверное просто лишний кусок кода, так как редактирования данных в указанном фрагменте кода отсутствует.
  • Сергей (25.09.13 15:03) [9]
    попробуй "прикрутить" utf-8 (или что-то ещё)
    посмотри как выглядит текст в sourse, как должен выглядеть в dest и сделай функцию преобразования

    для этого надо иметь два файла 1-в кодировке sourse, 2-ой в кодировке dest
    потом смотриш файлы побайтно, и медленно втыкаешь логику перевода..)
  • Кщд (25.09.13 16:32) [10]
    >Сергей   (25.09.13 15:03) [9]
    дорогой Сергей!
    как прекрасно, что Вы именно сейчас, спустя семь месяцев после вопроса, решили дать свой "чумовой" совет
    автор Вам, безусловно, благодарен
  • Inovet © (25.09.13 17:44) [11]
    > [10] Кщд   (25.09.13 16:32)
    > спустя семь месяцев

    Если бы семь.
  • Кщд (25.09.13 20:36) [12]
    >Inovet ©   (25.09.13 17:44) [11]
    оу, год и семь!
    true-некрофил
  • Сергей (27.09.13 09:56) [13]
    А что , автор уже умер?)))
  • Сергей (27.09.13 09:57) [14]
    или больше никому не понадобится?
    false децибел
  • Кщд (30.09.13 08:39) [15]
    >Сергей   (27.09.13 09:57) [14]
    ответ дал sniknik
    вовремя и правильно
 
Конференция "Базы" » «Абракадабра» после копирования данных из TdbGrid через Dataset!! [D7, WinXP]
Есть новые Нет новых   [134430   +3][b:0][p:0.001]