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
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
Text = 'https://zilchworks.com'
TextSettings.Font.Size = 24.000000000000000000
TextSettings.FontColor = claMediumblue
OnClick = Text1Click
OnMouseEnter = Text1MouseEnter
OnMouseLeave = Text1MouseLeave
end
endunit 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.
{
+-------------------------------------------------------------------------------
¦ 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
¦ ISBN: https://isbnsearch.org/isbn/9781549545764
¦ Notes: See pages 98-99.
¦
¦ Websites: https://stackoverflow.com/q/28858392/195983
¦ https://stackoverflow.com/a/28859000/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