Jump to content

Dave Nottage

Members
  • Content Count

    1608
  • Joined

  • Last visited

  • Days Won

    36

Everything posted by Dave Nottage

  1. Are you using the latest released version? i.e. Codex 2.2.0? If so, I'll revisit this since I haven't looked at it since upgrading to 12.1.
  2. Dave Nottage

    TWebBrowser + dynamic JS question

    There is no Document property, however there is a way of accessing the underlying web view (ICoreWebView2 on Windows, JWebView on Android and WKWebView on macOS/iOS), e.g. on Android: var LWebView: JWebView; begin if Supports(WebBrowser1, JWebView, LWebView) then // Do something with LWebView end; That said, as time goes on the underlying web view (on all platforms) has had direct access to HTML removed, so it has become necessary to execute JavaScript to achieve the same thing. Unfortunately, TWebBrowser has only EvaluateJavascript, which does not support returning a result, so it's necessary to use the technique above to achieve this, as I've done in the WebBrowserExt feature in Kastri (demo here). Using TWebBrowserExt, ExecuteJavaScript could be called with cJavaScriptGetPageContents (from the DW.JavaScript unit), thus: unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.WebBrowser, FMX.Controls.Presentation, FMX.StdCtrls, DW.WebBrowserExt; type TForm1 = class(TForm) WebBrowser1: TWebBrowser; Button1: TButton; procedure Button1Click(Sender: TObject); procedure WebBrowser1DidFinishLoad(ASender: TObject); private FWebBrowserExt: TWebBrowserExt; public constructor Create(AOwner: TComponent); override; end; var Form1: TForm1; implementation {$R *.fmx} uses DW.JavaScript; { TForm1 } constructor TForm1.Create(AOwner: TComponent); begin inherited; WebBrowser1.WindowsEngine := TWindowsEngine.EdgeOnly; // On Windows, unlikely to work with IE FWebBrowserExt := TWebBrowserExt.Create(WebBrowser1); end; procedure TForm1.WebBrowser1DidFinishLoad(ASender: TObject); begin FWebBrowserExt.ExecuteJavaScript(cJavaScriptGetPageContents, procedure(const AJavaScriptResult: string; const AErrorCode: Integer) begin // AJavaScriptResult should now contain the page contents end ); end; procedure TForm1.Button1Click(Sender: TObject); begin WebBrowser1.Navigate('http://help.websiteos.com/websiteos/example_of_a_simple_html_page.htm'); end; end. Not sure whether that answer was wrong in 2017, but it's certainly incomplete now, given the above.
  3. Dave Nottage

    Custom classes.dex in D12

    Does this mean you've moved on from attempting to generate a custom classes.dex? Going by their documentation, the init method needs to be called. (the one that takes a Context and a ScannerResult as parameters). This may present a problem because Delphi uses init as a method name for Java constructors, and XcBarcodeScanner has its own static method called init (which is not a constructor), so the JNI code may actually try and find a constructor method (and fail) rather than the actual method called init. I'm not sure if there's a solution for this yet, other than writing Java code of your own (that you would call from Delphi) that uses the XcBarcodeScanner class. Incidentally, I've managed to acquire the .jar file myself using information from the Github link you gave.
  4. Dave Nottage

    Custom classes.dex in D12

    I've tried searching for this with not much success. Do you have a link?
  5. Dave Nottage

    Custom classes.dex in D12

    What is the jar file, and is there some reason why just adding the jar to the project is not sufficient?
  6. In your unit, is there a debug info directive? i.e. if you have {$D-} or {$DebugInfo Off}, it will not include debug info.
  7. Dave Nottage

    Delphi 12.1 & iOS 17.4 Simulator

    What kind of Mac do you have? i.e. is it an M1 or M2, or an Intel-based Mac?
  8. Overwrite can be somewhat misleading. It refers to what happens when the file is deployed from the local file to the application package, not whether the file is overwritten when the app starts - this process occurs in the System.StartUpCopy unit (in the rtl\common folder of the Delphi source), and as evidenced by line 83 (at least in Delphi 12.1): if not FileExists(DestFileName) then //do not overwrite files ..when the files are put in their final destination, if the file exists it is not overwritten. A couple of possible workarounds: 1. Patch the System.StartUpCopy unit so that it does overwrite 2. Use files with "versioned" filenames, e.g. fudley-1.0.0.db, and replace the entry in the deployment with the new version. In your apps startup code, look for files using pattern matching, e.g: uses System.IOUtils; procedure TForm1.FormCreate(Sender: TObject); var LDBFiles: TArray<string>; begin LDBFiles := TDirectory.GetFiles(TPath.GetDocumentsPath, 'fudley-*.db', TSearchOption.soTopDirectoryOnly); // If there's only ever one file, it should be the value in LDBFiles[0], so rename that to fudley.db end;
  9. Dave Nottage

    Problem in edit1 android Delphi 12

    Does it work if starting a completely blank app, and putting a TEdit on the form? It works OK here
  10. Dave Nottage

    working with iOS island

    Same thing happened to me re Ios Island 🙂 Following the live activities link leads to: https://developer.apple.com/documentation/ActivityKit/displaying-live-data-with-live-activities Which talks about using Widget Extensions, which are yet to be possible in Delphi, however there's a slim chance that the extension can "talk" to Delphi code: https://blog.grijjy.com/2018/11/15/ios-and-macos-app-extensions-with-delphi/ I have very little optimism about the possibility
  11. Dave Nottage

    Delphi 11.3 with Android SDK 33

    Correct - I have reported this nearly 2 years ago: https://quality.embarcadero.com/browse/RSP-38976
  12. Dave Nottage

    Delphi 11.3 with Android SDK 33

    targetSdkVersion refers to the highest API level that your app can target, not which API level in your SDK that you built against. If Play Store says your app targets API level 32, check AndroidManifest.xml in the project output folder for which you built the app for Play Store. You may just need to do a clean and rebuild to ensure that AndroidManifest.xml is updated.
  13. Dave Nottage

    Delphi 11.3 with Android SDK 33

    This says otherwise: https://blogs.embarcadero.com/delphi-supports-android-api-33-via-yukon-beta/ Please see also:
  14. Dave Nottage

    DRM video player

    No - the Alcinoe implementation is based on the old ExoPlayer (in the com.google.android.exoplayer2 namespace). I am working on an implementation that uses Media3, but only just today have experimental code working that plays a video from a nominated URI.
  15. Dave Nottage

    Creating dylibs for iOS

    https://stackoverflow.com/a/36041595/3164070
  16. Dave Nottage

    Browse for Image, Android

    Browsing outside of the application itself requires intents. You could use Kastri, which has this Files Selector demo.
  17. Dave Nottage

    Java type JExoPlayer_Builder could not be found

    Which version of Delphi are you using, and which target? i.e. Android 32-bit, or Android 64-bit? If you're using Delphi 11.3 and are compiling for Android 64-bit, please see this link.
  18. Dave Nottage

    How to check for Delphi update?

    This is GetIt Package Manager configured to show what patches/hotfixes are available, and an arrow pointing to what to select to show whether updates are available:
  19. Background: I'm working on an implementation of Geofencing on Android, based on this documentation: https://developer.android.com/training/location/geofencing ..and based on their example on Github: https://github.com/android/location-samples/tree/master/Geofencing To be able to help with this, you will likely need some Java skills, and know about Android intents and receivers. I don't know completely everything about them, hence the request for help Demo: I've attached the work in progress demo, which should compile as-is, i.e. it should not be dependent on anything - it uses files from Kastri, but I have copied them into the project. I've also included the source for the Java parts, as a reference. The corresponding binary is dw-geofence.jar, which is included in the Lib folder of the project. The demo sets up 3 geofence regions. Tapping the Start button first requests location permissions - in order for geofencing to work, you need to tap on "Allow in settings": ..and select the "Allow all the time" option: (then tap the back arrow at the top) If geofence starts successfully, a message will appear in the memo: Action: 1, Result: 0, Message: (Action of 1 = start monitoring, Result of 0 = success) Simulating changes in location: So that you don't actually have to physically move anywhere, fortunately on Android it is possible to simulate location changes by using a "mock gps" app, such as this one: https://play.google.com/store/apps/details?id=org.hola.gpslocation Once installed, you need to go into the Developer Options of the Settings app on the device, and set the mock locations app: Then use the mock locations app to change your location to one of the geofence regions created by the AddRegions method of TMainView in AG.View.Main in the project. The problem I find that when moving into/out of the regions, the GeofenceIntentReceiver is not being "triggered", i.e. onReceive is not being called. If someone is able to help, it would be greatly appreciated. AGDemo.zip
  20. Dave Nottage

    Delphi 12 Android - White background at start

    I'm curious as to what settings you changed to disable the splash screen. I can't work it out - I unchecked "Include Splash Images" but it still shows the splash. I guess there's more to it than that?
  21. I'm looking at extracting compiler options from .dproj files, and looked for an existing "map" of options to PropertyGroup entries, but came up blank, so I figured I'd create one. I'm hoping that others could help verify what I've come up with as well as fill in some blanks. The following was created from the output of the help from dcc32, and from looking through the DCCStrs unit for what appears to match. The value from DCCStrs is on the line following each option. The numbers after some of the DCCStrs value are what also appear in the DCCStrs source. Those I couldn't match are signified with: ??? Compiler Options: -A<unit>=<alias> = Set unit alias DCC_UnitAlias -B = Build all units DCC_BuildAllUnits -CC = Console target DCC_ConsoleTarget -CG = GUI target ??? -D<syms> = Define conditionals DCC_Define -E<path> = EXE/DLL output directory DCC_ExeOutput -F<offset> = Find error DCC_FindError -GD = Detailed map file DCC_MapFile -GP = Map file with publics DCC_MapFile -GS = Map file with segments DCC_MapFile -H = Output hint messages DCC_Hints -I<paths> = Include directories DCC_IncludePath -J = Generate .obj file DCC_ObjOutput -JPHNE = Generate C++ .obj file, .hpp file, in namespace, export all ??? -JL = Generate package .lib, .bpi, and all .hpp files for C++ ??? -K<addr> = Set image base addr DCC_ImageBase -LE<path> = package .bpl output directory DCC_BplOutput -LN<path> = package .dcp output directory DCC_DcpOutput -LU<package> = Use package DCC_UsePackage -M = Make modified units DCC_MakeModifiedUnits -NU<path> = unit .dcu output directory DCC_DcuOutput -NH<path> = unit .hpp output directory DCC_HppOutput -NO<path> = unit .obj output directory DCC_ObjOutput -NB<path> = unit .bpi output directory DCC_BpiOutput -NX<path> = unit .xml output directory DCC_XmlOutput -NS<namespaces> = Namespace search path DCC_Namespace -O<paths> = Object directories DCC_ObjPath -P = look for 8.3 file names also DCC_OldDosFileNames -Q = Quiet compile DCC_Quiet -R<paths> = Resource directories DCC_ResourcePath -TX<ext> = Output name extension DCC_OutputExt -U<paths> = Unit directories DCC_UnitSearchPath -V = Debug information in EXE DCC_DebugInfoInExe -VR = Generate remote debug (RSM) DCC_RemoteDebug -VT = Debug information in TDS DCC_DebugInfoInTDS -VN = TDS symbols in namespace ?? -W[+|-|^][warn_id] = Output warning messages DCC_Warnings -Z = Output 'never build' DCPs DCC_OutputNeverBuildDcps -$<dir> = Compiler directive DCC_Define Compiler Toggles: A8 Aligned record fields DCC_Alignment (0, 1, 2, 4, 8) B- Full boolean Evaluation DCC_FullBooleanEvaluations C+ Evaluate assertions at runtime DCC_AssertionsAtRuntime D+ Debug information DCC_DebugInformation (0, 1, 2) [Depending on platform?] G+ Use imported data references DCC_ImportedDataReferences H+ Use long strings by default DCC_LongStrings I+ I/O checking DCC_IOChecking J- Writeable structured consts DCC_WriteableConstants L+ Local debug symbols DCC_LocalDebugSymbols M- Runtime type info DCC_RunTimeTypeInfo O+ Optimization DCC_Optimize P+ Open string params DCC_OpenStringParams Q- Integer overflow checking DCC_IntegerOverflowCheck R- Range checking DCC_RangeChecking T- Typed @ operator DCC_TypedAtParameter U- Pentium(tm)-safe divide DCC_PentiumSafeDivide V+ Strict var-strings DCC_StrictVarStrings W- Generate stack frames DCC_GenerateStackFrames X+ Extended syntax DCC_ExtendedSyntax Y+ Symbol reference info DCC_SymbolReferenceInfo (0, 1, 2) [Depending on platform?] Z1 Minimum size of enum types DCC_MinimumEnumSize (1, 2, 4)
  22. Dave Nottage

    TFrame versus SubForm

    The biggest problem is when you create descendant forms (i.e. at design-time) where the ancestor contains frames. Otherwise, for me they're totally fine.
  23. Dave Nottage

    Notifications individual Sound doesn't work

    Which forum posts, and which tutorials? Sounds on Android are no longer associated with the notification itself, rather they are now associated with the channel via the SoundName property. Note that you need to add the mp3 file to the deployment using a RemotePath of res\raw, and use the filename without the extension for the SoundName on the channel, e.g. for mysound.mp3, use a value of mysound for SoundName. On iOS, you need to deploy the sound file with a RemotePath of .\, and use the actual filename for SoundName on the notification (i.e. not the channel)
  24. Dave Nottage

    GrijjyCloudLogger & D12

    Is using the Console app to view log statements not an option?
×