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

kami

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

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

  • Посещение

  • Победитель дней

    41

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

  1. 15 часов назад, Wovan2 сказал:

    Android по умолчанию искренне считает, что там UTF8.

    Пусть хоть китайской традиционной считает. Повторюсь - абсолютно без разницы, что за кодировка внутри приложения. Главное, чтобы общение (ввод/вывод) с внешним миром шло с явным указанием кодировки, поскольку автоопределение и/или считание кодировкой по умолчанию рано или поздно приведет к фейлу.

  2. 3 часа назад, Wovan2 сказал:

    А что конкретно в этих байтах - это уже кодировка.

    Да, это правильно.

    3 часа назад, Wovan2 сказал:

    На Windows - ANSI(первый байт 0)

    Нет, на Windows - UTF-16

    3 часа назад, Wovan2 сказал:

    Как все же правильно работать с кодировками, чтобы всегда знать, в какой кодировке находятся строки в которыми ты работаешь в данный конкретный момент, на данном конкретном компе?

    Внутри приложения не стоит заморачиваться на это. Всё приложение работает в единой кодировке и никаких проблем с передачей из класса в класс, из метода в метод, из модуля в модуль нет и не будет.

    Другое дело - общение с "внешним миром". Самые простые случаи - сохранение /загрузка текста в файл, общение по сети.

    В этом случае необходимо просто явно указывать кодировку при получении и отправке данных.

  3. 57 минут назад, Wovan2 сказал:

    Свойство s.Encoding только для чтения

    Зато его можно указать в конструкторе.

     

    1 час назад, Wovan2 сказал:

    В Delphi строка закодирована  в ANSI. (Или в Windows???)

    Нет. Исходная string в версиях от 2009 и выше - это UnicodeString. В большинстве случаев можно считать как WideString или UCS-2. Кодировка по 2 байта на символ. ANSI - это 1 байт на символ.

    Действительно, получившийся у Вас код не есть супер-красив. Я продолжаю считать, что всего навсего явное указание Encoding для StringStream снимет эти проблемы. Всякие остальные преобразования, включая явные упоминания конкретных TEncoding  и функций перекодировки не нужны.

  4. 38 минут назад, Wovan2 сказал:

    mem.Lines.Add(Utf8ToAnsi(s.ReadString(s.Size)));

    Одна из ошибок здесь.

    Во-первых, ReadString уже возвращает строку. В той кодировке, которую правильно воспримет memo.
    Во-вторых, ReadString читает байты как строку, считая что это заранее заданная кодировка. По умолчанию, емнип, идет ANSI. Во внутренностях ReadString сразу идет преобразование из выбранной кодировки в дефолтную на выбранной платформе.

    Требуется: убрать напрочь излишнее UTF8ToAnsi
    У каждого StringStream сразу после создания подставить s.Encoding:=TEncoding.UTF8;

    Имхо, этого хватит.

  5. 11 час назад, Akad сказал:

    Точно ни где ошибка не вкралась?

    Точно. Полная копипаста из моего модуля.

    Под Win - лечит, опробовано лично. Про Андроид - не скажу, не знаю.

    11 час назад, Akad сказал:

    Всё те же падения под win

    Так разберитесь, где именно падает. Что за стек вызовов, с какими параметрами. Оттрассируйте и предложите фикс.

  6. Апну тему.
    На этот раз - Tokio upd1, с патчем под iOS11.

    Что требуется: скопировать в папку с проектом (рядом с dpr) файл FMX.WebBrowser.pas. В нем внести изменения в метод TCustomWebBrowser.FormHandleCreated, чтобы он выглядел следующим образом:
     

    procedure TCustomWebBrowser.FormHandleCreated(const Sender: TObject; const Msg: TMessage);
    
      function GetParentForm(Control: TFmxObject): TCommonCustomForm;
      begin
        if (Control.Root <> nil) and (Control.Root.GetObject is TCommonCustomForm) then
          Result := TCommonCustomForm(Control.Root.GetObject)
        else
          Result := nil;
      end;
    
    var
      WBService : IFMXWBService;
    begin
      if not (csDesigning in ComponentState) and ((FWeb = nil) or (Sender = GetParentForm(self as TFmxObject))) and
        TPlatformServices.Current.SupportsPlatformService(IFMXWBService, WBService) then
      begin
        WBService.DestroyWebBrowser(FWeb); // добавлена эта строка.
        FWeb := WBService.CreateWebBrowser;
        FWeb.SetWebBrowserControl(Self);
        FWeb.UpdateContentFromControl;
        FWeb.URL := FURL;
        FWeb.Navigate;
      end;
    end;

    Что дает правка:

    допустим, у вас есть WB на главной форме и на дочерней форме (или фрейме - без разницы), которая создается / уничтожается динамически. При создании вторичной формы метод FormHandleCreated вызывается дважды, при этом FWeb, созданный в первом вызове просто забывается, но не уничтожается (сильная ссылка в списке веббраузеров в WBService). Дальше вторичная форма уничтожается (захватывая с собой FWeb, созданный при втором вызове FormHandleCreated ), а в "забытом" FWeb остаются невалидные ссылки на родителя. Что при вызове метода TWBFactoryService.RealignBrowsers (активация / изменение размеров формы) приведет к AV.

    Внесенное изменение удаляет FWeb из списка WBService, и в дальнейшем ничего не мешает его спокойному уничтожению.

  7. В 03.11.2017 в 19:00, wamaco сказал:

    как Вы это сделали

    Можно поподробнее, про что поподробнее? :)

    Скачал последний XCode, поставил, убедился что в Preferences-Locations стоит последняя версия Command line tools -> Установил патчи в PAServer и IDE -> удалил напрочь все "старые" SDK из опций IDE, удалил их из папки -> скачал SDK 11.1, убедился что SDK 11.1 активны -> скомпилировал и задеплоил (кажется, во время деплоя мне было сказано, что Bundle Identificator плох, пришлось заменить его с вида F43234.com.application.my на com.application.my.
    Это, по большому счету, всё, что касается работы с SDK 11.1, остальные танцы с бубном (на предыдущих SDK) не вижу смысла приводить. Тщательно разбирайте ошибки компиляции и деплоя и будет вам счастье :)

  8. 1 час назад, Wovan2 сказал:

    Не могу найти ни одного примера использования.

    Там искать нечего. В глубине тетеринга эта команда - всего лишь совокупность

    SendCommand(AConnection, ACommand);
    Result := ReceiveCommand(AConnection);

    Получается, что (как видно из названия и кода) она отправляет команду (как обычно, т.е. обработка на приеме ничем не отличается) и ждет, пока получит команду в ответ.

    Единственное что - следует самому создавать TTetheringCommand со своими параметрами, а не пользоваться готовыми SendStream и SendString

  9. 1 час назад, mazayhin сказал:

    воспользуйтесь готовым IXMLDocument

    Далеко не каждый html-документ валиден с точки зрения xml, поскольку допускает применение открывающих тегов без закрывающих. Посему - html может просто не загрузиться в IXMLDocument.

  10. XCode 9.1 + SDK 11.1 + iOS 11.1 +RAD 10.2.1 (с патчем PAServer и IDE под iOS11)
    Собрано 64 битное приложение (Universal binary file) и оно РАБОТАЕТ!!!

    Мучился довольно долго, под 11.0 сборка не хотела идти категорически (валилось на лишних разрешениях в Provision profile, про них говорилось в окне Build делфи).
    Заново ставил патч, удалял SDK 11.0, накатывал заново - не хотело идти, приложение вроде запускалось и сразу закрывалось на IPAD mini.

    А с 11.1 прокатило сразу же. Я не знаю, почему - может, из-за свежего SDK, может из-за того, что оно ставилось "в чистую" (хотя я и 11.0 SDK удалял ручками из папки документов).

    Главное - есть результат. Если нужны какие-то подробности - пишите, постараюсь ответить (хотя с моей точки зрения - всё это были танцы с бубном).

  11. В 05.12.2016 в 17:54, Rusland сказал:

    как сделать чтобы на разные Edit открывались разные клавиатуры

    Слегка запоздалый ответ, но... Выставляешь нужные keyboardtype полям ввода ... и всё. Если нужно анализировать какие-то другие поля - в моей клаве есть метод GetKeyboardTypeForObject, в котором можно провести нужные (не предусмотренные штатным механизмом) манипуляции

  12. Раз уж пошла такая пьянка - выложу сюда то, что по виртуальной клавиатуре есть у меня на текущий момент (в телеграме уже выложил).

    Поддерживаются операционные системы: iOS, Windows. Оттестировано на 10.1 (Berlin)

    Итак: архив распаковать куда угодно, в проект в uses подключить модули uCommonCustomKeyboard (отвечает за подмену "штатной виртуальной клавиатуры" на свою) и ufrCustomNumpad (отвечает за отображение цифровой клавиатуры).

    Алфавитную, e-mail-овскую и тому подобные виды клавиатур оставляю на ваше усмотрение. Они делаются на основе ufrCustomNumpad, там больше заморочек с красивым размещением кнопок, чем с кодом.

    CustomKeyboards.7z

  13. 1 час назад, Volodja сказал:

    Вот код.

    Не забываем выставлять Parent у объектов.

    3 минуты назад, Volodja сказал:

    Вот такая очистка корректна?

    Не уверен, а копаться лень.
    Вариантов "правильной" очистки в FMX несколько, например:
     

    for i:=lbCells.Count-1 downto 0 do
    
      lbCells.ItemByIndex(i).Release;

     

  14. 2 часа назад, Volodja сказал:

    на TListBox или на TListView можно как-то наложить какой-то TGridPanelLayout.

    для начала можно использовать TListBox. он попроще в понимании и подходит для небольших объемов информации. На объемах от двух экранов и более начинает тормозить, там уже нужен ListView, у которого совсем другой подход.

    Вкратце: у TListBox есть элементы, которые (если проводить аналогию с vcl) - просто панельки. На эти "панельки" можно накидать любые компоненты и, выставляя их свойства (начиная от текста и заканчивая выравниванием и стилем), уже регулировать отображение.

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