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

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

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

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

  • Посещение

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

    100

Сообщения, опубликованные Евгений Корепов

  1. 2 часа назад, walexw сказал:

    В консоли та же песня. Английские буквы слушаются, русские без изменений.

    Так и должно быть, sql сервер не знает что вы собираетесь хранить в таблице, какой язык именно будет использоваться для хранения, сортировки и т.п. Вы должны сами указать sql серверу как он должен обращаться с текстом. Для этого есть свойства Collation (ну и Character Set), обычно установить эти свойства можно глобально для сервера или конкретно для базы или таблицы. К сожалению не имел опыта работы именно с SQLite, но принцип везде один. При изменении этих свойств для наполненной данными таблицы будьте осторожны, с большой вероятностью русский язык переколбасит, так что сделайте бэкап.

    Параметры можно установить конкретно для языка, к примеру "CharacterSet=cp1251 -- Windows Cyrillic" "Collation=cp1251_general_ci", или более универсально "CharacterSet=utf8 -- UTF8 Unicode" "Collation=utf8_general_ci" - русский язык должен работать корректно. 

  2. Сделал тоже самое для берлина.

    Изменено три файла 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

  3. Заинтересовала тема, накидал тестовое приложение. Действительно затык в MTP. Причем не только Dexp, но и HTC ведет себя так же. В маркете даже есть приложения выполняющие рескан sd-карты для таких случаев.

    Так что или вариант предложенный krapotkin, или доставлять данные из андроид-приложения на компьютер другим образом - база данных, хост-приложение на компьютере и доставка посредством tcp(http, ftp and etc...)

  4. 4 минуты назад, Евгений Корепов сказал:

    Пытаюсь повторить этот фокус на Berlin Update1, но уже голову сломал. Накрутили там мусора - интерфейсы, типы данных из кучи файлов. Чтоб сделать подобное нужно около пяти файлов отредактировать. Родной фильтр ListViewFilter(Sender: TObject; const AFilter,  AValue: string; var Accept: Boolean) теперь что фильтрует? Понятно что когда был Text и Detal то фильтрация осуществлялась исключительно по ним. А если DynamicApperance? Полей этих может и не быть, что именно он фильтрует? 

     

    Нашел ответ 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". Все ясно -  "автоматически"! 

  5. Пытаюсь повторить этот фокус на Berlin Update1, но уже голову сломал. Накрутили там мусора - интерфейсы, типы данных из кучи файлов. Чтоб сделать подобное нужно около пяти файлов отредактировать. Родной фильтр ListViewFilter(Sender: TObject; const AFilter,  AValue: string; var Accept: Boolean) теперь что фильтрует? Понятно что когда был Text и Detal то фильтрация осуществлялась исключительно по ним. А если DynamicApperance? Полей этих может и не быть, что именно он фильтрует? 

     

  6. 15 минут назад, Камышев Александр сказал:

    разрыв соединения - все корректно обрабатывается

    
    void __fastcall TMyDBClient::ConnectionError( TObject *ASender, TObject *AInitiator, Exception *&AException )
    {
    status = dbcError;
    #ifdef AUX_MODE
    	error_string = AException->Message;
    #endif
    if ( FOnError ) FOnError( (TObject*)this );
    Abort();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TMyDBClient::QueryError(TObject *ASender, TObject *AInitiator, Exception *&AException)
    {
    status = dbcError;
    #ifdef AUX_MODE
    	error_string = AException->Message;
    	error_string += "\r\nsql: " + fquery->SQL->Text;
    #endif
    if ( FOnError ) FOnError( (TObject*)this );
    Abort();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TMyDBClient::AfterDisconnect(TObject *Sender)
    {
    status = dbcNotConn;
    #ifdef AUX_MODE
    	log_string = "db - disconnect";
    	if ( FOnLog ) FOnLog( (TObject*)this );
    #endif
    }

    Abort() - чтобы не было исключения в Application

    так тишина и только логи шелестят переподключениями

    Чудесно! Попробую переписать под Берлин. В XE7 эти события при разрыве даже не вызывались :-(

  7. 1 час назад, Камышев Александр сказал:

    Раньше тоже пользовался продуктами devart, хоть и недорогие, удобные, надежные, но все же они платные, плюс вообще не люблю подключать сторонние компоненты. 

    На oldschool теплом ламповом CBuilder приходилось много всего подключать: скины, компоненты доступа к бд, инди последних версий, компоненты для отчетов, png и т.п. С тех пор стараюсь избегать всего не родного.

    FireDAC понравился, хорош CmdExecMode amAsync - The calling thread and GUI are not blocked. The called method will return immediately.

    Позволяет работать с базой из основного потока без завешивания, отправил запрос и занимайся другими задачами пока callback не придет.

    А как обстоит дело с обработкой разрыва соединения? А то у меня проект под win написанный еще на XE7 FireDAC, при малейшем обрыве связи с сервером идет в разнос - каждые несколько секунд появляется новое окошко с сообщением о ошибке, лечится только убитием процесса. Так и не смог обрабатывать корректно эту ошибку, на исключения нет реакции, родные события тоже не помогли.

  8. 40 минут назад, Сергей Пьянков сказал:

    Как раз это и не должно быть помехой. У Вас установлена нестандартная клавиатура? Если да, то какая?

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

    Я вас дезинформировал. Тост есть, его просто трудно заметить на фоне клавиатуры, взгляд фокусируется на верхней части экрана и если специально не смотреть, то не замечаешь. 

    Цитата

    Для Вашего отзыва, как ни странно, нет вообще никаких подробностей по устройству.

    Ага, вот у меня тоже такое проскакивает. Ставил приложение открыв ссылку на компе, и поиграв с приложением, так же с компа поставил оценку. А я все думал как же пользователям удается не оставлять данных о устройстве! :-)

    P.S. Обновил отзыв с телефона. Появились данные устройства?

  9. 1 час назад, Сергей Пьянков сказал:

    После добавления товара должно появиться сообщение (тост) "Товар добавлен" в нижней части экрана. Просьба попробовать ещё раз. Если оно не появится, то сообщите, пожалуйста, свою версию Android.

    В этот момент на экране виртуальная клавиатура, и если тост и появляется, то видимо под ней. Андроид 5, HTC One, подробности системы можете посмотреть в консоли разработчика в моем отзыве (Евгений Корепов).

    1 час назад, Сергей Пьянков сказал:

    Требование кроссплатформенности не позволяет использовать специфичные для ОС механизмы, поэтому пробными периодами управляет собственный сервер (он также отвечает и за синхронизацию, регистрацию и т. п.).

    Не исключаю изменение ценника в меньшую сторону. Какую сумму считаете оправданной Вы?

    Тут сколько людей, столько мнений. Я бы рассуждал так - ставим себя на место пользователя со средними показателями и средним доходом, и предполагаем что эту функцию ему хочется средне :-) Т.е. стоимость не должна превышать стоимость какой нибудь приятной мелочи для своего ребенка или жены , иначе он выберет подарок семье, шоколадку к примеру :-) Так что по мне стоимость в пределах 20-30 рублей и надежда на массовость приложения.

  10. Мне нравится. Поставил пятерку андроид версии. Регистрировал на kayfolom@gmail.com

    Пара замечаний :

    1. нажатие на кнопку настройки вызывает видимо типа меню с надписью "Настройки" - надпись выровнена по левому краю, и смотрится это не очень.

    2. При регистрации и вводе кода в приложении приходится вводить и дефисы вручную. Не очень удобно. Да и 9 цифр кода мне кажется избыточным. Может сделать 4 цифры, но с ограничением их срока жизни (к примеру код действителен в течении 10 минут).

    3. После ввода очередного товара и нажатия + не понятно что происходит (все поля очищаются). Может где то разместить счетчик добавленных товаров или как то информировать что товар добавлен.

    И вопрос:

    Как вы реализовали пробные периоды платных функций? Средствами гугля или как то еще?

    P.S. Мне кажется цена великовата для доп функций. 289р. за синхронизацию отпугивает. Может для начала сделать совсем дешево, а после увеличения клиентской базы и получения устойчивой оценки, уже поднимать потихоньку?

  11. 3 минуты назад, ZuBy сказал:

    я так понимаю это MIPS архитектура

    Нет, MIPS это отдельная ветвь https://ru.wikipedia.org/wiki/MIPS_(архитектура) , Intel Atom к ней не имеет отношения, он именно X86, а гугль не фильтрует его как x86 из за возможности эмуляции arm - сволочи.

  12. Создайте пустой файл с расширением .udl, к примеру DatabaseName.udl. Откройте его в проводнике, на первой вкладке сразу увидите доступные, на данном компьютере, провайдеры баз данных, на второй вкладке сможете проверить соединение. Если все в порядке и соединение устанавливается, то можно плясать дальше, искать следующую причину.

    Безымянный.png

    Update - если нужного поставщика нет, то следуйте инструкции https://msdn.microsoft.com/ru-ru/library/dn538994(v=sql.120).aspx 

  13. 16 минут назад, Rusland сказал:

    Евгений Корепов, а в Update1 это исправлено?

    Сейчас посмотрю исходники. Минутку...

    Да, в Update1 System.Net.HttpClient.pas исправлен :-)

  14. Я бы исключил из этой схемы "Пул наборов данных в памяти". Одно подключение - один поток - одно подключение к базе данных. Все таки асинхронность, кеширование и быстродействие - это хлеб программистов баз данных, и базы данных в этом хороши, нужно лишь подобрать подходящий вариант. К тому же сразу решается проблема с масштабированием - не хватает быстродействия, коннектимся к следующему серверу базы данных (а их к примеру у нас 10 и проблема синхронизации между ними решается их штатными средствами).

  15. Если это Берлин без Update1, то не в коде дело. Они поломали куки. Сравните какие куки получает клиент в снифере и какие в приложении. В приложении куки не сохраняются, по крайней мере в Delphi.

  16. В 13.09.2016 в 20:38, Iscander сказал:

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

    Компонент TBannerAD не поддерживает видео ролики.

    Есть другой компонент отображающий видео рекламу и примеры его использования?

    Если нет, то какие прогнозы?

    Это межстраничная (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;

     

  17. Этот вопрос нужно адресовать разработчикам X-Plore, есть ли у менеджера вообще такая функция, и если есть, то каким образом они отдают информацию о выбранном файле - способов может быть несколько, начиная от текста в буфере обмена, заканчивая активити.

  18. Проблему устранил, но не знаю каким образом. Код был только на трех событиях ListViewButtonClick, ListViewPullRefresh и ListViewUpdateObjects. Естественно грешил на них. У обработчиках, во всех трех процедурах, первой строкой прописал Exit. И о чудо, все заработало. Решил что сам дурак, где то накосячил в коде. Начал убирать Exit по одному, но даже убрав их везде, глюк воспроизвести не удалось. 

    Обратите внимание - код не менялся вообще никак, только Exit в начале обработчиков. Первоначальных глюк воспроизводится на трех реальных тестовых устройствах (HTC One, Dexp и Samsung, с анроидом от 4.1.2 до 5.0.1). После добавления и удаления Exit, все нормально заработало тоже на всех трех устройствах. 

    Вот честно говоря такое малость пугает, это был простенький проект с мизерным количеством пользователей, впереди проекты 50 и 100 тысячники, как то боязно даже начинать их портировать :-(

  19. В недрах 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;

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

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