-
Постов
568 -
Зарегистрирован
-
Посещение
-
Победитель дней
57
Активность репутации
-
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
-
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
-
-
ENERGY отреагировална xenon54 в AdHoc
Суть в том, что Ad Hoc приложение и не должно заливаться через application loader. Ad hoc служит для распространение программы минуя app store. Вот статья об этом. Если ты делаешь приложение для AppStore и на данном этапе тебе нужно показать приложение заказчику, то можешь скомпилить для AppStore, и залить через application loader. После этого воспользоваться TestFlight для установки на его устройство. При этом приложению не нужно проходить модерацию и публикацию в магазине. Вот еще.
-
ENERGY отреагировална kami в Подскажите необходимое железо для разработки под iOS
На 10.2 никаких танцев не требуется. Проблемы только начиная с 11 версии, поскольку 11 симуляторы хотят работать только под 64 бита. А делфя пока не умеет мак в 64 бита.
-
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 и создать и запустить пустой проект, но лучше сразу купить платный - будет меньше проблем.
-
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 и создать и запустить пустой проект, но лучше сразу купить платный - будет меньше проблем.
-
ENERGY получил реакцию от Anatoliy в Печать с планшета
Есть еще платная библиотека для печати
http://winsoft.sk/aprinting.htm
-
ENERGY получил реакцию от Anatoliy в Печать с планшета
А это читали? Google CloudPrint
https://community.embarcadero.com/blogs/entry/printing-from-an-android-device-using-firemonkey-272
-
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;
-
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';
-
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 ;
-
ENERGY отреагировална enatechno в Цифровая подпись
Если нужно просто запустить программу, нажмите на "Подробнее", появится кнопка для запуска.
инфа по цифровой подписи:
Code Signing сертификаты или сертификаты разработчика. Виды, как выбрать
Code signing для Open Source от Certum
Code Signing в Windows, просто и недорого
Где приобрести сертификат : KSoftware, Comodo, Symantec ... (ссылки есть в статьях)
Как подписывать
-
ENERGY отреагировална Евгений Корепов в Цифровая подпись
Я обычно получаю сертификат в https://www.startcomca.com - самый не дорогой сервис.
Сначала нужно получить Class 2 Personal Identity Validation за US$59.90, потом можно будет генерировать неограниченное количество подписей. Сервис хорош тем что предоставляет архив с подписями, инструкциями и инструментарием (остальные сервисы дадут текстовый файлик с подписью в непредсказуемом контейнере - и разбирайся сам...).
Пинаю потихоньку https://kontur.ru/ca , дабы начали на территории России выдавать сертификаты Code Signing, но пока только за бугром это можно сделать.
-
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; } ?>
-
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; -
-
ENERGY получил реакцию от Равиль Зарипов (ZuBy) в Как узнать полный путь выбранного файла в TakePhotoFromLibraryAction?
Вот здесь почитай, возможно натолкнет на идею. http://fire-monkey.ru/topic/3601-фотография-стандартной-камерой-смартфона/?do=findComment&comment=25019
Здесь я получал реальный путь фотки, которая только что была сфотографированна.
Если нет идей, поищи как это сделано на Java для Android и адаптируй на Delphi - мы с этим тоже поможем..
-
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.
-
ENERGY получил реакцию от Anatoliy в Телеграмм
В Firebase я делал для Debug и Release версий разные проекты, название пакета одно и то же. Сервис генерит разные 4 ключа (по 2) для них и эти ключи вставляю в Version Info (Release и Debug опции) и второй ключ (номер) - нужно использовать в коде для регистрации.
Md хэш программы на сайте Firebase (там где указывается имя пакета) я не указывал, хотя там есть эта опция.
-
ENERGY получил реакцию от Rusland в Телеграмм
А зачем с мобильного это делать? Сел за PC, перед или после работы и написал. Тем более что с мобильного отвечать можно только на простые разговоры. На сложные вопросы - нужен PC чтобы найти нужный материал, порыться в хелпе, написать код итп. Писать код с мобильного то еще извращение.
Но конечно нужно чтобы админ сделал шаг навстречу и сделал соответсвующий раздел или одну единую тему (Флудильня).
@Anatoliy
Delphi конечно более развит чем С++, и по Firemonkey там больше материала. Я когда делал пуши, у меня не было проблем, я кстати вам давал ссылку на мой готовый код php. Есть детальная статья Равиля, делал пуши на основе серсива Google Firebase.
-
ENERGY отреагировална Ingalime в Телеграмм
Замечена тендеция (учитывая моих зарубежных друзей), которой, очень странно, даже гуру этого форума подвержены...
Все ушли в чат телеграмм - там полный, не ненужный флуд. Ценность форума идет к нулю уже не первый месяц после телеграмма. Вернитесь на форум, а телеграмм, как и любая соц. сеть для флуда - здесь не нужна. Модераторы верните силу этому форуму - убейте телеграмм...
-
ENERGY получил реакцию от Vitaldj в PHP сервер для пушей
Быстрее будет разобраться и самому написать. Тем более все уже написано здесь
Арендуете простейший хостинг + домен, туда этот файл php, к нему обращаетесь из программы.. Плюс прочитайте статью Равиля http://blog.rzaripov.kz/2017/02/firebase-android-ios-2.html
-
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. Не успел отправить ответ, сообщение уже удалили...
-
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. Надеюсь, правильно понял ваши вопросы...