نمایش نتایج 1 تا 2 از 2

نام تاپیک: استفاده از Android Native Controls در بستر FireMonkey

  1. #1
    کاربر جدید آواتار yellowbell
    تاریخ عضویت
    شهریور 1394
    محل زندگی
    SadLand
    پست
    12

    Question استفاده از Android Native Controls در بستر FireMonkey

    با عرض ادب و احترام خدمت تمامی دوستداران دلفی

    - یک سوال از اساتید گرانقدر داشتم . به طور مثال ایا امکان ایجاد یک JTextView بروی یک Form طراحی شده با Firemonkey وجود دارد ؟

    بنده کلی اینترنت رو طی 2 ماه زیر و رو کردم چیزی پیدا نکرده ام . البته هدفم هم دور زدن محدودیت است که با زبان های راست چین مثل فارسی وجود دارد .

    همون طور که مستحضر می باشید ایجاد یا تغییر یک شی بصری در Firemonkey بایستی در Thread اصلی برنامه که همان FMXNativeActivity است فراخوانی شود . با استفاده از توابع CallInUIThread یا CallInUIThreadAndWaitFinishing .

    یک مثال ساده :


    var
    AJButton : JButton;
    JPPP : JViewGroup_LayoutParams;

    begin
    CallInUIThread(
    procedure ()
    begin
    AJButton := TJButton.JavaClass.init(TAndroidHelper.Context);
    AJButton.setX(10);
    AJButton.setY(10);
    AJButton.setText(TJCharSequence.Wrap( StringToJNIString( TJNIResolver.GetJNIEnv, 'Masoud' ) ));
    JPPP := TJViewGroup_LayoutParams.Wrap(TJViewGroup_LayoutPa rams.JavaClass.init(TJViewGroup_LayoutParams.JavaC lass.WRAP_CONTENT,TJViewGroup_LayoutParams.JavaCla ss.WRAP_CONTENT));
    SharedActivity.addContentView(AJButton,JPPP);
    end);



    با اجرای این کد در فرم چیزی رویت نمی شود ؟!؟!

    پیشاپیش از وقتی که می گذارید تشکر می کنم

  2. #2
    کاربر دائمی آواتار nice boy
    تاریخ عضویت
    مهر 1386
    محل زندگی
    Delphi Land
    پست
    373

    نقل قول: استفاده از Android Native Controls در بستر FireMonkey

    شما احتیاج به یک TJNativeLayout و ContentRect دارید تا بتونید Object مورد نظر رو نمایش بدید.
    در کد زیر این کار رو انجام دادم


    interface


    uses
    System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
    FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, Androidapi.JNI.GraphicsContentViewText
    ,Androidapi.Helpers, Androidapi.JNI.Embarcadero, Androidapi.JNI.Widget, FMX.Platform.Android,
    FMX.Controls.Presentation, FMX.Platform;


    type
    THeaderFooterForm = class(TForm)
    Header: TToolBar;
    Footer: TToolBar;
    HeaderLabel: TLabel;
    Button1: TButton;
    Panel1: TPanel;
    procedure Button1Click(Sender: TObject);
    private
    { Private declarations }
    FRealBounds: TRect;
    FBounds: TRect;
    FJNativeLayout: JNativeLayout;
    FJEdit: JEditText;
    FScale: Single;
    procedure CalcRealBorder;
    procedure InitUIThread;
    procedure UpdateContentFromControl;
    procedure ShowUI;
    procedure HideUI;
    public
    { Public declarations }
    end;


    var
    HeaderFooterForm: THeaderFooterForm;


    implementation


    {$R *.fmx}


    procedure THeaderFooterForm.Button1Click(Sender: TObject);
    //var
    // ScreenSrv: IFMXScreenService;
    begin
    CalcRealBorder;
    FScale := 1;
    InitUIThread;
    UpdateContentFromControl;
    end;


    procedure THeaderFooterForm.CalcRealBorder;
    var
    NativeWin: JWindow;
    ContentRect: JRect;
    begin
    NativeWin := TAndroidHelper.Activity.getWindow;
    if NativeWin <> nil then
    begin
    ContentRect := TJRect.Create;
    NativeWin.getDecorView.getDrawingRect(ContentRect) ;
    FRealBounds := Rect(ContentRect.left, ContentRect.top, ContentRect.right, ContentRect.bottom);
    end
    else
    FRealBounds := TRect.Empty;


    end;


    procedure THeaderFooterForm.HideUI;
    begin
    if FJEdit.getVisibility <> TJView.JavaClass.INVISIBLE then
    begin
    FJEdit.setVisibility(TJView.JavaClass.INVISIBLE);
    FJNativeLayout.setPosition(FRealBounds.Right * 2 , FRealBounds.Height * 2);
    end;
    end;


    procedure THeaderFooterForm.InitUIThread;
    begin
    FJEdit := TJEditText.JavaClass.init(TAndroidHelper.Activity) ;
    FJNativeLayout := TJNativeLayout.JavaClass.init(TAndroidHelper.Activ ity,
    MainActivity.getWindow.getDecorView.getWindowToken );
    FJNativeLayout.setPosition(100,100);
    FJNativeLayout.setSize(300,300);
    FJNativeLayout.setControl(FJEdit);
    FJEdit.setVisibility(TJView.JavaClass.VISIBLE);
    end;


    procedure THeaderFooterForm.ShowUI;
    begin
    FJNativeLayout.setPosition(FBounds.Left, FBounds.Top);
    FJNativeLayout.setSize(FBounds.Right, FBounds.Bottom);
    if FJEdit.getVisibility <> TJView.JavaClass.VISIBLE then
    FJEdit.setVisibility(TJView.JavaClass.VISIBLE);
    end;


    procedure THeaderFooterForm.UpdateContentFromControl;
    var
    Pos: TPointF;
    begin
    while FJNativeLayout = nil do
    Application.ProcessMessages;


    if FJNativeLayout <> nil then
    begin
    Pos := Panel1.LocalToAbsolute(TPointF.Zero) * FScale;


    FBounds := Rect(Round(Pos.X), Round(Pos.Y), Round(50 * FScale), Round(50 * FScale));
    if Panel1.Visible and Panel1.ParentedVisible and
    (TCommonCustomForm(Panel1.Root.GetObject)).Visible and
    (TCommonCustomForm(Panel1.Root.GetObject)).Active then
    ShowUI
    else
    HideUI;
    end
    else
    HideUI;
    end;

تاپیک های مشابه

  1. آموزش: استفاده از wpf user control در ویندوز فرم
    نوشته شده توسط محسن شامحمدی در بخش VB.NET
    پاسخ: 10
    آخرین پست: دوشنبه 06 مرداد 1393, 12:51 عصر
  2. استفاده از wpf user control در windows application
    نوشته شده توسط mousa1992 در بخش C#‎‎
    پاسخ: 1
    آخرین پست: چهارشنبه 11 بهمن 1391, 20:29 عصر
  3. مشکل با استفاده از یک user control در چند جای یک صفحه
    نوشته شده توسط maryam_272 در بخش ASP.NET Web Forms
    پاسخ: 8
    آخرین پست: جمعه 17 آذر 1391, 12:48 عصر
  4. مبتدی: پیشنهاد شما جهت استفاده از یک User Control در لایه Bussines
    نوشته شده توسط sayan در بخش C#‎‎
    پاسخ: 4
    آخرین پست: یک شنبه 21 فروردین 1390, 00:02 صبح
  5. استفاده از توابع یک DLL در User Control !!
    نوشته شده توسط hadi2345 در بخش VB.NET
    پاسخ: 6
    آخرین پست: شنبه 20 آبان 1385, 11:55 صبح

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •