tFeniks Опубликовано 7 сентября, 2015 Поделиться Опубликовано 7 сентября, 2015 кто может показать шаблон для невизуального компонента который будет работать на Androide и Delphi Цитата Ссылка на комментарий
0 rareMax Опубликовано 7 сентября, 2015 Поделиться Опубликовано 7 сентября, 2015 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; Alex7wrt 1 Цитата Ссылка на комментарий
0 tFeniks Опубликовано 7 сентября, 2015 Автор Поделиться Опубликовано 7 сентября, 2015 Огромное спасибо, если можно, то накидайте подобное и для визуальных компонентов тоже. Цитата Ссылка на комментарий
0 tFeniks Опубликовано 7 сентября, 2015 Автор Поделиться Опубликовано 7 сентября, 2015 Создал такой компонент 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 rareMax Опубликовано 7 сентября, 2015 Поделиться Опубликовано 7 сентября, 2015 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 tFeniks Опубликовано 7 сентября, 2015 Автор Поделиться Опубликовано 7 сентября, 2015 Компонент появился на палитре инструментов, правда в Target platform пришлось добавить Win и Android. Осталось проверить работоспособность всего этого на деле Цитата Ссылка на комментарий
0 tFeniks Опубликовано 8 сентября, 2015 Автор Поделиться Опубликовано 8 сентября, 2015 Все бы хорошо, но при попытке бросить компонент на форму, Delphi зависает. Видимо, что-то еще нужно Цитата Ссылка на комментарий
0 ildvild Опубликовано 8 сентября, 2015 Поделиться Опубликовано 8 сентября, 2015 Возможно нужно добавить проверку на то, что данные о батарее получаются не в design time if not(csDesigning in ComponentState) then Цитата Ссылка на комментарий
0 FIL Опубликовано 8 сентября, 2015 Поделиться Опубликовано 8 сентября, 2015 В конструкторе и деструкторе ерунда понаписана. Цитата Ссылка на комментарий
0 rareMax Опубликовано 8 сентября, 2015 Поделиться Опубликовано 8 сентября, 2015 ой да - я туда даже не смотрел. Чет подумал что ТС делал по примеру выше Цитата Ссылка на комментарий
0 tFeniks Опубликовано 8 сентября, 2015 Автор Поделиться Опубликовано 8 сентября, 2015 так как правильней это сделать? Цитата Ссылка на комментарий
0 ildvild Опубликовано 8 сентября, 2015 Поделиться Опубликовано 8 сентября, 2015 constructor TBattery.Create(AOwner: TComponent); begin inherited Create(AOwner); end; destructor TBattery.Destroy; begin inherited Destroy; end; Цитата Ссылка на комментарий
0 tFeniks Опубликовано 8 сентября, 2015 Автор Поделиться Опубликовано 8 сентября, 2015 Возможно нужно добавить проверку на то, что данные о батарее получаются не в design time if not(csDesigning in ComponentState) then А куда эту часть вставлять? Цитата Ссылка на комментарий
0 ildvild Опубликовано 8 сентября, 2015 Поделиться Опубликовано 8 сентября, 2015 Что именно сейчас не работает? Данный код я бы добавил в сеттер и геттер, но судя по коду выше они у вас не правильны Цитата Ссылка на комментарий
0 tFeniks Опубликовано 8 сентября, 2015 Автор Поделиться Опубликовано 8 сентября, 2015 Что именно сейчас не работает? Данный код я бы добавил в сеттер и геттер, но судя по коду выше они у вас не правильны Вот я и пытаюсь разобраться как это правильно сделать. Цитата Ссылка на комментарий
0 ildvild Опубликовано 8 сентября, 2015 Поделиться Опубликовано 8 сентября, 2015 До этого Вы писали что у Вас 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 tFeniks Опубликовано 8 сентября, 2015 Автор Поделиться Опубликовано 8 сентября, 2015 До этого Вы писали что у Вас 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 tFeniks Опубликовано 8 сентября, 2015 Автор Поделиться Опубликовано 8 сентября, 2015 До этого Вы писали что у Вас 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 tFeniks Опубликовано 8 сентября, 2015 Автор Поделиться Опубликовано 8 сентября, 2015 Все нормально. Компонент собрался, появился на панели инструментов, однако при компиляции проекта пишет, что не найдет файл battery.pas Где и как прописать пути для поиска этого компонента? Цитата Ссылка на комментарий
0 rareMax Опубликовано 8 сентября, 2015 Поделиться Опубликовано 8 сентября, 2015 Где и как прописать пути для поиска этого компонента? Цитата Ссылка на комментарий
0 tFeniks Опубликовано 8 сентября, 2015 Автор Поделиться Опубликовано 8 сентября, 2015 Наконец-то все заработало как нужно. Если у кого есть еще информация по следующим сопутствующим вопросам, то поделитесь. 1. Как добавить информацию о компоненте в SplaschScreen Delphi 2. Как добавить окно About в компонент Цитата Ссылка на комментарий
0 tFeniks Опубликовано 9 сентября, 2015 Автор Поделиться Опубликовано 9 сентября, 2015 С окном About вопрос решен Цитата Ссылка на комментарий
0 tFeniks Опубликовано 9 сентября, 2015 Автор Поделиться Опубликовано 9 сентября, 2015 Если кому будет интересно, нашел в исходниках 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} Цитата Ссылка на комментарий
Вопрос
tFeniks
кто может показать шаблон для невизуального компонента который будет работать на Androide и Delphi
Ссылка на комментарий
22 ответа на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.