I'm currently updating an old Delphi 5 Desktop VCL application to to Delphi 11.3 FMX. And one of the capabilities I want to provide is the ability to launch several webpages from within the application. I want to place a link in the main menu to my YouTube channel so customers can easily get to product videos. And there's also a link to my website in the Help > About box.
It was fairly straightforward the last time I did this using VCL because all I had to worry about was the Windows side of things. However, because I want this application to run on both Windows and macOS it presented a challenge.
The Delphi IDE won't recognize the Macapi namespace unless the target is set to MacOS 64-bit
Harry Stahl covers the COCOA API on pages 98-99 of his book Cross-Platform Development with Delphi. He also gives an example of how to use the NSWorkspace object of Macapi.Appkit. However, he doesn't show how to setup the uses clause.
I also found a fantastic reference on stackoverflow by David Heffernan that was written in 2015. However, there are two issues with Heffernan's if you are looking for a complete answer:
- There is a reference to a blog post by Malcolm Groves called Opening files and URLs in default applications in OS X which is no longer available or accessible.
- The example doesn't tell you you need to target the MacOS 64-bit platform before the IDE will recognize Macapi namespace..
Video demonstration of the below source code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | object Form1: TForm1 Left = 0 Top = 0 Caption = 'Goto Website' ClientHeight = 238 ClientWidth = 478 Position = ScreenCenter FormFactor . Width = 320 FormFactor . Height = 480 FormFactor . Devices = [Desktop] DesignerMasterStyle = 0 object Text1: TText AutoSize = True Cursor = crHandPoint Position . X = 116.000000000000000000 Position . Y = 83.000000000000000000 Size . Width = 246.078125000000000000 Size . Height = 31.921875000000000000 Size . PlatformDefault = False TextSettings . Font . Size = 24.000000000000000000 TextSettings . FontColor = claMediumblue OnClick = Text1Click OnMouseEnter = Text1MouseEnter OnMouseLeave = Text1MouseLeave end end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | 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 . Objects; type TForm1 = class (TForm) Text1: TText; procedure Text1MouseEnter(Sender: TObject); procedure Text1MouseLeave(Sender: TObject); procedure Text1Click(Sender: TObject); private { Private declarations } public { Public declarations } end ; var Form1: TForm1; implementation {$R *.fmx} uses u . OpenURL; { TForm1 } procedure TForm1 . Text1Click(Sender: TObject); begin GotoWebsite(Text1 . Text); end ; procedure TForm1 . Text1MouseEnter(Sender: TObject); begin Text1 . Font . Style := Text1 . Font . Style + [TFontStyle . fsUnderline]; end ; procedure TForm1 . Text1MouseLeave(Sender: TObject); begin Text1 . Font . Style := Text1 . Font . Style - [TFontStyle . fsUnderline]; end ; end . |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | { +------------------------------------------------------------------------------- ¦ Filename: u.OpenURL Unit ¦ Author: Michael J. Riley ¦ Website: https://zilchworks.com ¦ YouTube: https://www.youtube.com/@CapeCodGunny ¦ Copyright: © 2023-2024 by Michael J. Riley. All Rights Reserved. +------------------------------------------------------------------------------- ¦ Purpose: Opens a url using the default browser on the users system. ¦ ¦ OS: Windows, macOS +------------------------------------------------------------------------------- ¦ Developer References: ¦ ¦ Book: Cross-Platform Development with Delphi 10.2 & FireMonkey ¦ Author: Harry Stahl ¦ Notes: See pages 98-99. ¦ ¦ Websites: https://stackoverflow.com/q/28858392/195983 +------------------------------------------------------------------------------- ¦ DISCLAIMER: ¦ ¦ This source code is provided "as is" and without any warranty. Use it at your ¦ own risk. The author(s) make no guarantees or assurances regarding the ¦ correctness or functionality of the code, and disclaim any liability for ¦ damages resulting from its use. ¦ ¦ It is advisable to thoroughly review and test the code before deploying it in ¦ any production environment. ¦ ¦ By using this code, you agree to these terms and acknowledge that any issues ¦ arising from its use are solely your responsibility. +------------------------------------------------------------------------------- } unit u . OpenURL; interface {$IFDEF MSWindows} uses Winapi . ShellAPI, Winapi . Windows; { $ENDIF } {$IFDEF MACOS} uses Macapi . AppKit, Macapi . Foundation, Macapi . Helpers; procedure macOSGotoWebsite(URL: string ); { $ENDIF } procedure GotoWebsite(URL: string ); implementation procedure GotoWebsite(URL: string ); begin {$IFDEF MSWindows} ShellExecute(GetDesktopWindow, 'open' , PChar (URL), '' , '' , SW_SHOWNORMAL) { $ENDIF } {$IFDEF MACOS} macOSGotoWebsite(URL); { $ENDIF } end ; {$IFDEF MACOS} procedure macOSGotoWebsite(URL: string ); var macURL: NSURL; macWorkspace: NSWorkspace; begin macURL := TNSURL . Wrap(TNSURL . OCClass . URLWithString(StrToNSStr(URL))); macWorkspace := TNSWorkspace . Wrap(TNSWorkspace . OCClass . sharedWorkspace); macWorkspace . openURL(macURL); end ; { $ENDIF } end . |
https://zilchworks.com
No comments:
Post a Comment