Перейти к содержанию
Fire Monkey от А до Я

Sergey Babichev

Пользователи
  • Постов

    8
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные Sergey Babichev

  1. Проблема решена.
    На сервере никаких преобразований не делается, а на клиенте поставил кодировку по умолчанию.

    s := idCl.Socket.ReadLnWait(3,IndyTextEncoding_OSDefault);
    
  2. function TranslitStr(s:string) : string;
    const
      Rus = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
      Eng = 'abcdefghijklmnopqrstuvwxyz~|@#$%&ABCDEFGHIJKLMNOPQRSTUVWXYZ{}[]?><';
    var
      i,j : integer;
      c : char;
    begin
      Result := UTF8Encode(WideString(s));
    end;
    

    UnTranslitStr на клиенте сейчас не делает ничего

  3. Код сервера

        else if cmd = 'trafic' then begin
            DM.qPSI_TraficTest.ParamByName('stock').AsString := sl[3];
            DM.qPSI_TraficTest.Open;
            while not DM.qPSI_TraficTest.Eof do begin
              responce := '*' + DM.qPSI_TraficTest.FieldByName('id').AsString+'*'+
                          TranslitStr(DecodeEventName(DM.qPSI_TraficTest.FieldByName('A_EVENT').AsInteger))+'*'+
                          TranslitStr(DM.qPSI_TraficTest.FieldByName('test').AsString)+'*'+
                          DM.qPSI_TraficTest.FieldByName('A_COUNT').AsString+'*'+
                          TranslitStr(DM.qPSI_TraficTest.FieldByName('zn').AsString)+'*'+
                           #$0d#$0a;
               OutputReport(responce);
               ClientSocket.SendText(responce);
               DM.qPSI_TraficTest.Next;
            end;
            DM.qPSI_TraficTest.Close;
            ClientSocket.SendText('EOF'+#$0d#$0a);
            ClientSocket.Disconnect(ClientSocket.Handle);
        end;
    

    Код клиента

    procedure TfRes.GetDetailTraffic(stk: string);
    var
       cmd,s : string;
       cnt : integer;
    begin
        if not Assigned(CurrServer) then Exit;
       cmd := '*'+imei+'*trafic*'+stk+'*';
       cnt := 0;
       idCl.Host := IP;
       idCl.Port := StrToInt(CurrServer.port);
       idCl.Disconnect;
       while idCl.Connected do ;
       try
         ad.Show;
         idCl.Connect();
         if idCl.Connected then begin
            idCl.Socket.Write(cmd);
            ad.Hide;
            pd.Show;
            repeat
               Sl.Clear;
               if not idCl.Connected then break;
               s := idCl.Socket.ReadLnWait(3,IndyTextEncoding_UTF8);
               if idCl.Socket.ReadLnTimedout then Exit;
    
               Inc(cnt);
               pd.Message := 'Получено '+IntToStr(cnt)+' записей';
    //            pd.Message := s;
               if s <> 'EOF' then begin
                  RE.Subject := s;
                  RE.Split(SL,0);
                  if Sl.Count > 1 then begin
                    AddTr(SL[1],UnTranslitStr(SL[2]),SL[4],UnTranslitStr(SL[3]),UntranslitStr(SL[5]));
                  end;
               end;
            until s = 'EOF';
    
         end;
       finally
         idCl.Disconnect;
          while idCl.Connected do ;
         ad.Hide;
         pd.Hide;
       end;
    end;
    

    Скриншоты сервера и клиента

    post-818-0-19267600-1424252125_thumb.jpg

    post-818-0-43881800-1424252146_thumb.png

  4. '*356495042155004* '#$fffd#$fffd#$fffd#$fffd#$fffd#$fffd' '#$fffd#$fffd#$fffd' '#$fffd#$fffd#$fffd#$fffd#$fffd#$fffd#$fffd#$fffd#$fffd#$fffd' '#$fffd#$fffd#$fffd#$fffd#$fffd#$fffd#$fffd#$fffd#$fffd'*-40*2*H7041300945*'
    

    Вот что приходит в Инди

     

    А сервер отправляет это:

    *356495042155004* Таймер при включенном зажигании*-40*2*H7041300945*
    

    И то и то в UTF-8. Должно быть во всяком случае.

     

  5. Коллеги, подскажите, как связать заголовки столбцов у THeader с соответствующими колонками в TStringGrid?

    Сетка не умещается в экран по ширине и скроллируется а Header стоит на месте.

    Если использовать свойство Header у колонок вместо THeader а, то длинный заголовок в них не влезает. Есть способ задать ему форматирование - перенос по словам, выравнивание по центру?

  6. Извините за дублирование, но я не знаю в какой кодировке она вообще приходит. Сервер берет данные из SQL Express и отправляет их в канал. Смотришь сервер в отладчике, в сокет идет нормальная строка. В Андроид из ИНДИ приходит хрень. Кто когда и как успел испортить?

  7. Уважаемые коллеги!

    Никак не получается прочитать из клиента русский текст. Читается что-то вроде #fff8.
    Вышел из положения, написав две функции:

    function TranslitStr(s:string) : string;
    const
      Rus = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
      Eng = 'abcdefghijklmnopqrstuvwxyz~!@#$%&ABCDEFGHIJKLMNOPQRSTUVWXYZ()_+?><';
    var
      i,j : integer;
      c : char;
    begin
      Result := '';
      for i := 0 to length(s)-1 do begin
        c := s.Chars[i];
        if isLetter(c) then begin
           j := pos(c,Rus);
           if j > 0 then  c := Eng[j];
        end;
        Result := Result + c;
      end;
    end;
    

    и обратную к ней.

    function UnTranslitStr(s:string) : string;
    const
      Rus = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
      Eng = 'abcdefghijklmnopqrstuvwxyz~!@#$%&ABCDEFGHIJKLMNOPQRSTUVWXYZ()_+?><';
    var
      i,j : integer;
      c : char;
    begin
      Result := '';
      for i := 0 to length(s)-1 do begin
        c := s.Chars[i];
        if isLetter(c) then begin
           j := pos(c,Eng);
           if j > 0 then  c := Rus[j-1];
        end;
        Result := Result + c;
      end;
    end;
    

    Ее вызывает сервер, когда отправляет данные на Андроид, обратная в Андроиде возвращает буквы на место.

     

    Но так же быть не должно!

×
×
  • Создать...