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

Slym

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

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

  • Посещение

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

    39

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

  1. type
     TSpinBoxEx=class(TSpinBox)
     protected
       procedure SetData(const Value: TValue); override;
     end;
    
    { TSpinBoxEx }
    
    procedure TSpinBoxEx.SetData(const Value: TValue);
    begin
      if Value.IsType<string> then
       Self.Value := StrToFloatDef(Value.AsString,0)
      else
        inherited SetData(Value);
    end;
    
    procedure TForm1.StringGrid1CreateCustomEditor(Sender: TObject; const Column: TColumn; var Control: TStyledControl);
    begin
      if Column.Index=1 then
        Control:=TSpinBoxEx.Create(self);
    end;

     

  2. type
    TOpenForm=class(TForm) end;

    TOpenForm(FForm).ReleaseForm;

    Ты так никогда не делал?
    До protectedов регулярно так делаю, TOpenForm становится френдли объектом и разрешает protected

     

  3. вангую в что frmEditor - переменная негде не присвоенная...
    нужно либо при создании TfrmNewArticleList передавать ссылку на текущий frmEditor, или по Parentам искать его вниз

    EditorWorkFrame->Parent = EditorFrameLayout;
    EditorWorkFrame->frmEditor = this;
    EditorWorkFrame->Align  = TAlignLayout::Client;
  4. Наоборот: сначала ShowModal, в колбеке ForceQueue Free

    FFrom := TFrom.Create(nil);
    FFrom.ShowModal(procedure(Res: TModalResult)
       begin
          TThread.ForceQueue(nil, procedure
          begin 
            FreeForm(FFrom);
          end);
       end);

     

  5. Включай logcat и смотри логи... я тоже портировался недавно, споткнулся о
    Failed to register native method com.embarcadero.rtl.ProxyInterface.dispatchToNative2(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;J)Ljava/lang/Object; in base.apk
    Вылечил пересозданием проекта: создаем чистый проект с тем же названием, в рабочем подменяем все кроме dpr, заново настраиваем deploy и тп.
     

  6. Линковка Kotlin (Котлин) библиотек в Delphi, как делаю:
    Хедеры линкуемых библиотек обычно громадны описанием всех типов...
    Я обычно делаю свой jar на java в нем линкую зависимости и наружу для дельфи оставляю один объект с простыми функциями.
    Хедер дельфи получается компактным и понятным:

    package com.MyCompany.evotor;
    
    public interface J2DCallback {
        void Log(String str);
        String Trans(String str);
        String GetValue(String name);
        void SetValue(String name, String value);
        Activity GetActivity();
        Context GetContext();
    }
    
    public class FiscalCoreConnection {
        final private Global Instance;
    
        public FiscalCoreConnection(J2DCallback aj2d) throws NullPointerException {
            Instance = new Global(aj2d);
        }
    
        public String SendJSON(String JSON){
            try{
                return Instance.SendJson(JSON);
            }
            catch (Exception e) {
                return FiscalCoreException.MakeJson(e);
            }
        }
    }
    
    type
      J2DCallbackClass = interface(IJavaClass)
        ['{856654D5-7939-44DF-ACD5-E2EF8C6D3AA4}']
      end;
    
      [JavaSignature('com/MyCompany/evotor/J2DCallback')]
      J2DCallbackIntf = interface(IJavaInstance)
        ['{025B14E9-C041-4105-9E85-83CC127CC340}']
        procedure Log(str:JString); cdecl;
        function Trans(str:JString):JString; cdecl;
        function GetValue(name:JString):JString; cdecl;
        procedure SetValue(name:JString; value:JString); cdecl;
        function GetActivity():JActivity; cdecl;
        function GetContext():JContext; cdecl;
      end;
      TJ2DCallbackImp = class(TJavaGenericImport<J2DCallbackClass, J2DCallbackIntf>) end;
    
      [JavaSignature('com/MyCompany/evotor/FiscalCoreConnection')]
      JFiscalCoreConnection = interface(JObject)
        ['{5797747D-D61D-4EF6-94F7-5E8994545CC2}']
        function SendJSON(JSON:JString):JString; cdecl;
      end;
      JFiscalCoreConnectionClass = interface(JObjectClass)
        ['{81782882-DFCF-4FA9-BD37-02CCCF2409EA}']
        function init(j2d : J2DCallbackIntf) : JFiscalCoreConnection; cdecl;
      end;
      TJFiscalCoreConnection = class(TJavaGenericImport<JFiscalCoreConnectionClass, JFiscalCoreConnection>)
      end;
        
      TJ2DCallback = class(TJavaLocal, J2DCallbackIntf)
      public
        procedure Log(str:JString); cdecl;
        function Trans(str:JString):JString; cdecl;
        function GetValue(name:JString):JString; cdecl;
        procedure SetValue(name:JString; value:JString); cdecl;
        function GetActivity():JActivity; cdecl;
        function GetContext():JContext; cdecl;
      end;

    Все зависимости в build.gradle:

    dependencies {
        implementation 'com.github.evotor:integration-library:v0.4.50'
        implementation 'com.google.zxing:core:3.4.0'
    }
    

    В Дереве External Libraries забираем jarы зависимостей
    image.png.9c3106188a085711122eef42b2745c28.png

    ПКМ Show in Explorer. Копируем в папку своего проекта и даем осознанное имя.

    Там же забираем kotlin-stdlib
    image.png.1f607451ff9bfcf896d7611fde8a3600.png

    ПКМ Show in Explorer. Копируем в папку своего проекта и даем осознанное имя.
    Но в kotlin-stdlib.jar есть "лишний" файл kotlin-stdlib-1.5.10.jar\META-INF\versions\9\module-info.class
    Открываем архиватором и удаляем файл или всю папку versions
    image.png.cff0e34871eb69a6b32d0a12a24a5550.png

    Почти все готово... Но котлин еще и посыпан сахаром и не хочет Дельфей dexится, хочет -min-sdk-version=26
    Поможем Delphi:
    Ищем CodeGear.Common.Targets, у меня он в "C:\Program Files (x86)\Embarcadero\Studio\21.0\bin"\
    Ищем в нем --output, и перед ним вставим все про sdk. У меня получилось так:
        <DxCmd>PATH $(JDKPath)\bin;$(PATH); %26 set JAVA_HOME=$(JDKPath)%26 "$(JavaDxPath)" --dex --min-sdk-version=26 --output=</DxCmd>

    Далее цепляем все jar в проект
    image.png.a633a73ee82fa2ad627b2ca5a85c510d.png
    Либа производителя, Либа своя обертка, и котлин
    Иии собираем!

    Если есть еще зависимости делаем аналогично:
    находим jar, выпиливаем META-INF\versions\9\module-info.class, линкуем в проект и собираем...
    Не все зависимости используются и нужны, поэтому добавляем поштучно до тех пор пока не заведется.

  7. тогда сначала так, без проверки парента

    //if TOpenCustomScrollBox(Sender).ContainsObject(ICtrl.GetObject) then

    закоментируй иф... так понятней?:

     

    procedure TScrollBoxService.OnViewportPositionChange(Sender: TObject;
      const OldViewportPosition, NewViewportPosition: TPointF; const ContentSizeChanged: Boolean);
    var ICtrl:IControl;
    begin
      ICtrl:=TControl(Sender).Root.Captured;
      if not assigned(ICtrl) then
      begin
        ICtrl:=TControl(Sender).Root.Focused;
        if not assigned(ICtrl) then
          exit;
      end;
      ICtrl.MouseUp(TMouseButton.mbLeft,[],0,0);
      ICtrl.DoMouseLeave;
    end;
×
×
  • Создать...