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

Евгений Корепов

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

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

  • Посещение

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

    100

Весь контент Евгений Корепов

  1. Так и должно быть, sql сервер не знает что вы собираетесь хранить в таблице, какой язык именно будет использоваться для хранения, сортировки и т.п. Вы должны сами указать sql серверу как он должен обращаться с текстом. Для этого есть свойства Collation (ну и Character Set), обычно установить эти свойства можно глобально для сервера или конкретно для базы или таблицы. К сожалению не имел опыта работы именно с SQLite, но принцип везде один. При изменении этих свойств для наполненной данными таблицы будьте осторожны, с большой вероятностью русский язык переколбасит, так что сделайте бэкап. Параметры можно установить конкретно для языка, к примеру "CharacterSet=cp1251 -- Windows Cyrillic" "Collation=cp1251_general_ci", или более универсально "CharacterSet=utf8 -- UTF8 Unicode" "Collation=utf8_general_ci" - русский язык должен работать корректно.
  2. Выполните этот запрос в консоли сервера, будет работать UPPER?
  3. Сделал тоже самое для берлина. Изменено три файла FMX.ListView.Adapters.Base.pas FMX.ListView.Appearances.pas FMX.ListView.Types.pas, изменения предваряются комментарием "// Added Evgeniy Korepov for FilterEx". Единственный нюанс - параметр функции теперь function(X: TListItem): Boolean а не function(X: TListViewItem): Boolean ListViewBerlinWithFilterEx.zip
  4. Заинтересовала тема, накидал тестовое приложение. Действительно затык в MTP. Причем не только Dexp, но и HTC ведет себя так же. В маркете даже есть приложения выполняющие рескан sd-карты для таких случаев. Так что или вариант предложенный krapotkin, или доставлять данные из андроид-приложения на компьютер другим образом - база данных, хост-приложение на компьютере и доставка посредством tcp(http, ftp and etc...)
  5. Нашел ответ http://community.embarcadero.com/blogs/blog-menu/entry/filtering-support-for-custom-listview-layouts-in-update-1 : "New in Update 1 is search filtering for custom appearance, allowing you to add automatic filtering to your custom lists". Все ясно - "автоматически"!
  6. Пытаюсь повторить этот фокус на Berlin Update1, но уже голову сломал. Накрутили там мусора - интерфейсы, типы данных из кучи файлов. Чтоб сделать подобное нужно около пяти файлов отредактировать. Родной фильтр ListViewFilter(Sender: TObject; const AFilter, AValue: string; var Accept: Boolean) теперь что фильтрует? Понятно что когда был Text и Detal то фильтрация осуществлялась исключительно по ним. А если DynamicApperance? Полей этих может и не быть, что именно он фильтрует?
  7. Чудесно! Попробую переписать под Берлин. В XE7 эти события при разрыве даже не вызывались :-(
  8. А как обстоит дело с обработкой разрыва соединения? А то у меня проект под win написанный еще на XE7 FireDAC, при малейшем обрыве связи с сервером идет в разнос - каждые несколько секунд появляется новое окошко с сообщением о ошибке, лечится только убитием процесса. Так и не смог обрабатывать корректно эту ошибку, на исключения нет реакции, родные события тоже не помогли.
  9. Спасибо за промокод. Но возник глупый вопрос - куда его вводить? :-) Потыкался в приложении, не нашел подходящего места :-(
  10. Я вас дезинформировал. Тост есть, его просто трудно заметить на фоне клавиатуры, взгляд фокусируется на верхней части экрана и если специально не смотреть, то не замечаешь. Ага, вот у меня тоже такое проскакивает. Ставил приложение открыв ссылку на компе, и поиграв с приложением, так же с компа поставил оценку. А я все думал как же пользователям удается не оставлять данных о устройстве! :-) P.S. Обновил отзыв с телефона. Появились данные устройства?
  11. В этот момент на экране виртуальная клавиатура, и если тост и появляется, то видимо под ней. Андроид 5, HTC One, подробности системы можете посмотреть в консоли разработчика в моем отзыве (Евгений Корепов). Тут сколько людей, столько мнений. Я бы рассуждал так - ставим себя на место пользователя со средними показателями и средним доходом, и предполагаем что эту функцию ему хочется средне :-) Т.е. стоимость не должна превышать стоимость какой нибудь приятной мелочи для своего ребенка или жены , иначе он выберет подарок семье, шоколадку к примеру :-) Так что по мне стоимость в пределах 20-30 рублей и надежда на массовость приложения.
  12. Мне нравится. Поставил пятерку андроид версии. Регистрировал на kayfolom@gmail.com Пара замечаний : 1. нажатие на кнопку настройки вызывает видимо типа меню с надписью "Настройки" - надпись выровнена по левому краю, и смотрится это не очень. 2. При регистрации и вводе кода в приложении приходится вводить и дефисы вручную. Не очень удобно. Да и 9 цифр кода мне кажется избыточным. Может сделать 4 цифры, но с ограничением их срока жизни (к примеру код действителен в течении 10 минут). 3. После ввода очередного товара и нажатия + не понятно что происходит (все поля очищаются). Может где то разместить счетчик добавленных товаров или как то информировать что товар добавлен. И вопрос: Как вы реализовали пробные периоды платных функций? Средствами гугля или как то еще? P.S. Мне кажется цена великовата для доп функций. 289р. за синхронизацию отпугивает. Может для начала сделать совсем дешево, а после увеличения клиентской базы и получения устойчивой оценки, уже поднимать потихоньку?
  13. Нет, MIPS это отдельная ветвь https://ru.wikipedia.org/wiki/MIPS_(архитектура) , Intel Atom к ней не имеет отношения, он именно X86, а гугль не фильтрует его как x86 из за возможности эмуляции arm - сволочи.
  14. Google Play по какой то причине не выделяет Intel Atom как X86. Считается что это arm процессор :-(
  15. Создайте пустой файл с расширением .udl, к примеру DatabaseName.udl. Откройте его в проводнике, на первой вкладке сразу увидите доступные, на данном компьютере, провайдеры баз данных, на второй вкладке сможете проверить соединение. Если все в порядке и соединение устанавливается, то можно плясать дальше, искать следующую причину. Update - если нужного поставщика нет, то следуйте инструкции https://msdn.microsoft.com/ru-ru/library/dn538994(v=sql.120).aspx
  16. О чем вы? Перечитал свой сообщение, не нашел ничего о "несколько копий наборов данных".
  17. Сейчас посмотрю исходники. Минутку... Да, в Update1 System.Net.HttpClient.pas исправлен :-)
  18. Я бы исключил из этой схемы "Пул наборов данных в памяти". Одно подключение - один поток - одно подключение к базе данных. Все таки асинхронность, кеширование и быстродействие - это хлеб программистов баз данных, и базы данных в этом хороши, нужно лишь подобрать подходящий вариант. К тому же сразу решается проблема с масштабированием - не хватает быстродействия, коннектимся к следующему серверу базы данных (а их к примеру у нас 10 и проблема синхронизации между ними решается их штатными средствами).
  19. Если это Берлин без Update1, то не в коде дело. Они поломали куки. Сравните какие куки получает клиент в снифере и какие в приложении. В приложении куки не сохраняются, по крайней мере в Delphi.
  20. Это межстраничная (Interstitial) реклама. Родного компонента нет, но отлично работает модуль от турецкого коллеги http://ersanyakit.com/blog/admob-interstitials-snippet-code-using-the-android-jni-in-delphi-xe7-firemonkey.html . Написан для XE7, но отлично работает и в XE8. В Берлине еще не проверял. Использовать примерно так: procedure onAdClosedEvent(pszData:String); begin FormMain.Log('onAdClosed'); end; procedure onAdFailedToLoadEvent(pszData:String); begin FormMain.Log('onAdFailedToLoad'); end; procedure onAdLeftApplicationEvent(pszData:String); begin FormMain.Log('onAdLeftApplication'); end; procedure onAdOpenedEvent(pszData:String); begin FormMain.Log('onAdOpened'); end; procedure onAdLoadedEvent(pszData:String); begin FormMain.Log('onAdLoaded'); end; procedure TFormMain.ShowAdvertisment; begin IAdvertisment := TInterstitialAdvertisment.Create; IAdvertisment.SetOnCloseEvent(onAdClosedEvent); IAdvertisment.SetOnAdFailedToLoad(onAdFailedToLoadEvent); IAdvertisment.SetOnAdLeftApplication(onAdLeftApplicationEvent); IAdvertisment.SetOnAdOpened(onAdOpenedEvent); IAdvertisment.SetOnAdLoaded(onAdLoadedEvent); {$IFDEF DEBUG} IAdvertisment.TestMode := True; {$ENDIF DEBUG} {$IFDEF RELEASE} IAdvertisment.TestMode := False; {$ENDIF RELEASE} IAdvertisment.SetAdUnitID('ca-app-pub-***************/****************'); IAdvertisment.InitAdvertisment; end;
  21. Это не баг, а фича. Так и должно работать. При использовании протокола GATT, максимальные пользовательские данные в пакете составляет 20 байт. Если нужно больше, дробите на пакеты.
  22. Этот вопрос нужно адресовать разработчикам X-Plore, есть ли у менеджера вообще такая функция, и если есть, то каким образом они отдают информацию о выбранном файле - способов может быть несколько, начиная от текста в буфере обмена, заканчивая активити.
  23. Проблему устранил, но не знаю каким образом. Код был только на трех событиях ListViewButtonClick, ListViewPullRefresh и ListViewUpdateObjects. Естественно грешил на них. У обработчиках, во всех трех процедурах, первой строкой прописал Exit. И о чудо, все заработало. Решил что сам дурак, где то накосячил в коде. Начал убирать Exit по одному, но даже убрав их везде, глюк воспроизвести не удалось. Обратите внимание - код не менялся вообще никак, только Exit в начале обработчиков. Первоначальных глюк воспроизводится на трех реальных тестовых устройствах (HTC One, Dexp и Samsung, с анроидом от 4.1.2 до 5.0.1). После добавления и удаления Exit, все нормально заработало тоже на всех трех устройствах. Вот честно говоря такое малость пугает, это был простенький проект с мизерным количеством пользователей, впереди проекты 50 и 100 тысячники, как то боязно даже начинать их портировать :-(
  24. В недрах Actions выполняется примерно такой код: procedure ShareUrl(AURL : String); {$IFDEF ANDROID} Const SMediaLibraryOpenTextWith = 'Send text using:'; var MIMETypes: string; Intent: JIntent; IntentChooser: JIntent; ChooserCaption: string; {$ENDIF ANDROID} begin {$IFDEF ANDROID} try Intent := TJIntent.Create; MIMETypes := 'text/plain'; // Intent.setAction(TJIntent.JavaClass.ACTION_SEND_MULTIPLE) Intent.setAction(TJIntent.JavaClass.ACTION_SEND); Intent.setType(StringToJString(MIMETypes)); Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); Intent.addFlags(TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION); Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString(AURL)); ChooserCaption := SMediaLibraryOpenTextWith; IntentChooser := TJIntent.JavaClass.createChooser(Intent, StrToJCharSequence(ChooserCaption)); SharedActivity.startActivity(IntentChooser); finally end; {$ENDIF ANDROID} end; Так что думаю отследить не возможно - запускается стороннее приложение и ему передается нечто (в моем примере ссылка, а можно текст и изображение), а что стороннее приложение делает с переданными данными узнать нельзя.
×
×
  • Создать...