-
Постов
568 -
Зарегистрирован
-
Посещение
-
Победитель дней
57
Сообщения, опубликованные ENERGY
-
-
Этот модуль не адаптирован для мобильных платформ.
К примеру GunSmoker в своей очень интересной статье пишет
ЦитатаУже сейчас указатели удаляются из языка в пользу ARC (к примеру, в Delphi для iOS отсутствует модуль
System.Contnrs
, поскольку он основан наTList
с указателями).Вместо него нужно использовать дженерик коллекции.
Вот пример использования TObjectList<T>
http://docwiki.embarcadero.com/CodeExamples/Seattle/en/Generics_Collections_TObjectList_(Delphi)
-
Подскажите пожалуйста как определить что программа запустилась из AlarmManager?
Я сделал это так, по аналогии с http://stackoverflow.com/questions/6751564/how-to-pass-a-boolean-between-intents
В Java коде, который компилиться в итоге в classes.dex (с XE7 не нужен DEX файл, можно подключить Jar файл сразу к проекту!), добавил строчку
public class AlarmReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
Intent TestLauncher = new Intent();
TestLauncher.setClassName(context, "com.embarcadero.firemonkey.FMXNativeActivity");
TestLauncher.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
TestLauncher.putExtra("StartedFromAM", true);
context.startActivity(TestLauncher);
}
}По идее теперь при старте из AlarmManager, должно быть true в активити.
Из Delphi пытаюсь получить это значение, но всегда возвращает false (0).
ShowMessage(SharedActivity.getIntent.getBooleanExtra(StringToJString('StartedFromAM'), false).ToString );
И вот так тоже:
ShowMessage ( MainActivity.getIntent.getBooleanExtra(StringToJString('StartedFromAM'), false).ToString);
Не подскажете в чем может быть проблема?
-
Андрей Ефимов, мое персональное вам спасибо и почтение, счастье и здоровье в комплекте!
Без вас Delphi сообщество многое бы потеряло..
Насчет склеивания dex файлов, судя по коммандной строке в батнике, dex файлы можно склеивать просто указав их пути - к примеру, в ней указано сразу 3 файла classes.dex (который может лежать тут, это может быть какой нибудь предыдущий dex файл) test_classes.dex и classes.dex от Embarcadero.
java -cp %DX_LIB%\dx.jar com.android.dx.merge.DexMerger %PROJ_DIR%\output\dex\classes.dex %PROJ_DIR%\output\dex\test_classes.dex %EMBO_DEX%
Еще один ньюанс о котором я забыл, и промучился пол дня переименовывая проект 10 раз т.к. выскакивали разные ошибки. А переименовывать его нужно было, потому что - андроид запоминал битый пакет и не давал его ставить по новой.
СпойлерIf your Android application is not configured to be deployed with a valid classes.dex file, and you run your application on an Android device from RAD Studio or install on your device an APK file of your application generated with RAD Studio, the installation will fail, but it will leave data in your Android device preventing you from installing applications with the same package name as your application.
Не забудьте в Deployment при добавлении classes.dex поставить напротив него в колонке Remote Path строчку "classes\"!
Иначе будет
Unable to create process: Unable to install '<APK file>'. Failure [INSTALL_FAILED_DEXOPT]
Также есть оф. инструкция: Using a Custom Set of Java Libraries In Your RAD Studio Android Apps
-
Цитата
Вот бы статью с иллюстрациями о правильном использовании TImageList.
Вроде там все просто, не запутанно.
https://community.embarcadero.com/blogs/entry/timagelistxe8ru
-
А вот еще такой вопрос, в эту же тему. Сейчас пока не надо, но чтобы знать.
Если нужно сделать автозапуск службы после рестарта ОС, как в статье, и одновременно с этим Автозапуск приложения в назначенное время или добавить еще какой то Java класс, то ведь получиться 2 файла classes.dex? Как их объединить?
Я так понял по идее нужно взять первый сгенерированный файл classes.dex (от первой статьи), отложить его в другую папку и указать его путь вместо set EMBO_DEX="c:\Program Files (x86)\Embarcadero\Studio\18.0\lib\android\release\classes.dex" ? И на основе него сгенерить второй файл DEX (от второй статьи)?
-
Andrey Efimov
javac -source 1.7 -target 1.7 %VERBOSE_FLAG% -Xlint:deprecation
Спасибо! Все заработало! Появился файл dex
-
To Андрей
В обоих случаях пишет
c:\Projects\MyProj\Java>javac -source 1.6 -target 1.6 -Xlint:deprecation -cp c:\Users\Alex\Documents\Embarcadero\Studio\18.0\PlatformSDKs\android-sdk-windows\platforms\android-24\android.jar -d output\classes src\TestClassHello\HelloWorld.java
warning: [options] bootstrap class path not set in conjunction with -source 1.6
1 warningЯ указал путь Java 1.8 (там только 2 папки с названием jdk1.8.0_60 и jre1.8.0_60 с другими версиями нету), насколько я понял эта Java поставилась с Delphi Berlin. Может мне нужно скачать другую версию Java ?
-
В 3/3/2016 в 20:36, fsdb сказал:
Привет. Точно такая же проблема. Можно уточнить что означает фраза
"меняем на java -jar что бы понять что случилось - далее в гугл и.. делаем Downgrade jdk"
Что конкретно поменять на java -jar?
Спасибо
-
Цитата
TDictionary работает посредством хеш таблицы, и работает чертовски быстро
Хэш нужно еще вычислить для строки. А потом все равно перелопатить весь массив последовательно (т.к. он не сортируется). Но для OnItemClick - это вообще не критично.
И такой перебор это стандартная фича для Data элементов. И доступ к элементам стиля также работает. Так что это стало уже стандартом. Не понимаю почему они не ввели возможность использовать числовые константы для этих целей.
-
Что то у Евгения много лишнего в коде. Также вариант AItem.Data['ShowPool']:=AShowPool; медленный (т.к. в списке строк (TDictionary) ищется строка 'ShowPool' прямым перебором от начала до конца всего массива строк ), в моем случае гораздо быстрее.
Вот вариант с чекбоксами :
lvDetails.ItemAppearanceName := TAppearanceNames.ImageListItem; // или свой тип станадртный TAppearanceNames.ListItem lvDetails.ItemAppearanceObjects.ItemObjects.Accessory.AccessoryType := TAccessoryType.Checkmark;
Все. теперь создаете OnItemClick - который будет включаь\выключать чекбокс
procedure TfrmMain.lvDetailsItemClick(const Sender: TObject; const AItem: TListViewItem); begin if aItem = nil then exit; if AItem.Objects.AccessoryObject.AccessoryType = TAccessoryType.Checkmark then begin AItem.Objects.AccessoryObject.Visible := not AItem.Objects.AccessoryObject.Visible; // When listview is resized because of rotation, accessory properties will be reset to default values // Save status to the Tag AItem.Tag := integer(AItem.Objects.AccessoryObject.Visible); end; end;
Добавляем событие OnUpdateObjects, на случай если девайс поменял ориентацию (в этом случае accessory свойства не сохраняются).
procedure TfrmMain.lvDetailsUpdateObjects(const Sender: TObject; const AItem: TListViewItem); begin // In order for text to be truncated properly, shorten text object AItem.Objects.TextObject.Width := AItem.Objects.TextObject.Width - (2 + AItem.Objects.AccessoryObject.Width); // Restore checked state when device is rotated. // When listview is resized because of rotation, accessory properties will be reset to default values if AItem.Objects.AccessoryObject.AccessoryType = TAccessoryType.Checkmark then AItem.Objects.AccessoryObject.Visible := Boolean(AItem.Tag); end;
Проверяем наличие чекбокса:
if ListView.Items[i].Objects.AccessoryObject.Visible then
-
Приветствую!
Очень странная проблема,
Дано:
TTabControl на нем страницы.
На одной TListView - со стандартным стилем (Stylelookup = '' и Items со стилем TAppearanceNames.ImageListItem)
На другой лежит TListBox со Stylelookup = '', но переопределен с моим сustom стилем (3 TText разных цветов и TImage с именем icon). Везде стоит Font size - Default, втч и в этих трех TText. Когда запускаю на Android размер шрифта конкретно в этом TListBox меньше чем в TlistView и в остальных компонентах (например в другом TListBox, который встроен в TMultiView).
На Windows вроде одинаково.
Нигде в проекте не менял размер шрифта, scale тоже нигде не менял..
Может кто встречал подобное поведение?
Delphi Berlin update 2
FireMonkey Different font size on custom and default styled controls
-
Ребят, извините за оффтоп. Можно ли разработать и запустить программу для iOS на таком конфиге: MacOS на виртуалке + подключенный к PC реальный iPhone 5?
Или нужен реальный MacPC?
-
Кстати там уже новая версия для Берлина появилась: http://docs.embarcadero.com/products/rad_studio/radstudioBerlin/Mobile_Tutorials_en.pdf
-
Спасибо Равиль!
По факту используется ListBox. В случае TCustomPopover и TCustomListPicker все равно придется (проще всего) его использовать.
Самый простой варинат, как уже написал Равиль, TMultiView с режимом Popover.
Как это сделать вручную без TMultiView пошагово:
https://community.embarcadero.com/blogs/entry/creating-an-overflow-menu-on-android-463
На случай если статья пропадет:
СпойлерCreating an Overflow Menu on Android
During my CodeRage 8 session I talked about creating an Action Bar with an Overflow menu, so I wanted to provide some step-by-step instructions.
On Android, an Action Bar is a top (or top and bottom aligned) toolbar that is segmented into 4 key functional areas. One of those functional areas is an Overflow menu.
The ‘Overflow’ popup menu is commonly used for additional menu items on Android and accessed via the Action Bar. An Overflow menu is designed to give the application user quick access to additional/less often used features that are otherwise not accessible via more prominent menu items.
In FireMonkey, you can easily implement an Overflow menu through the use of TListBox.
In my example, I am using the following 4 components:-
TToolbar
-
Alignment: alTop
-
TSpeedButton
- Alignment: alRight
- StyleLookUp: detailstoolbutton
-
Margin, Right: 5 (this is set in case you want to carry this UI over to iOS as well, to account for both bordered (iOS6) and non-bordered (iOS7) button sizes
-
TListBox with several items
- Each of the four listboxitems has a bitmap and text defined via the ItemData property
- Visibility has been set to False
- Height has been set to 176px (to show the listbox border right below the last listbox item)
-
Anchors: akTop, akRight
-
TShadowEffect
- Parented to TListBox
-
ListBox Item Properties:
TSpeedButton properties:
I used a larger (80x80px) icon for each listbox item bitmap so that the icons look nice on both lower resolution and high resolution displays.
I also created the following on-click Event for my OverflowButton:procedure TForm10.OverflowButtonClick(Sender: TObject);
begin
OverflowMenu.Visible := not OverflowMenu.Visible;
if OverflowMenu.Visible then
begin
OverflowMenu.ApplyStyleLookup;
OverflowMenu.RealignContent;
end;
end;
Below is a quick recording of the Overflow menu in action.
Также этот же вариант описан в бесплатной книге в главе Create an Overflow Menu
-
1. А метод Embarcadero это тот что в примере ScrollableForm?
2. А в этом методе учитывается вторая панель?
Цитатасделал форму которая содержит код и TVertScrollBox, и когда нужно наследуюсь от нее и больше не пишу код для поднятия контролов
Спасибо за идею. Правда мне придется и для фрэймов делать, т.к. я стараюсь создавать и показывать нужный фрэйм с компонентами только когда они необходимы.
P.s. А вы не могли бы поделиться этим шаблоном, пожалуйста, если можно - вы очень многим страждущим поможете . Я тут порылся на форуме, этот вопрос очень часто всплывает.
-
Ребят, подскажите, почему убрали VkOffset ?
Я скачал последнюю версию (кстати указывайте версию) с https://github.com/rzaripov1990/vkbdhelper - Latest commit f132774 on Oct 10, 2016 и там нету VkOffset.
Как быть с этой доп. панелькой? На одной Java программе (Tasks) эта панелька может подниматься вверх и контрол как бы оказывается между клавиатурой и панелькой (HTC), наверное это решение программиста, а не системное.
Честно говоря удивляет что Embarcadero ничего не придумали на этот счет, ведь эта стандартная функция нужна всем разработчикам.
-
Цитата
Как водится, вылезающая клавиатура закрывает часть полей для ввода. На событии вылезния клавиатуры я меняю Margins.Bottom у TabControla и все в порядке...
Есть же такая штука, которую нужно всего лишь вписать в uses проекта https://github.com/rzaripov1990/vkbdhelper
-
Что лучше в плане производительности использовать из этих компонентов для Android и iOS?
Мне показалось что TlistBox как то дольше создается и грузится (я использую фрэймы (TFrame), которые создаются в RunTime, но сделаны они в Design Time)
На компоненте будут лежать Editbox 2x, лэйблы, Tmemo, DateEdit, TimeEdit.
TListBox удобен тем что (я так понимаю) он автоматом подстроит визуальный стиль заголовков и пунктов под текущую систему (fix me?).
А вот TScrollBar это не сделает. Кстати, если использовать этот компонент, скроллбар, как отделить пункты рамкой (горизонтальной чертой?). Может есть какой то межплатформенный TBorder, который отображается в нужной стиле? А если использовать TLine то какого цвета его делать (DarkGray?), кто нибудь знает?
Спасибо.
-
Andrey Efimov
Спасибо, это я еще не читал. Буду разбираться.
-
enatechno
Спасибо большое, это читал в первую очередь. Могу ли я запустить свое приложение, и как то ему сообщить что ему делать? В Windows, например, я бы отправил сообщение, или запустил бы программу с аргументом из планировщика или в крайнем случае сообщил бы через файл.
Можно ли запустить свое приложение при помощи AlarmManager и если да, то каким образом дать ему знать что нужно начать какую то операцию? Наверно проще через файл указать ему аргументы?
Или лучше это сделать в виде сервиса, который будет постоянно крутиться в системе?
-
Подскажите пожалуйста, я правильно понимаю что при помощи AlarmManager можно сделать так, чтобы телефон вышел из спящего режима и запустить приложение?
-
Brovin Yaroslav
По идее автору нужно ловить сообщение WM_HOTKEY. Разве не достаточно проверить пришло оно или нет в WndProc? И если это другое сообщение, просто отправлять его на старый WndProc?
Кстати, а если сделать еще вариант - создать свое невидимое окно (как делает VCL TTimer ) его зарегистрировать в RegisterHotKey и ловить сообщения с него?
-
Приветствую.
Нужно в определенное время отправлять несколько смс сообщений, к примеру это может быть через час, день, неделю.
Подскажите как лучше это реализовать.
В виде Android фонового сервиса или при помощи AlarmManager?
Я где-то пару месяцев назад уже пытался сделать фоновой сервис для другой задачи, но у меня ничего не получилось, программа закрывалась системой, в общем пришлось забросить. Возможно есть рабочий код на эту тему? Для Java готовых решений полно, а вот для Delphi пока нет стандартного примера сервиса (основы), который бы работал всегда в Android системе. Почему то сообщество медленно развивается.
Заранее спасибо за советы, очень жду мнения опытных программистов.
-
1 час назад, Brovin Yaroslav сказал:
Это и называется хук
Насколько я знаю хук устанавливается при помощи SetWindowsHookEx.
А оконная процедура (WndProc ) переопределяется в своем процессе при помощи SetWindowLong и GWL_WNDPROC без каких то плясок.
Размер компилируемого файла
в Прочие вопросы
Опубликовано · Изменено пользователем ENRGY
Системе не навредит, просто смысла в этом нет. Лучше упаковать архиватором, или инсталлятором.
Упакованные exe распаковываются целиком в память, и остаются там до конца, плюс дольше запускаются.
Не упакованные exe загружаются по сегментам, частично, только то, что нужно. http://api.farmanager.com/ru/articles/packers.html
Я такой обычно код вставляю в dpr файл, для Windows проектов.
Конечно же нужно выбрать Release в Build Configurations в правой панели.
Есть смысл упаковывать вирусы итп, чтобы быстрее скачать, чтобы зашифровать и сменить сигнатуру. Или кеиген или что-то подобное.