-
Постов
842 -
Зарегистрирован
-
Победитель дней
123
Активность репутации
-
Andrey Efimov получил реакцию от Rusland в Что невозможно сделать на Delphi для Android?
Не обманывай людей . Это что: procedure onReceivePermissionsResult(const ASender: TObject; const AMessage: TMessage); ?
-
Andrey Efimov получил реакцию от DMS в Запрос "опасных" разрешений в рантайме
Добавляем метод onRequestPermissionsResult в приложение
-
Andrey Efimov отреагировална #WAMACO в Служба - двухсторонняя связь
Сначала человек пишет...
потом...
Товарищ, но в АС же JAVA! :)) хохмачи конечно... удивляюсь каждый раз...
-
Andrey Efimov получил реакцию от Ingalime в Служба - двухсторонняя связь
Например вот так.
в программе:
var LIntent: JIntent; begin LIntent := TJIntent.Create; LIntent.setClassName(TAndroidHelper.Context.getPackageName(), StringToJString('com.embarcadero.services.nameservice')); LIntent.putExtra(StringToJString('NameForValue'), StringToJString('Value')); TAndroidHelper.Activity.StartService(LIntent); в сервисе:
function TDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer; var Value: string; begin Value := JStringToString(Intent.getStringExtra(StringToJString('NameForValue'))); // дальше что-то делаем end;
-
Andrey Efimov получил реакцию от S_007 в Служба - двухсторонняя связь
Например вот так.
в программе:
var LIntent: JIntent; begin LIntent := TJIntent.Create; LIntent.setClassName(TAndroidHelper.Context.getPackageName(), StringToJString('com.embarcadero.services.nameservice')); LIntent.putExtra(StringToJString('NameForValue'), StringToJString('Value')); TAndroidHelper.Activity.StartService(LIntent); в сервисе:
function TDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer; var Value: string; begin Value := JStringToString(Intent.getStringExtra(StringToJString('NameForValue'))); // дальше что-то делаем end;
-
Andrey Efimov получил реакцию от МихаилЪ чайковЪ в Что невозможно сделать на Delphi для Android?
Не обманывай людей . Это что: procedure onReceivePermissionsResult(const ASender: TObject; const AMessage: TMessage); ?
-
Andrey Efimov получил реакцию от Евгений Корепов в Что невозможно сделать на Delphi для Android?
Не обманывай людей . Это что: procedure onReceivePermissionsResult(const ASender: TObject; const AMessage: TMessage); ?
-
Andrey Efimov получил реакцию от AngryOwl в Что невозможно сделать на Delphi для Android?
Не обманывай людей . Это что: procedure onReceivePermissionsResult(const ASender: TObject; const AMessage: TMessage); ?
-
Andrey Efimov получил реакцию от DMS в Что невозможно сделать на Delphi для Android?
Не обманывай людей . Это что: procedure onReceivePermissionsResult(const ASender: TObject; const AMessage: TMessage); ?
-
Andrey Efimov получил реакцию от x11 в Что невозможно сделать на Delphi для Android?
Не обманывай людей . Это что: procedure onReceivePermissionsResult(const ASender: TObject; const AMessage: TMessage); ?
-
Andrey Efimov получил реакцию от ENERGY в Что невозможно сделать на Delphi для Android?
Не обманывай людей . Это что: procedure onReceivePermissionsResult(const ASender: TObject; const AMessage: TMessage); ?
-
Andrey Efimov получил реакцию от Hevard в Как узнать версию приложения под Android?
Например, вот так:
{for Delphi XE6/XE7: Add to "uses" module "Androidapi.Helpers"} uses Androidapi.JNI.JavaTypes, FMX.Helpers.Android, Androidapi.JNI.GraphicsContentViewText; var PackageManager: JPackageManager; VersionPackage,PackageName: JString; begin PackageManager := SharedActivity.getPackageManager; PackageName := SharedActivityContext.getPackageName; VersionPackage := PackageManager.getPackageInfo(PackageName, 0).versionName; Label1.Text := JStringToString(VersionPackage); p.s. Для подобных вопросов, у меня в блоге есть страничка "JNI Code Snippet"
-
Andrey Efimov получил реакцию от Tumaso в Запрос "опасных" разрешений в рантайме
Добавляем метод onRequestPermissionsResult в приложение
-
Andrey Efimov получил реакцию от Kitty в Прозрачность TlistViewItem
Через стиль можно сделать, "itembackground.color" ставим Null. Ну и прозрачность у самого компонента включаем.
-
Andrey Efimov получил реакцию от Виталий Иванов в Прозрачность TlistViewItem
Через стиль можно сделать, "itembackground.color" ставим Null. Ну и прозрачность у самого компонента включаем.
-
Andrey Efimov получил реакцию от DMS в Узнать дату Android приложения
Вот так попробуйте:
uses Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.JavaTypes, Androidapi.Helpers, Androidapi.JNI.App; procedure TForm1.Button1Click(Sender: TObject); var PackageManager: JPackageManager; PackageName: JString; LastUpdateTime: Int64; begin PackageManager := TAndroidHelper.Activity.getPackageManager; PackageName := TAndroidHelper.Context.getPackageName; LastUpdateTime := PackageManager.getPackageInfo(PackageName, 0).lastUpdateTime; // firstInstallTime end;
p.s. А вообще, это вы должны были ещё в первом посте указать версию среды...
-
Andrey Efimov отреагировална krapotkin в Сохранить дату после uninstall
любую Shared папку, которую вам не жалко "захламлять". В остальные вас система не пустит, а не-shared уйдут вместе с программой
-
Andrey Efimov отреагировална Brovin Yaroslav в Приведение типа - as
Если посмотреть, что вызывается под капотом для случая с интерфейсами, то можно увидеть:
1. Для вызова Interface1(Instance), вызывает системный метод _IntfCopy, который по сути не проверяет типы, а просто увеличивает счетчик типов. Такое приведение типов не проверяет типы, а просто копирует указатель а реализацию.
procedure _IntfCopy(var Dest: IInterface; const Source: IInterface); {$IFDEF PUREPASCAL} var P: Pointer; begin P := Pointer(Dest); if Source <> nil then Source._AddRef; Pointer(Dest) := Pointer(Source); if P <> nil then IInterface(P)._Release; end; {$ELSE} 2. При использовании оператора as будет вызван _IntfCast, который выполняет честное приведение типов через QueryInterface. Поэтому в этом случае вы получите на выходе честный указатель на таблицу интерфейса, если интерфейс поддерживается объектом.
procedure _IntfCast(var Dest: IInterface; const Source: IInterface; const IID: TGUID); {$IF defined(PUREPASCAL) or defined(PIC)} // PIC: EBX must be correct before calling QueryInterface var Temp: Pointer; begin if Source = nil then Dest := nil else begin Temp := nil; if Source.QueryInterface(IID, IInterface(Temp)) <> 0 then ErrorAt(byte(reIntfCastError), ReturnAddress) else begin if Assigned(Dest) then Dest._Release; Pointer(Dest) := Temp; end; end; end;
-
Andrey Efimov получил реакцию от x11 в DisposeOf или Free?
Жизненный цикл объектов в Delphi. Часть 1. Windows, OSX. Что же использовать Destroy, Free, FreeAndNil или DisposeOf? Жизненный цикл объектов в Delphi. Часть 2. Android, iOS. Что же использовать Destroy, Free, FreeAndNil или DisposeOf? -
Andrey Efimov получил реакцию от Равиль Зарипов (ZuBy) в Запрос "опасных" разрешений в рантайме
Добавляем метод onRequestPermissionsResult в приложение
-
-
Andrey Efimov получил реакцию от Ingalime в Не запускается служба
Значит вы не правильно собрали приложение. Этот apk файл собран в "RAD Studio 10.2 Tokyo Release 2 (без фиксов)" только что и протестирован на Андроид 4.4.2 (что под рукой было...).
-
Andrey Efimov отреагировална Евгений Корепов в JSON Pretty Print - красивый JSON
Долго мучался отсутствием штатного средства красивого вывода JSON в текст, все что есть в комплекте, в REST к примеру, выводит убогую, не читаемую кашу. Плюнул и на написал свою функцию, на базе REST TSON.Format.
function JsonPrettyPrint(AJsonValue : TJsonValue; AIndent : string = ' ') : string; var SourceContent: string; AChar: char; EOL: string; LeftIndent: string; isEOL: boolean; isInString: boolean; isInArray: boolean; isEscape: boolean; begin Result:=''; EOL:=#13#10; AIndent:= ' '; LeftIndent:=''; isEOL:=true; isInString:=false; isInArray:=false; isEscape:=false; SourceContent := AJsonValue.ToString; //This will basically display all strings as Delphi strings. Technically we should show "Json encoded" strings here. for AChar in SourceContent do begin case AChar of '{' : if not isInString and not isInArray then begin Result := Result + AChar + EOL; LeftIndent := LeftIndent + AIndent; Result := Result + LeftIndent; isEOL := true; end; ',' : if not isInString and (AChar = ',') then begin isEOL := false; if isInArray then Result := Result + AChar + ' ' else Result := Result + AChar + EOL + LeftIndent; end; '}' : if not isInString then begin Delete(LeftIndent, 1, Length(AIndent)); if not isEOL then Result := Result + EOL; Result := Result + LeftIndent + AChar; end; ':' : if not isInString and (AChar = ':') then Result := Result + AChar + ' '; else begin isEOL := false; Result := Result + AChar; end; end; isEscape := (AChar = '\') and not isEscape; if not isEscape and (AChar = '"') then isInString := not isInString; if not isEscape and (AChar = '[') then isInArray:=True; if not isEscape and (AChar = ']') then isInArray:=False; end; end; Результат налицо:
{ "Rig": { "Name": "node07", "Account": "3DQ9fRMVfxHaT7noy7molmuhlCI3RQkxt2y8BB", "PowerCost": [4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43, 4.43] }, "ExcavatorInstance": { "Host": "192.168.0.156", "Port": 38080, "APIToken": "asevsdrbdrtnetyjer34yb435t", "ConnectionType": "HTTP" }, "Devices": { "DeviceType": "", "UseDevices": [0, 1, 2, 3, 4] }, "Algorithms": { "cryptonight": { "Enable": true, "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500], "WorkerPerDevice": 1, "WorkerParameters": [32, "M=2", 876], "Speed": 1506138068.81243, "Power": 851 }, "lbry": { "Enable": true, "Devices_TDP_CoreDelta_MemoryDelta": [95, 120, -1000], "WorkerPerDevice": 1, "WorkerParameters": [], "Speed": 1506138068.81243, "Power": 851 }, "pascal": { "Enable": true, "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500], "WorkerPerDevice": 1, "WorkerParameters": [], "Speed": 1506138068.81243, "Power": 851 }, "decred": { "Enable": true, "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500], "WorkerPerDevice": 1, "WorkerParameters": [], "Speed": 1506138068.81243, "Power": 851 }, "neoscrypt": { "Enable": true, "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500], "WorkerPerDevice": 1, "WorkerParameters": [], "Speed": 1506138068.81243, "Power": 851 }, "daggerhashimoto": { "Enable": true, "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500], "WorkerPerDevice": 1, "WorkerParameters": [], "Speed": 1506138068.81243, "Power": 851 }, "daggerhashimoto_decred": { "Enable": true, "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500], "WorkerPerDevice": 1, "WorkerParameters": [], "Speed": 1506138068.81243, "Power": 851 }, "daggerhashimoto_sia": { "Enable": true, "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500], "WorkerPerDevice": 1, "WorkerParameters": [], "Speed": 1506138068.81243, "Power": 851 }, "lyra2rev2": { "Enable": true, "Devices_TDP_CoreDelta_MemoryDelta": [95, 120, -1000], "WorkerPerDevice": 1, "WorkerParameters": [], "Speed": 1506138068.81243, "Power": 851 }, "blake2s": { "Enable": true, "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500], "WorkerPerDevice": 1, "WorkerParameters": [], "Speed": 1506138068.81243, "Power": 851 }, "equihash": { "Enable": true, "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500], "WorkerPerDevice": 1, "WorkerParameters": ["2", "M=1", "676556"], "Speed": 1506138068.81243, "Power": 851 }, "daggerhashimoto_pascal": { "Enable": true, "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500], "WorkerPerDevice": 1, "WorkerParameters": [], "Speed": 1506138068.81243, "Power": 851 }, "keccak": { "Enable": true, "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500], "WorkerPerDevice": 1, "WorkerParameters": [], "Speed": 1506138068.81243, "Power": 851 }, "sia": { "Enable": true, "Devices_TDP_CoreDelta_MemoryDelta": [108, 150, 500], "WorkerPerDevice": 1, "WorkerParameters": [], "Speed": 1506138068.81243, "Power": 851 } } } Конкретно в текущем случае, массивы мне нужны были в одну строку. Кому понадобиться иное - закомментируйте последние 4 строки.
-
Andrey Efimov отреагировална dnekrasov в formatter options
Tools->Options - Formatter->Delphi->Line breaks - General->Right margin
-
Andrey Efimov отреагировална Олег Киреев в Подбор и расчёт карданного вала v18.0 для OS Window
Здравсвуйте Уважаемый Gasche.
Так и задумано для того чтобы помещалась вся информация после того как выполнены необходимые предварительные действия и перед тем как сохранить всё в картинку. Вот посмотрите в приложении как это выглядит.
С Уважением. Олег.