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

ENERGY

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

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

  • Посещение

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

    57

Активность репутации

  1. Like
    ENERGY получил реакцию от Alisson R Oliveira в Как сделать аналог Autosize в TImage   
    Равиль огромное вам спасибо, так просто. Все работает. Обычная пропорция.
    Я думал сложнее (я делал  Image1.Height := Image1.Bitmap.Height; ). И заодно решилась проблема, когда увеличиваешь размер формы, картинка корректно увеличивается с Fit. 
    Вот правильный код, который посоветовал Равиль:
     
    procedure TfrmSplash.FormResize(Sender: TObject); var   vKoef: Single; begin if Handle = nil then exit; // on Android without this user will get Access Violation   vKoef := Image1.Width / Image1.Bitmap.Width;   Image1.Height := Image1.Bitmap.Height * vKoef; end  
  2. Like
    ENERGY получил реакцию от #WAMACO в AdHoc   
    И еще момент, если у вас появляется ошибка
    error: unable to find utility “PackageApplication”, not a developer tool or in PATH
    Она лечиться очень просто - нужно всего лишь скопировать один файл на MacOs.
    Таким образом у меня все работает (создается подписанный файл IPA) на Xcode 9.1, Delphi Berlin Update 1.
    Скачиваем и распаковываем файл с аттача, и копируем его в MacOs в папку Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin
    Applications/Xcode.app//Contents - означает что нужно нажать правую кнопку и выбрать меню Contents. Не забудьте сделать полный Build, а затем Deploy. 
    Тот же ответ дублируется здесь: https://stackoverflow.com/questions/43068608/xcrun-error-unable-to-find-utility-packageapplication-not-a-developer-tool
     
     
     
    PackageApplication.zip
  3. Like
    ENERGY получил реакцию от Anatoliy в AdHoc   
    Кстати вот еще отличная статья.
    http://delphiworlds.com/2013/10/creating-ad-hoc-deployment-of-ios-apps-with-delphi-part-1/
    http://delphiworlds.com/2013/10/creating-ad-hoc-deployments-of-ios-apps-with-delphi-part-2/
  4. Like
    ENERGY отреагировална xenon54 в AdHoc   
    Суть в том, что Ad Hoc приложение и не должно заливаться через application loader. Ad hoc служит для распространение программы минуя app store. Вот статья об этом. Если ты делаешь приложение для AppStore и на данном этапе тебе нужно показать приложение заказчику, то можешь скомпилить для AppStore, и залить через application loader. После этого воспользоваться TestFlight для установки на его устройство. При этом приложению не нужно проходить модерацию и публикацию в магазине. Вот еще.
  5. Like
    ENERGY отреагировална kami в Подскажите необходимое железо для разработки под iOS   
    На 10.2 никаких танцев не требуется. Проблемы только начиная с 11 версии, поскольку 11 симуляторы хотят работать только под 64 бита. А делфя пока не умеет мак в 64 бита.
  6. Like
    ENERGY получил реакцию от Rusland в Подскажите необходимое железо для разработки под iOS   
    Я пишу на Delphi под iOS без мака.
    Что понадобится:
    1. Процессор Intel, не AMD. Т.к. MacOS работает под Intel.
    2. VMware + образ с установленной MAcOS.
    3. iPhone 5s или выше. Т.к. начиная с iPhone 5s процессор стал x64. Сейчас публиковать нужно обязательно x64. iPhone 5 версия - x32.   Телефон можно купить б\у.
    Идешь на рутрекер и скачиваешь Vmware образ с уже установленным MacOs Sierra. Также читай инструкции, - нужно пропатчить VMware - т.к. по дефолту возможность работы с OSX там отключена.
    Дальше присоединяшь телефон к компу, и Vmware определяет этот телефон. Дальше все по инструкции EMBT. 
    Да кстати, желательно не обновлять телефон до версии iOS 11 - к примеру у меня на Berlin были проблемы с этим SDK - поэтому я сейчас компилю проект на 10 SDK (при этом телефон остался на 11).
    Итого все компилиться, и работает Debug - кстати он гораздо быстрее  чем Android отладка.
    Да не забудьте купить аккаунт разработчика Apple - 100$ в год. Без него будет куча проблем с настройкой. Есть временный бесплатный сертификат на 5 дней (работает в течении 5 дней, затем нужно делать ребилд) - для этого можно запустить Xcode и создать и запустить пустой проект, но лучше сразу купить платный - будет меньше проблем.
     
     
  7. Like
    ENERGY получил реакцию от Ingalime в Подскажите необходимое железо для разработки под iOS   
    Я пишу на Delphi под iOS без мака.
    Что понадобится:
    1. Процессор Intel, не AMD. Т.к. MacOS работает под Intel.
    2. VMware + образ с установленной MAcOS.
    3. iPhone 5s или выше. Т.к. начиная с iPhone 5s процессор стал x64. Сейчас публиковать нужно обязательно x64. iPhone 5 версия - x32.   Телефон можно купить б\у.
    Идешь на рутрекер и скачиваешь Vmware образ с уже установленным MacOs Sierra. Также читай инструкции, - нужно пропатчить VMware - т.к. по дефолту возможность работы с OSX там отключена.
    Дальше присоединяшь телефон к компу, и Vmware определяет этот телефон. Дальше все по инструкции EMBT. 
    Да кстати, желательно не обновлять телефон до версии iOS 11 - к примеру у меня на Berlin были проблемы с этим SDK - поэтому я сейчас компилю проект на 10 SDK (при этом телефон остался на 11).
    Итого все компилиться, и работает Debug - кстати он гораздо быстрее  чем Android отладка.
    Да не забудьте купить аккаунт разработчика Apple - 100$ в год. Без него будет куча проблем с настройкой. Есть временный бесплатный сертификат на 5 дней (работает в течении 5 дней, затем нужно делать ребилд) - для этого можно запустить Xcode и создать и запустить пустой проект, но лучше сразу купить платный - будет меньше проблем.
     
     
  8. Like
    ENERGY получил реакцию от Anatoliy в Печать с планшета   
    Есть еще платная библиотека для печати
    http://winsoft.sk/aprinting.htm
  9. Like
    ENERGY получил реакцию от Anatoliy в Печать с планшета   
    А это читали? Google CloudPrint
    https://community.embarcadero.com/blogs/entry/printing-from-an-android-device-using-firemonkey-272
  10. Like
    ENERGY получил реакцию от Anatoliy в Кнопки у ListVew ItemAppearance   
    Ребята, если вам нужна кнопка с картинкой на ListView, то это можно сделать скомбинировав  картинку  с кнопкой  . 
    Сначала добавляете TTextButtonObjectAppearance, затем TImageObjectAppearance и устанавливаете картинку поверх кнопки.
     
    Чтобы определить по какому элементу Item'a кликнул юзер: 
     
    procedure TForm1.ListView1ItemClickEx(const Sender: TObject; ItemIndex: Integer; const LocalClickPos: TPointF; const ItemObject: TListItemDrawable); begin   if ItemObject = nil then exit;   ShowMessage('Name: ' + ItemObject.Name + sLineBreak + 'Text: ' + (ItemObject as TListItemText).Text); end;
     
  11. Like
    ENERGY получил реакцию от Anatoliy в Кнопки у ListVew ItemAppearance   
    Есть еще один альтернативный способ доступа к объектам.
    Вместо AItem.Objects.FindDrawable('TextButton16')  можно обращаться по индексам. Это гораздо быстрее. Т.к. не нужно перебирать все объекты и сравнивать их строковые имена. К примеру в моем случае их аж 16, и у каждого есть имя. Каждое строковое имя нужно перебрать и сравнить с искомым. При этом в OnUpdateObjects это может делаться несколько раз на каждый List item.
    Сделать это можно так:
     
    aItem.View.ViewList[x]
    Напр:
    aItem.View.ViewList[10].Height := 30;
    Список можно посмотреть так: 
    В инспекторе объектов, найдите ListView, в нем Item. Выберите его, и в списке свойств нажмите Objects- это и будет полные список объектов. Начинается он с нуля. Отсчитаете нужный, и можно работать с ним.
    Upd:
    Также можно  изменять объекты TListItem'a по индексу вместо Data['name']. Там тоже используется FindDrawable.
    Для этого сначала нужно добавить один раз значение через Data для любого из объектов чтобы создать нужны структуры (обычно для первого Object'a ), а затем уже заполнять по индексу остальные Objects в любой последовательности (не обязательно подряд).
     vItem.Data['T']  := 'Text'  // Data['T'] - это текст ListItem, так он стандартно обозначен
    Дальше уже добавляем текст в объекты через индекс: 
    (vItem.View.Drawables[5] as TListItemText).Text := 'Text 5';  
    (vItem.View.Drawables[1] as TListItemText).Text := 'Text 2';  
     
  12. Like
    ENERGY получил реакцию от Alisson R Oliveira в TListView Custom checkboxes (иконка чекбокс "избранное")   
    Огромное спасибо Равиль! Как хорошо что вы помогаете.
    Итак для тех кто не знает, в TListView есть режим DynamicAppearance , который позволяет добавлять предустановленные элементы - картинки, текст, GlyphButon. В хелпе  написано что их может быть любое количество.
    Итак добавляем TListView, в панели Structure  выбираем TListView > ItemAppearance > Item.
    В инспекторе объектов выбрать свойство Appearance и  комбобоксе Dynamic Appearance. Рядом в инспекторе появится свойство Objects - нажать на него и там уже добавляем нужные поля. Там же можно переименовать поле, в AppearanceObjectName чтобы позже использовать в RunTime. У меня периодически на этих этапах вылетает Catastrophic Failure и среду приходится терминировать с диспетчера (Berlin Update 2).
    Дальше, жмем правой кнопкой мыши по ListView и выбираем Toggle Design Mode, где можно увидеть эти добавленные Custom поля и расставить их мышкой и указать выравнивание.
    Это имя затем можно использовать в Runtime, для картинки это индекс в ImageList, который нужно указать в ListView  таким образом (за это еще раз спасибо Равилю! :), почему это сделали так неочевидно и почему это не указано в мануале, остается загадкой.. 
    Для TImageObjectAppearance с именем Star - 
    ListView1.Items.Add.Data['Star'] := Integer(1);
    Например заполняем список с картинками с индексами 0 и 1:
    procedure TForm5.FormShow(Sender: TObject); var   I: Integer; begin   for I := 0 to 9 do   begin     with ListView1.Items.Add do     begin       Text := 'Item ' + I.ToString;       Data['Star'] := Integer(I mod 2 = 0);     end;   end; end; Переключаем с картинки с индексом 1 на 0 и наоборот. procedure TForm5.ListView1ItemClick(const Sender: TObject; const AItem: TListViewItem); begin   AItem.Data['Star'] := AItem.Data['Star'].AsInteger xor 1; end ;
     
     
     
  13. Like
    ENERGY отреагировална enatechno в Цифровая подпись   
    Если нужно просто запустить программу, нажмите на "Подробнее", появится кнопка для запуска.

    инфа по цифровой подписи:
    Code Signing сертификаты или сертификаты разработчика. Виды, как выбрать
    Code signing для Open Source от Certum
    Code Signing в Windows, просто и недорого
    Где приобрести сертификат : KSoftware, Comodo, Symantec ... (ссылки есть в статьях)
    Как подписывать
  14. Like
    ENERGY отреагировална Евгений Корепов в Цифровая подпись   
    Я обычно получаю сертификат в https://www.startcomca.com - самый не дорогой сервис.
    Сначала нужно получить Class 2 Personal Identity Validation за US$59.90, потом можно будет генерировать неограниченное количество подписей. Сервис хорош тем что предоставляет архив с подписями, инструкциями и инструментарием (остальные сервисы дадут текстовый файлик с подписью в непредсказуемом контейнере - и разбирайся сам...). 
    Пинаю потихоньку https://kontur.ru/ca , дабы начали на территории России выдавать сертификаты Code Signing, но пока только за бугром это можно сделать.
  15. Like
    ENERGY получил реакцию от Rusland в [Статья] PHP сервер для рассылки Push на Android и iOS   
    Кто просил PHP код, для отправки пушей, без лимита на 1000 токенов за одну отправку. 
    Вот готовый вариант: 
    <?php                                                                                                 $server_key = 'AAAAnCw-yKA:APA91bEYphFbq_w...'; $title = 'Title'; $text = 'test'; $limit = 999; $field_name = 'DeviceToken';    $sql = mysqli_connect("mysqlserver.com", "DBName", "DBPassword");    /* check connection */    if (mysqli_connect_errno()) {     printf("Connect failed: %s\n", mysqli_connect_error());     exit(); }        $offset = 0;    while (true) {                                                                  $query = "SELECT $field_name FROM `DBName`.`TableName` LIMIT $limit OFFSET $offset";    $result = mysqli_query($sql, $query);                     if (!$result) {     die('Invalid query: ' . mysql_error()); }     if (mysqli_num_rows($result) == 0) {      echo "{\"result\":true}";        exit;        }   $arr = array();     while ($row = mysqli_fetch_array($result, MYSQL_ASSOC)) {     $arr[] =  $row["$field_name"];      }       pushSend($title, $text, $arr, $server_key);    $offset = $offset + $limit;   /* free result set */   mysqli_free_result($result);    //  foreach($arr as $item) {  //    echo $item, '<br>'; //} //echo '-----------<br>'; } mysqli_close($sql);                   // max 1000   function pushSend($title, $text, $tokens, $server_key) {     $url = 'https://fcm.googleapis.com/fcm/send';     $headers = array('Authorization: key=' . $server_key,       'Content-Type: application/json');        if (is_array($tokens))       $fields['registration_ids'] = $tokens;     else       $fields['registration_ids'] = array($tokens);        $fields['priority'] = 'high';     $fields['notification'] = array('body' => $text, 'title' => $title);     $fields['data'] = array('message' => $text, 'title' => $title);        $ch = curl_init();     curl_setopt_array($ch, array(             CURLOPT_URL => $url,             CURLOPT_POST => true,             CURLOPT_HTTPHEADER => $headers,             CURLOPT_RETURNTRANSFER => true,             CURLOPT_SSL_VERIFYHOST => 0,             CURLOPT_SSL_VERIFYPEER => false,             CURLOPT_POSTFIELDS => json_encode($fields)     ));     $result = curl_exec($ch);     curl_close($ch);     return $result; } ?>  
  16. Like
    ENERGY получил реакцию от Rusland в [Статья] PHP сервер для рассылки Push на Android и iOS   
    @Равиль Зарипов (ZuBy) по поводу вашей статьи: 
    В коде отправлять токен на базу нужно только в событии OnChange , которое срабатывает в момент вызова FPushServiceConnection.Active := true; Если вы отправляете на базу в OnChange, а затем еще и в TFormMain.PushServiceRegister; - то данные отправятся 2 раза. Device ID и Token конечно же будут одинаковые. Т.е. проще говоря после строки FPushServiceConnection.Active := true; не должно идти никакого кода. Я проверил в отладчике на 4 и 5 Android.
     
     
    procedure TFormMain.PushServiceRegister;
    begin   FPushService := nil;   FPushServiceConnection := nil;   {$IF defined(ANDROID)}   FPushService := TPushServiceManager.Instance.GetServiceByName<     (TPushService.TServiceNames.GCM);   FPushService.AppProps[TPushService.TAppPropNames.GCMAppID] := FAndroidServerKey; {$ENDIF} {$IF defined(IOS) AND defined(CPUARM)}   FPushService := TPushServiceManager.Instance.GetServiceByName    (TPushService.TServiceNames.APS); {$ENDIF}   if Assigned(FPushService) then   begin     FPushServiceConnection := TPushServiceConnection.Create(FPushService);     FPushServiceConnection.OnChange := OnServiceConnectionChange;     FPushServiceConnection.OnReceiveNotification := OnReceiveNotificationEvent;     FPushServiceConnection.Active := true;   // ниже код нужно удалить, иначе токен отправится на базу дважды.     FDeviceID := FPushService.DeviceIDValue[TPushService.TDeviceIDNames.DeviceID];     FDeviceToken := FPushService.DeviceTokenValue       [TPushService.TDeviceTokenNames.DeviceToken];     // тут отправляем в хранилище токенов (на сервер с БД например)   end; end;
  17. Like
    ENERGY получил реакцию от Rusland в Apple PAy   
    Пожалуйста держите нас в курсе, это важная тема на Delphi сообщества.
  18. Like
    ENERGY получил реакцию от Равиль Зарипов (ZuBy) в Как узнать полный путь выбранного файла в TakePhotoFromLibraryAction?   
    Вот здесь почитай, возможно натолкнет на идею. http://fire-monkey.ru/topic/3601-фотография-стандартной-камерой-смартфона/?do=findComment&comment=25019
    Здесь я получал реальный путь фотки, которая только что была сфотографированна.
    Если нет идей, поищи как это сделано на Java для Android и адаптируй на Delphi - мы с этим тоже поможем..
  19. Like
    ENERGY получил реакцию от Anatoliy в Обрезание текста в TListBox   
    Установите - Stylelookup у каждого Item'a -  listboxitemnodetail или listboxitembottomdetail
    Detail - обозначает что появляется еще одна дополнителная текстовая строка, bottom detail переводится как "детали внизу". Добавить текст в нее можно через инспектор - кликните на  нужный listitem >  ItemData > Detail
    listboxitemleftdetail - содержит еще одну текстовую панельку справа, которая перекрывает  основной текст. 
    Вы можете сделать эти пункты в своем стиле - добавить туда визуальные компоненты, такие как Tswitch, кнопки итд. 
    Для этого, - Нажмите правой кнопкой мыши (ПКМ) по листбоксу - Add ListBoxitem, выберите для этого Item'a нужный стиль, в Stylelookup, на основе которого хотите сделать свой.
    Далее, ПКМ по Item - Edit Custom Style. Выделите в инспекторе ListBoxItem1Style1 - это ваш новый стиль, можете переименовать его в StyleName на нужное вам имя. Это имя потом указывайте в StyleLookup каждого item'a.
    Теперь можно переносить мышкой компоненты на этот шаблон. Имена меняйте в StyleName. По этим именам потом можно обращаться к ним таким образом:
     vItem.StylesData['descript'] := 'text';
     vItem.StylesData['details'] := 'Text';
     vItem.ImageIndex := 5;
    Чтобы отображался картинка при помощи ImageIndex в таком собственном Item е - нужно кинуть TGlyph  и назвать Stylename  как 'glyphstyle'.
     
     
    TListBox довольно медленный компонент, и нужен в основном для небольших списков (напр. настройки) или там, где используются Items  с контролами. Для динамических списков используйте TListView.
     
     
  20. Like
    ENERGY получил реакцию от Anatoliy в Телеграмм   
    В Firebase я делал для Debug и Release версий разные проекты, название пакета одно и то же. Сервис генерит разные 4 ключа (по 2) для них и эти ключи вставляю в Version Info (Release и Debug опции) и второй ключ (номер) - нужно использовать в коде для регистрации. 
    Md хэш программы на сайте Firebase (там где указывается имя пакета) я не указывал, хотя там есть эта опция.
  21. Like
    ENERGY получил реакцию от Rusland в Телеграмм   
    А зачем с мобильного это делать? Сел за PC, перед или после работы и написал. Тем более что с мобильного отвечать можно только на простые разговоры. На сложные вопросы - нужен PC чтобы найти нужный материал, порыться в хелпе, написать код итп. Писать код с мобильного то еще извращение.
    Но конечно нужно чтобы админ сделал шаг навстречу и сделал соответсвующий раздел или одну единую тему (Флудильня).
    @Anatoliy
    Delphi конечно более развит чем С++, и по Firemonkey там больше материала. Я когда делал пуши, у меня не было проблем, я кстати вам давал ссылку на мой готовый код php. Есть детальная статья Равиля, делал пуши на основе серсива Google Firebase.
     
  22. Like
    ENERGY отреагировална Ingalime в Телеграмм   
    Замечена тендеция (учитывая моих зарубежных друзей), которой, очень странно, даже гуру этого форума подвержены...
    Все ушли в чат телеграмм - там полный, не ненужный флуд. Ценность форума идет к нулю уже не первый месяц после телеграмма. Вернитесь на форум, а телеграмм, как и любая соц. сеть для флуда - здесь не нужна. Модераторы верните силу этому форуму - убейте телеграмм...
  23. Like
    ENERGY получил реакцию от Vitaldj в PHP сервер для пушей   
    Быстрее будет разобраться и самому написать. Тем более все уже написано здесь
    Арендуете простейший хостинг + домен, туда этот файл php, к нему обращаетесь из программы.. Плюс прочитайте статью Равиля http://blog.rzaripov.kz/2017/02/firebase-android-ios-2.html 
  24. Like
    ENERGY отреагировална Andrey Efimov в Политика конфиденциальности   
    Минимальная версия СДК - это версия на которой приложение может работать, т.к. поддерживает его (в основном касается запросов в АПИ)
    Целевая версия СДК - это версия на которой приложение разрабатывалось/тестировалось.
    Например: android:minSdkVersion="14" android:targetSdkVersion="23".
    Приложение разрабатывалось для 23 АПИ, но будет работать и на 14. Тут важно предусмотреть ситуации, когда методы из 23 АПИ не будут работать на 14 АПИ, т.е. перед тем как запрашивать метод из АПИ, нужно сделать проверку СДК/АПИ на устройстве, иначе, в большинстве случаев, вывалится ошибка.
    Пример:
    Метод is5GHzBandSupported, как видим, добавлен в 21 АПИ, значит не будет работать в АПИ ниже этой версии.
    В коде мы напишем что-то подобное:
    if (TJBuild_VERSION.JavaClass.SDK_INT >= 21) then begin Запрос метода is5GHzBandSupported end;  
    p.s. Не успел отправить ответ, сообщение уже удалили...
  25. Like
    ENERGY отреагировална Andrey Efimov в Политика конфиденциальности   
    Вероятно, вам требуется добавить ссылку на политику конфиденциальности в Консоли разработчика.
    Делается это так:
    1) Заходим в консоль разработчика
    2) Выбираем приложение
    3) В меню открываем вкладку "Настройка страницы приложения" и жмём по "Описание приложения"
    4) Спускаемся в самый низ, там будет раздел "Политика конфиденциальности", вставляем ссылку на страничку/документ
    5) Сохраняем и публикуем новые настройки
     
    Про GET_ACCOUNTS.
    Как убрать разрешение:
    Собираем приложение (Build) Открываем "Проект\AndroidManifest.template.xml", выставляем минимальную и целевую версию СДК. Делаем Clear проекта и снова Собираем приложение (Build) Находим файл "Проект\Android\Debug\AndroidManifest.xml", открываем и удаляем строку с разрешением, сохраняем. Делаем деплой и заливаем в консоль. Если нужно оставить разрешение для старых версий АПИ, то можно сделать так:
    Собираем приложение (Build) Находим файл "Проект\Android\Debug\AndroidManifest.xml", открываем, и в строку с разрешением добавляем " android:maxSdkVersion="Версия АПИ" ", версию выбираем исходя из ответа на вопрос "на какой версии АПИ данное разрешение перестало требоваться?", сохраняем. Делаем деплой и заливаем в консоль. Разрешение будет запрашиваться на всех версиях до той (включительно), которую вы указали.
     
    Если вам необходимо запрашивать разрешение на версиях АПИ 23 и выше, то необходимо добавить специальный метод в ваше приложение, я максимально упростил эту задачу. Статья с описанием: Добавляем метод onRequestPermissionsResult в приложение. Либа для скачивания:CustomActivityAndListener
     
    p.s. Надеюсь, правильно понял ваши вопросы...
×
×
  • Создать...