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

ENERGY

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

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

  • Посещение

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

    57

Сообщения, опубликованные ENERGY

  1. 33 минуты назад, Menkos1 сказал:

    Мм, а можно по подробней, как это навредит системе, если приложение весом под упаковщиком в 5мб, будет жрать память 20-50мб ?

     

    Системе не навредит, просто смысла в этом нет. Лучше упаковать архиватором, или инсталлятором.

    Упакованные exe распаковываются целиком в память, и остаются там до конца, плюс дольше запускаются.

    Не упакованные exe загружаются по сегментам, частично, только то, что нужно. http://api.farmanager.com/ru/articles/packers.html

     

    Я такой обычно код вставляю в dpr файл, для Windows проектов.  

    uses
     Windows;
    
    {$IFDEF RELEASE}
        {$SETPEFlAGS IMAGE_FILE_RELOCS_STRIPPED or IMAGE_FILE_DEBUG_STRIPPED or
             IMAGE_FILE_LINE_NUMS_STRIPPED}
        {$WEAKLINKRTTI ON}
        {$RTTI EXPLICIT METHODS([]) FIELDS([]) PROPERTIES([])}
    {$ENDIF}

    Конечно же нужно выбрать Release в Build Configurations в правой панели.

    Есть смысл упаковывать вирусы итп, чтобы быстрее скачать, чтобы зашифровать и сменить сигнатуру. Или кеиген или что-то подобное.

  2. Этот модуль не адаптирован для мобильных платформ.

    К примеру GunSmoker в своей очень интересной статье пишет 

    Цитата

    Уже сейчас указатели удаляются из языка в пользу ARC (к примеру, в Delphi для iOS отсутствует модуль System.Contnrs, поскольку он основан на TList с указателями).

     

    Вместо него нужно использовать дженерик коллекции.

    Вот пример использования TObjectList<T>

    http://docwiki.embarcadero.com/CodeExamples/Seattle/en/Generics_Collections_TObjectList_(Delphi)

     

  3. Подскажите пожалуйста как определить что программа запустилась из 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);

    Не подскажете в чем может быть проблема?


     

  4. Андрей Ефимов, мое персональное вам спасибо и почтение, счастье и здоровье в комплекте! :) 

    Без вас 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

     

     

  5. А вот еще такой вопрос, в эту же тему. Сейчас пока не надо, но чтобы знать.

    Если нужно сделать автозапуск службы после рестарта ОС, как в статье, и одновременно с этим  Автозапуск приложения в назначенное время или добавить еще какой то Java класс, то ведь получиться 2 файла classes.dex? Как их объединить?

    Я  так понял по идее нужно взять первый сгенерированный файл classes.dex (от первой статьи), отложить его в другую папку и указать его путь вместо set EMBO_DEX="c:\Program Files (x86)\Embarcadero\Studio\18.0\lib\android\release\classes.dex" ? И на основе него сгенерить второй файл DEX (от второй статьи)?

  6. 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 ? 

  7. В 3/3/2016 в 20:36, fsdb сказал:

    Все что угодно перепробывал не создается файл test_class.dex

    Windows 10, Delphi X Seattle,jdk1.8.0_66

     

     я думаю ошибка тут:

    call %DX_LIB%\dx.jar --dex %VERBOSE_FLAG% --output=%PROJ_DIR%\output\dex\test_classes.dex --positions=lines %PROJ_DIR%\output\jar\test_classes.jar
     
    что делать?
     
     
    2016-03-03 23-37-26 Выбрать Администратор  Командная строка - build.bat.png

     

    Привет. Точно такая же проблема. Можно уточнить что означает фраза 

    "меняем на java -jar  что бы понять что случилось - далее в гугл и..  делаем Downgrade jdk"

    Что конкретно поменять на java -jar?

    Спасибо

  8. Цитата

    TDictionary работает посредством хеш таблицы, и работает чертовски быстро 

    Хэш нужно еще вычислить для строки. А потом все равно перелопатить весь массив последовательно (т.к. он не сортируется). Но для OnItemClick - это вообще не критично.

    И такой перебор это стандартная фича для Data элементов. И доступ к элементам стиля также работает. Так что это стало уже стандартом. Не понимаю почему они не ввели возможность использовать числовые константы для этих целей.

  9. Что то у Евгения много лишнего в коде. Также вариант 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

     

  10. Приветствую!

    Очень странная проблема,

    Дано:

    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

     

     

  11. Ребят, извините за оффтоп. Можно ли разработать и запустить программу для iOS на таком конфиге: MacOS на виртуалке + подключенный к PC реальный iPhone 5?

    Или нужен реальный MacPC?

  12. Спасибо Равиль!

    По факту используется 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

     
    POSTED BY SARINA D ON THURSDAY, 17 OCTOBER 2013 IN BLOGS

    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.

       

    overflow2_9814[1].PNG

     

     

    Также этот же вариант описан в бесплатной книге в главе  Create an Overflow Menu

     

  13. 1. А метод Embarcadero это тот что в примере ScrollableForm?

    2. А в этом методе учитывается вторая панель?

     

    Цитата

    сделал форму которая содержит код и TVertScrollBox, и когда нужно наследуюсь от нее и больше не пишу код для поднятия контролов

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

    P.s. А вы не могли бы поделиться этим шаблоном, пожалуйста, если можно - вы очень многим страждущим поможете :) . Я тут порылся на форуме, этот вопрос очень часто всплывает.

  14. Ребят, подскажите, почему убрали VkOffset ?

    Я скачал последнюю версию (кстати указывайте версию) с https://github.com/rzaripov1990/vkbdhelper  -  Latest commit f132774 on Oct 10, 2016 и там нету VkOffset.

    Как быть с этой доп. панелькой? На одной Java программе (Tasks) эта панелька может подниматься вверх и контрол как бы оказывается между клавиатурой и панелькой (HTC), наверное это решение программиста, а не системное.

    Честно говоря удивляет что Embarcadero ничего не придумали на этот счет, ведь эта стандартная функция нужна всем разработчикам.

  15. Цитата

    Как водится, вылезающая клавиатура закрывает часть полей для ввода. На событии вылезния клавиатуры я меняю Margins.Bottom у TabControla и все в порядке...

    Есть же такая штука, которую нужно всего лишь вписать в uses проекта  https://github.com/rzaripov1990/vkbdhelper

  16. Что лучше в плане производительности использовать из этих компонентов для Android и iOS?

    Мне показалось что TlistBox как то дольше создается и грузится (я использую фрэймы (TFrame), которые создаются в RunTime, но сделаны они в Design Time) 

    На компоненте будут лежать Editbox 2x, лэйблы, Tmemo, DateEdit, TimeEdit.

    TListBox удобен тем что (я так понимаю) он автоматом подстроит визуальный стиль заголовков и пунктов под текущую систему (fix me?).

    А вот TScrollBar это не сделает. Кстати, если использовать этот компонент, скроллбар, как отделить пункты рамкой (горизонтальной чертой?). Может есть какой то межплатформенный TBorder, который отображается в нужной стиле? А если использовать TLine то какого цвета его делать (DarkGray?), кто нибудь знает?

    Спасибо.

  17. enatechno 

    Спасибо большое, это читал в первую очередь. Могу ли я запустить свое приложение, и как то ему сообщить что ему делать? В Windows, например, я бы отправил сообщение, или запустил бы программу с аргументом из планировщика или в крайнем случае сообщил бы через файл. 

    Можно ли запустить свое приложение при помощи AlarmManager и если да, то каким образом дать ему знать что нужно начать какую то операцию? Наверно проще через файл указать ему аргументы?

     

    Или лучше это сделать в виде сервиса, который будет постоянно крутиться в системе?

     

  18.  

    Brovin Yaroslav

    По идее автору нужно ловить сообщение WM_HOTKEY. Разве не достаточно проверить пришло оно или нет в WndProc? И если это другое сообщение, просто отправлять его на старый WndProc?

    Кстати, а если сделать еще вариант - создать свое невидимое окно (как делает VCL TTimer ) его зарегистрировать в RegisterHotKey и ловить сообщения с него?
     

  19. Приветствую.

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

    Подскажите как лучше это реализовать.

    В виде Android фонового сервиса или при помощи AlarmManager?

    Я где-то пару месяцев назад уже пытался сделать фоновой сервис для другой задачи, но у меня ничего не получилось, программа закрывалась системой, в общем пришлось забросить. Возможно есть рабочий код на эту тему? Для Java готовых решений полно, а вот для Delphi пока нет стандартного примера сервиса (основы), который бы работал всегда в Android системе. Почему то сообщество медленно развивается.

    Заранее спасибо за советы, очень жду мнения опытных программистов.

     

  20. 1 час назад, Brovin Yaroslav сказал:

    Это и называется хук

    Насколько я знаю хук устанавливается при помощи SetWindowsHookEx. 

    А оконная процедура (WndProc ) переопределяется в своем процессе при помощи SetWindowLong и GWL_WNDPROC без каких то плясок.

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