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

Шаблон невизуального компонента


tFeniks

Вопрос

Рекомендуемые сообщения

  • 0

Type

TBaseComponent=Class(TComponent)

private

protected

public

Constructor Create(AOwner:TComponent);override;

Destructor Destroy;override;

published

end;

 

implementation

Constructor TBaseComponent.Create(AOwner:TComponent);

Begin

inherted Create(Aowner);

 

End;

 

Destructor TBaseComponent.Destroy;

Begin

 

inherted Destroy;

end;

Ссылка на комментарий
  • 0

Создал такой компонент

 

unit BATERRY;
 
interface
 
uses
  System.SysUtils, System.Classes, AndroidAPI.Helpers,
  AndroidAPI.JNI.GraphicsContentViewText;
 
type
  TBattery = class(TComponent)
  private
    { Private declarations }
    FBattery: string; // уровень заряда батареи
  protected
    { Protected declarations }
  public
    { Public declarations }
    Constructor Create(AOwner: TComponent); override;
    Destructor Destroy; override;
    function GetBatteryPercent: string;
    procedure SetBatteryPercent(Value: string);
    function BatteryPercent(const aContext: JContext): integer;
  published
    { Published declarations }
    property Battery: string read GetBatteryPercent write SetBatteryPercent;
 
  end;
 
procedure Register;
 
implementation
 
procedure Register;
begin
  RegisterComponents('ARION', [TBattery]);
end;
 
{ TBattery }
 
function TBattery.BatteryPercent(const aContext: JContext): integer;
var
  filter: JIntentFilter;
  Battery: JIntent;
begin
  filter := TJIntentFilter.Create;
  filter.addAction(TJIntent.JavaClass.ACTION_BATTERY_CHANGED);
  Battery := aContext.registerReceiver(NIL, filter);
  result := Battery.getIntExtra(StringToJString('level'), -1);
end;
 
constructor TBattery.Create(AOwner: TComponent);
begin
  inherited;
  Create(AOwner);
end;
 
destructor TBattery.Destroy;
begin
  Destroy;
  inherited;
end;
 
function TBattery.GetBatteryPercent: string;
begin
  result := FBattery;
end;
 
procedure TBattery.SetBatteryPercent;
var
  myContext: JContext;
begin
  myContext := SharedActivityContext;
  // Showmessage(BatteryPercent(myContext).ToString);
  FBattery := (BatteryPercent(myContext).ToString);
end;
 
end.
 
Что я делаю не так? Компонент не компилируется. Я хочу, чтобы он появился на палитре. Он должен работать в среде Android. Умом понимаю, что используется AndroidApi, которого в виндовсе нет, но как обойти эту проблему?
Ссылка на комментарий
  • 0
unit Unit16;

interface

uses
{$IFDEF ANDROID}
  AndroidAPI.Helpers,
  AndroidAPI.JNI.GraphicsContentViewText,
{$ENDIF}
  System.SysUtils, System.Classes;

type
  TBattery = class(TComponent)
  private
    { Private declarations }
    FBattery: string; // уровень заряда батареи
  protected
    { Protected declarations }
  public
    { Public declarations }
    Constructor Create(AOwner: TComponent); override;
    Destructor Destroy; override;
    function GetBatteryPercent: string;
    procedure SetBatteryPercent(Value: string);
{$IFDEF ANDROID}
    function BatteryPercent(const aContext: JContext): integer;
{$ENDIF}
  published
    { Published declarations }
    property Battery: string read GetBatteryPercent write SetBatteryPercent;

  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('ARION', [TBattery]);
end;

{ TBattery }
{$IFDEF ANDROID}

function TBattery.BatteryPercent(const aContext: JContext): integer;
var
  filter: JIntentFilter;
  Battery: JIntent;
begin
  filter := TJIntentFilter.Create;
  filter.addAction(TJIntent.JavaClass.ACTION_BATTERY_CHANGED);
  Battery := aContext.registerReceiver(NIL, filter);
  result := Battery.getIntExtra(StringToJString('level'), -1);
end;
{$ENDIF}

constructor TBattery.Create(AOwner: TComponent);
begin
  inherited;
  Create(AOwner);
end;

destructor TBattery.Destroy;
begin
  Destroy;
  inherited;
end;

function TBattery.GetBatteryPercent: string;
begin
  result := FBattery;
end;

procedure TBattery.SetBatteryPercent;
{$IFDEF ANDROID}
var
  myContext: JContext; {$ENDIF}
begin
{$IFDEF ANDROID} myContext := SharedActivityContext;
  // Showmessage(BatteryPercent(myContext).ToString);
  FBattery := (BatteryPercent(myContext).ToString);
{$ENDIF}
end;

end.

Может быть так?

Ссылка на комментарий
  • 0

Компонент появился на палитре инструментов, правда в Target platform пришлось добавить Win и Android. Осталось проверить работоспособность всего этого на деле

Ссылка на комментарий
  • 0

Что именно сейчас не работает?

Данный код я бы добавил в сеттер и геттер, но судя по коду выше они у вас не правильны

Вот я и пытаюсь разобраться как это правильно сделать. 

Ссылка на комментарий
  • 0

До этого Вы писали что у Вас Delphi зависает. Я выше привел код для конструктора и деструктора.

После этого зависание осталось? Проверьте при выбранных платформах Windows и Android.

 

p.s.

Переделал ваш код, но под платформой андроид не смотрел, т.к. она отсутствует, но запуститься по идее должно

unit BATTERY;

interface

uses
{$IFDEF ANDROID}
  AndroidAPI.Helpers,
  AndroidAPI.JNI.GraphicsContentViewText,
{$ENDIF}
  System.SysUtils, System.Classes;

type
  TBattery = class(TComponent)
  private
  public
    { Public declarations }
    Constructor Create(AOwner: TComponent); override;
    Destructor Destroy; override;
    function GetBatteryPercent: string;
    procedure SetBatteryPercent(Value: string);
{$IFDEF ANDROID}
    function BatteryPercent(const aContext: JContext): integer;
{$ENDIF}
  published
    { Published declarations }
    property Battery: string read GetBatteryPercent write SetBatteryPercent;

  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('ARION', [TBattery]);
end;

{ TBattery }

{$IFDEF ANDROID}
function TBattery.BatteryPercent(const aContext: JContext): integer;
var
  filter: JIntentFilter;
  Battery: JIntent;
begin
  filter := TJIntentFilter.Create;
  filter.addAction(TJIntent.JavaClass.ACTION_BATTERY_CHANGED);
  Battery := aContext.registerReceiver(NIL, filter);
  result := Battery.getIntExtra(StringToJString('level'), -1);
end;
{$ENDIF}

constructor TBattery.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
end;

destructor TBattery.Destroy;
begin

  inherited Destroy;
end;

function TBattery.GetBatteryPercent: string;
{$IFDEF ANDROID}
var
  myContext: JContext;
{$ENDIF}
begin
  result := 'N/A';

{$IFDEF ANDROID}
  if not(csDesigning in ComponentState) then
  begin
    myContext := SharedActivityContext;
    result := (BatteryPercent(myContext).ToString);
  end;
{$ENDIF}
end;

procedure TBattery.SetBatteryPercent(Value: string);
begin
{$IFDEF ANDROID}
{$ENDIF}
end;

end.
Ссылка на комментарий
  • 0

 

До этого Вы писали что у Вас Delphi зависает. Я выше привел код для конструктора и деструктора.

После этого зависание осталось? Проверьте при выбранных платформах Windows и Android.

 

p.s.

Переделал ваш код, но под платформой андроид не смотрел, т.к. она отсутствует, но запуститься по идее должно

unit BATTERY;

interface

uses
{$IFDEF ANDROID}
  AndroidAPI.Helpers,
  AndroidAPI.JNI.GraphicsContentViewText,
{$ENDIF}
  System.SysUtils, System.Classes;

type
  TBattery = class(TComponent)
  private
  public
    { Public declarations }
    Constructor Create(AOwner: TComponent); override;
    Destructor Destroy; override;
    function GetBatteryPercent: string;
    procedure SetBatteryPercent(Value: string);
{$IFDEF ANDROID}
    function BatteryPercent(const aContext: JContext): integer;
{$ENDIF}
  published
    { Published declarations }
    property Battery: string read GetBatteryPercent write SetBatteryPercent;

  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('ARION', [TBattery]);
end;

{ TBattery }

{$IFDEF ANDROID}
function TBattery.BatteryPercent(const aContext: JContext): integer;
var
  filter: JIntentFilter;
  Battery: JIntent;
begin
  filter := TJIntentFilter.Create;
  filter.addAction(TJIntent.JavaClass.ACTION_BATTERY_CHANGED);
  Battery := aContext.registerReceiver(NIL, filter);
  result := Battery.getIntExtra(StringToJString('level'), -1);
end;
{$ENDIF}

constructor TBattery.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
end;

destructor TBattery.Destroy;
begin

  inherited Destroy;
end;

function TBattery.GetBatteryPercent: string;
{$IFDEF ANDROID}
var
  myContext: JContext;
{$ENDIF}
begin
  result := 'N/A';

{$IFDEF ANDROID}
  if not(csDesigning in ComponentState) then
  begin
    myContext := SharedActivityContext;
    result := (BatteryPercent(myContext).ToString);
  end;
{$ENDIF}
end;

procedure TBattery.SetBatteryPercent(Value: string);
begin
{$IFDEF ANDROID}
{$ENDIF}
end;

end.

сегодня проверю и отпишусь. Думаю будет работать. 

Ссылка на комментарий
  • 0

 

 

До этого Вы писали что у Вас Delphi зависает. Я выше привел код для конструктора и деструктора.

После этого зависание осталось? Проверьте при выбранных платформах Windows и Android.

 

p.s.

Переделал ваш код, но под платформой андроид не смотрел, т.к. она отсутствует, но запуститься по идее должно

unit BATTERY;

interface

uses
{$IFDEF ANDROID}
  AndroidAPI.Helpers,
  AndroidAPI.JNI.GraphicsContentViewText,
{$ENDIF}
  System.SysUtils, System.Classes;

type
  TBattery = class(TComponent)
  private
  public
    { Public declarations }
    Constructor Create(AOwner: TComponent); override;
    Destructor Destroy; override;
    function GetBatteryPercent: string;
    procedure SetBatteryPercent(Value: string);
{$IFDEF ANDROID}
    function BatteryPercent(const aContext: JContext): integer;
{$ENDIF}
  published
    { Published declarations }
    property Battery: string read GetBatteryPercent write SetBatteryPercent;

  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('ARION', [TBattery]);
end;

{ TBattery }

{$IFDEF ANDROID}
function TBattery.BatteryPercent(const aContext: JContext): integer;
var
  filter: JIntentFilter;
  Battery: JIntent;
begin
  filter := TJIntentFilter.Create;
  filter.addAction(TJIntent.JavaClass.ACTION_BATTERY_CHANGED);
  Battery := aContext.registerReceiver(NIL, filter);
  result := Battery.getIntExtra(StringToJString('level'), -1);
end;
{$ENDIF}

constructor TBattery.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
end;

destructor TBattery.Destroy;
begin

  inherited Destroy;
end;

function TBattery.GetBatteryPercent: string;
{$IFDEF ANDROID}
var
  myContext: JContext;
{$ENDIF}
begin
  result := 'N/A';

{$IFDEF ANDROID}
  if not(csDesigning in ComponentState) then
  begin
    myContext := SharedActivityContext;
    result := (BatteryPercent(myContext).ToString);
  end;
{$ENDIF}
end;

procedure TBattery.SetBatteryPercent(Value: string);
begin
{$IFDEF ANDROID}
{$ENDIF}
end;

end.

сегодня проверю и отпишусь. Думаю будет работать. 

 

И еще в догонку, чтобы уж во всем разобраться раз и до конца. Как мне прикрутить окно О программе, чтобы в проперти Был пункт About, по клику на который вызывалось это окно. 

Ссылка на комментарий
  • 0

Все нормально. Компонент собрался, появился на панели инструментов, однако при компиляции проекта пишет, что не найдет файл battery.pas  Где и как прописать пути для поиска этого компонента?

Ссылка на комментарий
  • 0

Наконец-то все заработало как нужно. Если у кого есть еще информация по следующим сопутствующим вопросам, то поделитесь.

1. Как добавить информацию о компоненте в SplaschScreen Delphi

2. Как добавить окно About в компонент

Ссылка на комментарий
  • 0

Если кому будет интересно, нашел в исходниках AlphaScins как вставить информацию о компоненте в стартовое окно Delphi

procedure RegisterWithSplashScreen;
var
  Bmp : TBitmap;
begin
  Bmp := TBitmap.Create;
  Bmp.LoadFromResourceName(hInstance, 'ACLOGO');
  try
    SplashScreenServices.AddPluginBitmap('AlphaControls 2013', Bmp.Handle, False,
{$IFNDEF ALITE}
      {$IFDEF RUNIDEONLY}'Trial edition'{$ELSE}'Registered'{$ENDIF},
{$ELSE}
      'Lite Edition',
{$ENDIF}
      '(version ' + sSkinManager.CurrentVersion + ')');
  except on E : Exception do
  end;
  Bmp.Free;
end;
{$ENDIF}
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...