Ingalime
-
Постов
354 -
Зарегистрирован
-
Посещение
-
Победитель дней
5
Активность репутации
-
Ingalime отреагировална haword в RAD 11 и Android
embarcadero говорят что не надо так делать, только то sdk что идет с дистрибутивом будет 100% работать.
-
Ingalime отреагировална krapotkin в RAD 11 и Android
По мне, лучший вариант - скачать Android Studio и там в настройках уже найти SDK manager и установить SDK/NDK в папки, которые лежат на вменяемой глубине.
Delphi натравить на эти папки в настройках.
Я делаю так со времен Seattle и пока не подводила стратегия.
-
Ingalime отреагировална alikoder в RAD 11 и Android
Студия ставилась без интернета судя по всему, просто укажите sdk вручную, скачав ее с оф сайта.
-
-
Ingalime отреагировална Александр Алексеев в Как правильно задать разрешения приложению на доступ к файлам?
Вроде разобрался:
В момент показа формы FormShow вызываю метод проверки прав доступа CheckPermissions. А в нём передаётся имя метода, который будет сообщать о результате действий пользователя LocationPermissionRequestResult
//---------------------------------------------------------------------------
void __fastcall TForm2::CheckPermissions(TObject *Sender)
{ // Проверка прав доступа
String READ_EXTERNAL_STORAGE;
READ_EXTERNAL_STORAGE=JStringToString(TJManifest_permission::JavaClass->READ_EXTERNAL_STORAGE);
//PermissionsService->DefaultService->RequestPermissions(READ_EXTERNAL_STORAGE);
DynamicArray<String> permissions;
permissions.Length = 1;
permissions[0] = READ_EXTERNAL_STORAGE;
PermissionsService()->RequestPermissions(permissions,LocationPermissionRequestResult);
}
//---------------------------------------------------------------------------
void __fastcall TForm2::LocationPermissionRequestResult(TObject *Sender, const DynamicArray<String> APermissions, const DynamicArray<TPermissionStatus> AGrantResults)
{ // 2 permissions involved: ACCESS_COARSE_LOCATION and ACCESS_FINE_LOCATION
bool LocationPermissionGranted = (AGrantResults.Length == 1) && (AGrantResults[0] == TPermissionStatus::Granted);
if (LocationPermissionGranted) ;//ShowMessage("User granted permission");
else {
if (Lang=="en") ShowMessage("User denied permission!");
else ShowMessage("Пользователь запретил доступ!");
Form2->Close();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormShow(TObject *Sender)
{
// Проверка прав доступа
CheckPermissions(this);
}
//---------------------------------------------------------------------------
-
Ingalime отреагировална haword в Целевой уровень API
новый андроид, новая sdk, новая делфи или с++ билдер )
-
Ingalime отреагировална OnePeople в Как правильно задать разрешения приложению на доступ к файлам?
Для доступа к памяти вам нужно запросить необходимые разрешения в реальном времени, на форуме куча примеров
-
Ingalime отреагировална OnePeople в Целевой уровень API
Я не знаю но думаю так по памяти, в AndroidManifest.template: targetSdk=30.
-
-
Ingalime отреагировална haword в Смещение CANVSa или почему? при печати на принтер
то же самое просто ставить развилки в зависимости от ос )
по винде можно попробовать этот вариант из интернета
type TMargins = record Left, Top, Right, Bottom: Double end; procedure GetPrinterMargins(var Margins: TMargins); var PixelsPerInch: TPoint; PhysPageSize: TPoint; OffsetStart: TPoint; PageRes: TPoint; begin PixelsPerInch.y := GetDeviceCaps(Printer.Handle, LOGPIXELSY); PixelsPerInch.x := GetDeviceCaps(Printer.Handle, LOGPIXELSX); Escape(Printer.Handle, GETPHYSPAGESIZE, 0, nil, @PhysPageSize); Escape(Printer.Handle, GETPRINTINGOFFSET, 0, nil, @OffsetStart); PageRes.y := GetDeviceCaps(Printer.Handle, VERTRES); PageRes.x := GetDeviceCaps(Printer.Handle, HORZRES); // Top Margin Margins.Top := OffsetStart.y / PixelsPerInch.y; // Left Margin Margins.Left := OffsetStart.x / PixelsPerInch.x; // Bottom Margin Margins.Bottom := ((PhysPageSize.y - PageRes.y) / PixelsPerInch.y) - (OffsetStart.y / PixelsPerInch.y); // Right Margin Margins.Right := ((PhysPageSize.x - PageRes.x) / PixelsPerInch.x) - (OffsetStart.x / PixelsPerInch.x); end; function InchToCm(Pixel: Single): Single; // Convert inch to Centimeter begin Result := Pixel * 2.54 end; procedure TForm1.Button2Click(Sender: TObject); var Margins: TMargins; begin GetPrinterMargins(Margins); ShowMessage(Format('Margins: (Left: %1.3f, Top: %1.3f, Right: %1.3f, Bottom: %1.3f)', [InchToCm(Margins.Left), InchToCm(Margins.Top), InchToCm(Margins.Right), InchToCm(Margins.Bottom)])); end; а вообще может просто лист не правильно в принтер вставляешь?)
-
Ingalime отреагировална OnePeople в Смещение CANVSa или почему? при печати на принтер
DialogService: IFMXDialogService;
FMargin, FMinMargin: TRect;
FPaperSize: TPointf;
FUnits: TPageMeasureUnits;
FOptions : TPageSetupDialogOptions;
begin
if TPlatformServices.Current.SupportsPlatformService(IFMXDialogService, DialogService) then
DialogService.PageSetupGetDefaults(FMargin, FMinMargin, FPaperSize, FUnits, FOptions);
Text8.Text := FMinMargin.Left.ToString + ' ' + FMinMargin.Top.ToString;
А так сколько показывает?
-
Ingalime отреагировална haword в Смещение CANVSa или почему? при печати на принтер
картинка ровная в image1 а на принтере косо? а так тоже криво?
Printer.Canvas.DrawBitmap(Image1.Bitmap, RectF(0,0, Image1.Bitmap.Width, Image1.Bitmap.Height) , RectF(0,0, Printer.PageWidth, Printer.PageHeight), 1);
-
Ingalime отреагировална snake в THorzScrollBox внутри TVerticalScrollBox, блокирует вертикальную прокрутку
так никто не отвечает. приходится искать и выдумывать самому.
хотя наверняка на эти грабли уже наступали 100500 раз.
мало того, но я написал как решил проблему сам и попросил "подскажите как сделать правильнее ", т.е. может Вы просто не внимательно читаете
-
Ingalime отреагировална slav_z в THTTPClient эмуляция синхронности
вообще замораживать пользовательский интерфейс на время запроса плохая идея для любой ОС... но вы же это и хотите? у андроида есть ограничения на запросы в основном потоке приложения, поэтому запрос запустится в отдельном потоке (так сделано в реализации http клиента для андроида "внутри")... поэтому андроид не будет против вызова данной синхронной операции... (см. реализацию THTTPClient.ExecuteHTTP() в модуле System.Net.HttpClient)
если хотите сделать нормально, то конечно не запускайте http запросы в основном потоке приложения ни под какой OC...
-
Ingalime отреагировална snake в THorzScrollBox внутри TVerticalScrollBox, блокирует вертикальную прокрутку
Сделал так - это швах, но работает
так что сильно не ругайте, лучше таки подскажите как сделать правильнее
TMyFrame = class(TFrame) .... public Function GetControl(Control:TCustomScrollBox; SrcPoint:TPointF):TControl; .... end; implementation function TMyFrame.GetControl(Control: TCustomScrollBox; SrcPoint:TPointF): TControl; var i:Integer; fm:TFMXObject; vp,tp:TPointF; function GetChildControl(Control:TControl):TControl; var i:Integer; c:TControl; Begin result:=nil; if Control.ChildrenCount > 0 then begin for i:=0 to Control.ChildrenCount-1 do Begin if (Control.Children[i].Name<>'') then Begin c:=TControl(Control.Children[i]); if (c.position.X<tp.X) and ((c.Position.X+c.Width)>tp.X) and (c.position.Y<tp.Y) and ((c.Position.Y+c.Height)>tp.Y) then result:=c; End; if (TControl(Control.Children[i]).ChildrenCount>0) and (result=nil) then result:=GetChildControl(TControl(Control.Children[i])); End; end; End; begin vp:=Control.ViewportPosition; tp.X:=SrcPoint.X+vp.X; tp.Y:=SrcPoint.Y+vp.Y; result:=GetChildControl(Control); end; //узнаем какой контрол под кликом мышки procedure TMyFrame.HorzScrollBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); var Point:TPointF; c:TControl; begin Point.X:=X; Point.Y:=Y; c:=GetControl(HorzScrollBox1,point); // if c<>nil Then form1.Debug.Add(c.Name); end; //узнаем какой контрол под тапком procedure TMyFrame.HorzScrollBox1Tap(Sender: TObject; const Point: TPointF); var c:TControl; begin c:=GetControl(HorzScrollBox1,point); // if c<>nil Then form1.Debug.Add(c.Name); end;
-
Ingalime отреагировална OnePeople в Как вместе с программой установить файл базы данных?
procedure TForm1.UpdateAsset(AssetName, FilePath: String); var inputStream: JInputStream; FileOutputStream: JFileOutputStream; WData: TJavaArray<Byte>; LData: Integer; begin try InputStream := TAndroidHelper.Context.getAssets.open(StringToJString(AssetName)); except exit; end; try FileOutputStream := TJFileOutputStream.JavaClass.init(StringToJString(FilePath)); except exit; end; WData := TJavaArray<Byte>.Create(4096); repeat try LData := InputStream.read(WData); except LData := -1; end; if LData <> -1 then begin FileOutputStream.write(WData, 0, LData); end; until (LData = -1) or (LData = 0); FileOutputStream.flush; FileOutputStream.close; inputStream.close; end; Обновление файла из assets в папку с программой
Пользоваться так проверяете при Form.Create что версия новая и вызываете UpdateAsset('internal/base.db', ApplicationPath + 'base.db');
-
Ingalime отреагировална alxsev в [Статья][AdMob] Добавляем рекламный блок в приложение
тоже интересует этот вопрос
-
Ingalime отреагировална Maka в [Статья][AdMob] Добавляем рекламный блок в приложение
Кто-то уже адаптировал код Interstitial рекламы для RadStudio 11? Поделитесь, если не жалко
-
Ingalime отреагировална Alex7wrt в [Статья][AdMob] Добавляем рекламный блок в приложение
http://www.tahribat.com/forum/android---delphi-xe7-firemonkey-admob-interstitial-204528
-
Ingalime отреагировална Andrey Efimov в [Статья][AdMob] Добавляем рекламный блок в приложение
Ну, про настройку, вывод и уплату налогов, полно статей в интернете. У меня была цель, описать интеграцию рекламы в приложение, а не общую инструкцию по использованию сайта AdMob.
p.s. Про сервисы Firebase (Analytics, Cloud Messaging и т.д.), ещё не успел рассмотреть эту тему, но в планах есть.
-
Ingalime отреагировална OnePeople в Как вместе с программой установить файл базы данных?
Можно не писать в startupcopy.pas есть методы обновления ассетов. Самому лень писать))))
I feel that files that need to be deployed are files that should not and need not be changed by the application. They are resources like images. If an application changes a file, it does so with intent. The user via the developer wanted it that way. Changing it back through an update causes data loss. As a consequence all files that could be subject to change should not be deployed but generated when used.
-
Ingalime отреагировална OnePeople в Как вместе с программой установить файл базы данных?
Если будете загружать файл в deployment тогда ваша база будет здесь
Для remote path: assets\internal
TPath.Combine(TPath.GetDocumentsPath, 'filename') { Internal } Для remote path: assets
TPath.Combine(TPath.GetPublicPath, 'filename') { External } Есть же в конце то концов https://docwiki.embarcadero.com/RADStudio/Sydney/en/Creating_an_Android_App#Loading_and_Deploying_Files
-
-
Ingalime отреагировална OnePeople в [Android]Входящий звонок
if TJBuild_VERSION.JavaClass.SDK_INT >= 26 then begin playbackAttributes := TJAudioAttributes_Builder.Create .setUsage(TJAudioAttributes.JavaClass.USAGE_MEDIA) .setContentType(TJAudioAttributes.JavaClass.CONTENT_TYPE_MUSIC) .build(); AudioFocusRequest:=TJAudioFocusRequest_Builder(TJAudioManager.JavaClass.AUDIOFOCUS_GAIN).Create .setAudioAttributes(playbackAttributes) .setAcceptsDelayedFocusGain(true) .setOnAudioFocusChangeListener(afChangeListener, afHandler) .build(); res := FAudioManager.requestAudioFocus(AudioFocusRequest); end else begin res := FAudioManager.requestAudioFocus(afChangeListener, TJAudioManager.JavaClass.STREAM_MUSIC, TJAudioManager.JavaClass.AUDIOFOCUS_GAIN); end;
-
Ingalime отреагировална haword в Выполнен захват SQL.
Добрый день.
Чем не понравилось мое решение? Надо просто пробежаться по всем параметрам TFDQuery и в зависимости от типа поля получить значение и сохранить его или поместить в сам запрос. Но помещая его в сам запрос нужно будет конвертировать вручную по типу, особенно даты.
Why didn't you like my answer? You just need to loop through all TFDQuery parameters in a loop and, depending on the type of the field, get the value, save it, or put it into the query itself. But placing it in the query itself will need to be converted manually by type, especially the date.