Search icon CANCEL
Subscription
0
Cart icon
Your Cart (0 item)
Close icon
You have no products in your basket yet
Save more on your purchases now! discount-offer-chevron-icon
Savings automatically calculated. No voucher code required.
Arrow left icon
Explore Products
Best Sellers
New Releases
Books
Videos
Audiobooks
Learning Hub
Conferences
Free Learning
Arrow right icon
Arrow up icon
GO TO TOP
Delphi Cookbook

You're reading from   Delphi Cookbook Over 60 hands-on recipes to help you master the power of Delphi for cross-platform and mobile development on multiple platforms

Arrow left icon
Product type Paperback
Published in Jun 2016
Publisher
ISBN-13 9781785287428
Length 470 pages
Edition 2nd Edition
Languages
Arrow right icon
Author (1):
Arrow left icon
Daniele Teti Daniele Teti
Author Profile Icon Daniele Teti
Daniele Teti
Arrow right icon
View More author details
Toc

Table of Contents (10) Chapters Close

Preface 1. Delphi Basics FREE CHAPTER 2. Becoming a Delphi Language Ninja 3. Knowing Your Friends – the Delphi RTL 4. Going Cross-Platform with FireMonkey 5. The Thousand Faces of Multithreading 6. Putting Delphi on the Server 7. Riding the Mobile Revolution with FireMonkey 8. Using Specific Platform Features Index

Associating a file extension with your application on Windows

In some cases, your fantastic application needs to be opened with just a double-click on a file with an extension associated with it. This is the case with Microsoft Word, Microsoft Excel, and many other well-known pieces of software. If you have a file generated with a program, double-click on the file and the program that generated the file will bring up pointing to that file. So, if you click on mywordfile.docx, Microsoft Word will be opened and mywordfile.docx will be shown. This is what we'd like to do in this recipe. The association can be useful also when you have multiple configurations for a program. Double-click on the ConfigurationXYZ.myext file, and the program will start using that configuration.

Getting ready

The hard work is done by the operating system itself. We have to instruct Windows to provide the following information:

  • The file extension to associate
  • The description of file type (it will be shown by Windows Explorer describing the file type)
  • The default icon for the file type (in this recipe, we'll use the application icon itself, but it is not mandatory)
  • The application that we want to associate
  • Let's start!

How to do it…

  1. Create a new VCL application and drop two TButton components and a TMemo component. Align all the buttons as a toolbar at the top of the form and the memo to all the remaining form client area.
  2. The button on the left-hand side will be used to register a file type, while the button on the right-hand side will be used to unregister the association (cleaning the registry).
  3. We have to handle some features specific to Microsoft Windows, so we need some Windows-related units. Under the implementation section of the unit, write this use clause:
    uses System.Win.registry, Winapi.shlobj, System.IOUtils;
  4. In the implementation section, we need two procedures to do the real work; so just after the uses clause, add this code:
    procedure UnregisterFileType(
      FileExt: String; 
      OnlyForCurrentUser: boolean = true);
    var
      R: TRegistry;
    begin
      R := TRegistry.Create;
      try
        if OnlyForCurrentUser then
          R.RootKey := HKEY_CURRENT_USER
        else
          R.RootKey := HKEY_LOCAL_MACHINE;
    
        R.DeleteKey('\Software\Classes\.' + FileExt);
        R.DeleteKey('\Software\Classes\' + FileExt + 'File');
      finally
        R.Free;
      end;
      SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0);
    end;
    
    procedure RegisterFileType(
      FileExt: String;
      FileTypeDescription: String;
      ICONResourceFileFullPath: String;
      ApplicationFullPath: String;
      OnlyForCurrentUser: boolean = true);
    var
      R: TRegistry;
    begin
      R := TRegistry.Create;
      try
        if OnlyForCurrentUser then
          R.RootKey := HKEY_CURRENT_USER
        else
          R.RootKey := HKEY_LOCAL_MACHINE;
    
        if R.OpenKey('\Software\Classes\.' + FileExt, true) then begin
          R.WriteString('', FileExt + 'File');
          if R.OpenKey('\Software\Classes\' + FileExt + 'File', true) then begin
            R.WriteString('', FileTypeDescription);
            if R.OpenKey('\Software\Classes\' + FileExt + 'File\DefaultIcon', true) then
            begin
              R.WriteString('', ICONResourceFileFullPath);
              if R.OpenKey('\Software\Classes\' + FileExt + 'File\shell\open\command', true) then
              R.WriteString('', ApplicationFullPath + ' "%1"');
              end;
            end;
          end;
        finally
        R.Free;
      end;
      SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0);
    end;
  5. These two procedures allow us to register (and unregister) a file type considering only the current user or all the machine users. Pay attention; if you want to register the association for every user, write your data to:
    HKEY_LOCAL_MACHINE\Software\Classes
  6. If you want to register the association for the current user only, write your data to:
    HKEY_CURRENT_USER\Software\Classes
  7. On the newest Windows versions, you need administrator rights to register a file type for all the machine users. The last line of the procedures tells Explorer (the Microsoft Windows graphic interface) to refresh its settings to reflect the changes made to the file associations. As a result, for instance, the Explorer file list views will update.
  8. We've almost finished. Change the left button name to btnRegister, the right button name to btnUnRegister, and put the following code on their onclick event handlers:
    procedure TMainForm.btnRegisterClick(Sender: TObject);
    begin
      RegisterFileType(
        'secret',
        'This file is a secret',
        Application.ExeName,
        Application.ExeName,
        true);
      ShowMessage('File type registred');
    end;
    
    procedure TMainForm.btnUnRegisterClick(Sender: TObject);
    begin
      UnregisterFileType('secret', true);
      ShowMessage('File type unregistered');
    end;
  9. Now, when our application is invoked with a double-click, we'll get the file name as a parameter. It is possible to read a parameter passed by Windows Explorer (or the command line) using the ParamStr(1) function. Create a FormCreate event handler using the following code:
    procedure TMainForm.FormCreate(Sender: TObject);
    begin
      if TFile.Exists(ParamStr(1)) then
        Memo1.Lines.LoadFromFile(ParamStr(1))
      else
      begin
        Memo1.Lines.Text := 'No valid secret file type';
      end;
    end;
  10. Now, the application should be complete. However, a nice integration with the operating system requires a nice icon. In the code, the associated file will get the same icon as the main program, so let's change our default icon by going to Project | Options | Application dialog, and choose a nice icon. Click on the Load Icon button, choose an ICO file, and then select the third item from the resultant dialog:
    How to do it…

    Figure 12.1: Changing the default application icon for our application

  11. Now, create some text files with our registered extension .secret.
  12. These files will appear with the default Windows icons, but in some seconds, they will have a brand new icon.
  13. Run the application by hitting F9 (or by going to Run | Run).
  14. Click on the btnRegister button and close the application. Now, the files get new icons, as shown here:
    How to do it…

    Figure 12.2: The files in Windows Explorer before and after having registered the .secret extension

  15. Now, with the application not running, double-click on a .secret file. Our program will be started by Windows itself, using the information stored in the registry about the .secret file, and we'll get this form (the text shown in the memo is the text contained in the file):
    How to do it…

    Figure 12.3: Our application, launched by the operating system, while it is showing the contents of the file

There's more…

One application can register many file types. In some cases, I've used this technique to register some specific desktop database files to my application (Firebird SQL Embedded database files or SQLite database files). So, a double-click actually was a connection to that database.

You have been reading a chapter from
Delphi Cookbook - Second Edition
Published in: Jun 2016
Publisher:
ISBN-13: 9781785287428
Register for a free Packt account to unlock a world of extra content!
A free Packt account unlocks extra newsletters, articles, discounted offers, and much more. Start advancing your knowledge today.
Unlock this book and the full library FREE for 7 days
Get unlimited access to 7000+ expert-authored eBooks and videos courses covering every tech area you can think of
Renews at $19.99/month. Cancel anytime