Tech-Ecke / Delphi Inhalt / Neuer Dateityp anmelden und mit Anwendung verknüpfen

 

     Neuer Dateityp anmelden und mit Anwendung verknüpfen

 

   Einfacher Aufruf mit mehreren Instanzen

Möchte man eine, unter Windows mit der eigenen Anwendung verknüpfte Datei per Doppelklick öffnen, so fügt man folgende Zeilen hinter dem Ereignis OnCreate der Form1 (Hauptform) hinzu:

   if ParamCount > 0 then
 LadeDatei(ParamStr(1));  // (ParamStr(1)) ist ein String und enthält den Pfad zur Datei
 

Um das Ganze etwas mehr zu konkretisieren, ist die zu öffnende Datei eine textbasierende Datei und soll z.B. in der ListBox1 geöffnet werden so würde das wie folgt aussehen:

   if ParamCount > 0 then
 ListBox1.Items.LoadFromFile(ParamStr(1));
 

 

   Aufruf mit unterdrücken mehrerer Instanzen

Nun gut, jetzt ist es aber so, dass beim Öffnen der Datei (Doppelklick auf Datei), immer eine neue Instanz der Anwendung geöffnet wird. Dies kann zwar so auch gewünscht sein, muss aber nicht. Möchte man, dass die Datei in die bereits geöffneten Anwendung geladen wird, so wird das Ganze etwas umfangreicher, aber nicht unmöglich. Ok, dann lasset das Spiel beginnen...
Zunächst installiert man die Komponente MainInstance, welche hier heruntergeladen werden kann. Ist dies vollbracht, so zieht man die Komponente auf die Hauptform und trägt im Quellcode unter private folgende Zeile ein:

  .
.
.

type
TForm1 = class(TForm)
.
.
.

private
{ Private-Deklarationen }
procedure NeedFileOpen(var Msg: tMessage); message wmMainInstanceOpenFile;   // <- diese hier !!!
public
{ Public-Deklarationen }
.
.
.
 

Dann irgendwo im Quelltext folgende Prozedur hinkopieren:

  procedure TForm1.NeedFileOpen(var Msg: tMessage);
var
      Path : string;
      PC : array[0..MAX_PATH] of Char;
begin
   GlobalGetAtomName(Msg.wParam, PC, MAX_PATH);
   Path := Trim(StrPas(PC));
   LadeDatei(Path);   // (Path) ist ein String und enthält den Pfad zur Datei
end;

Quelle: www.delphi-fundgrube.de

Anstelle LadeDatei muss der Code zum Laden der Datei hinterlegt sein, wie im Beispiel oben z.B.: ListBox1.Items.LoadFromFile(Path).

 

   Windows-Dateiverknüpfung (Typ) über eigener Anwendung

So, und nun zu guter Letzt, was ja eigentlich an den Anfang gehört, wie man eine Dateiverknüpfung unter Windows aus der eigenen Anwendung heraus erstellt. Dazu folgende Funktion in den Quelltext der Anwendung verpflanzen:

  function InstallExt(Extension, ExtDescription, FileDescription, OpenWith, ParamString: String; IconIndex: Integer): Boolean;
var
      Reg: TRegistry;
begin
   Reg := TRegistry.Create;
   try
      try
         with Reg do
            begin
               RootKey := HKEY_CLASSES_ROOT;
               OpenKey(Extension, True);
               WriteString('', ExtDescription);
               CloseKey;
               OpenKey('\' + ExtDescription, True);
               WriteString('', FileDescription);
               CloseKey;
               OpenKey('DefaultIcon', True);
               WriteString('', OpenWith + ','+IntToStr(IconIndex));
               CloseKey;
               OpenKey('\' + ExtDescription + '\Shell\Open\Command', True);
               WriteString('', '"' + OpenWith + '" "' + ParamString + '"');
               CloseKey;
            end;
            Result := True;
        except
            Result := False;
        end;
     finally
        Reg.Free;
   end;
end;

Quelle: www.delphipraxis.net

Aufgerufen wird die Funktion dann wie folgt:

   InstallExt('.xyz', 'MeineAnwendung', 'schöne-Anwenung', Application.ExeName, '"%1"',0);
 

Wobei ".xyz" durch die zu registrierende Endung und "MeineAnwendung" gegen den Anwendungsnamen zu tauschen ist. Bei "schöne Anwendung" kann eine kurze Dateityp-Beschreibung stehen.

Die Option Drucken funktioniert erst ab Netscape V4.0 bzw. I-Explorer 5.0 !

[letzte Aktualisierung 22.03.2009]