Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#4

AW: Datentypen in der Registry

  Alt 17. Okt 2015, 10:38
ungetestete Idee:
Delphi-Quellcode:
uses Registry;

function RegisterProg(
                      sFileType : String; // wird im Explorer als Typ angezeigt
                      sStandard : String; // Inhalt des Eintrages (Standard) in der Registry
                      sProgram : String; // vollständiger Pfad zum Programm
                      sExt : String // zu verknüpfende Dateiendung
                     ) : Boolean;
var
  Reg : TRegistry;
begin
  Result := True;
  Reg := TRegistry.Create;
  Reg.RootKey := HKEY_CLASSES_ROOT;
  Reg.OpenKey(sExt, True);
  try
    Reg.WriteString('', sFileType);
  except
    Result := False;
  end;
  Reg.CloseKey;
  if Result then begin
    Reg.OpenKey(sFileType, True);
    try
      Reg.WriteString('', sStandard);
    except
      //
    end;
    Reg.OpenKey('shell', True);
    Reg.OpenKey('open', True);
    Reg.OpenKey('command', True);
    try
      Reg.WriteString('',Format('"%s" "%s"',[sProgram,'%1']));
    except
      //
    end;
    Reg.CloseKey;
    Reg.CloseKey;
    Reg.CloseKey;
    Reg.CloseKey;
  end;
  Reg.Free;
end;

// Aufruf:
begin
  RegisterProg('BMP IrfanView','IrfanView','c:\Programme\IrfanView\iview32_.exe','.bmp');
  RegisterProg('JPG IrfanView','IrfanView','c:\Programme\IrfanView\iview32_.exe','.jpg');
  RegisterProg('JPG IrfanView','IrfanView','c:\Programme\IrfanView\iview32_.exe','.jpeg');
end;
Der Aufruf von RegisterProg ließe sich sicherlich auch über eine Ini-Datei (o. ä.) realisieren, so dass die einzelnen Verknüpfungen nicht fest im Programm verdrahtet werden müssen.

Aufbau der INI-Datei:
Code:
[JPEG]
FileType=JPG IrfanView
Standard=IrfanView
Program=c:\Programme\IrfanView\iview32_.exe
Ext=.jpg
[JPEG]
FileType=JPG IrfanView
Standard=IrfanView
Program=c:\Programme\IrfanView\iview32_.exe
Ext=.jpeg
Aufrufroutine bei die Nutzung einer Ini-Datei:
Delphi-Quellcode:
uses IniFiles;

var
      ini : TIniFile;
      sl : TStringList;
      i : Integer;
      sFileType : String;
      sStandard : String;
      sProgram : String;
      sExt : String;
begin
  ini := TIniFile.Create('Verknüpfungen.ini');
  sl := TStringList.Create;
  ini.ReadSections(sl);
  for i := 0 to sl.Count - 1 do begin
    sFileType := ini.ReadString(sl[i],'FileType','');
    sStandard := ini.ReadString(sl[i],'Standard','');
    sProgram := ini.ReadString(sl[i],'Program','');
    sExt := ini.ReadString(sl[i],'Ext','');
    RegisterProg(sFileType,sStandard,sProgram,sExt);
  end;
  sl.Free;
  ini.Free;
end;
und als Konsolenprogramm:
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, Registry, IniFiles, Windows, Classes;

function RegisterProg(
                      sFileType : String; // wird im Explorer als Typ angezeigt
                      sStandard : String; // Inhalt des Eintrages (Standard) in der Registry
                      sProgram : String; // vollständiger Pfad zum Programm
                      sExt : String // zu verknüpfende Dateiendung
                     ) : Boolean;
var
  Reg : TRegistry;
begin
  Result := True;
  Reg := TRegistry.Create;
  Reg.RootKey := HKEY_CLASSES_ROOT;
  Reg.OpenKey(sExt, True);
  try
    Reg.WriteString('', sFileType);
  except
    Result := False;
  end;
  Reg.CloseKey;
  if Result then begin
    Reg.OpenKey(sFileType, True);
    try
      Reg.WriteString('', sStandard);
    except
      //
    end;
    Reg.OpenKey('shell', True);
    Reg.OpenKey('open', True);
    Reg.OpenKey('command', True);
    try
      Reg.WriteString('',Format('"%s" "%s"',[sProgram,'%1']));
    except
      //
    end;
    Reg.CloseKey;
    Reg.CloseKey;
    Reg.CloseKey;
    Reg.CloseKey;
  end;
  Reg.Free;
end;

function ReadIniFile(sIniFile : String) : Boolean;
var
  ini : TIniFile;
  sl : TStringList;
  i : Integer;
  sFileType : String;
  sStandard : String;
  sProgram : String;
  sExt : String;
begin
  Result := FileExists(sIniFile);
  if Result then begin
    WriteLn(Format('%s:',[sIniFile]));
    sl := TStringList.Create;
    ini := TIniFile.Create(sIniFile);
    ini.ReadSections(sl);
    for i := 0 to sl.Count - 1 do begin
      sFileType := ini.ReadString(sl[i],'FileType','');
      sStandard := ini.ReadString(sl[i],'Standard','');
      sProgram := ini.ReadString(sl[i],'Program','');
      sExt := ini.ReadString(sl[i],'Ext','');
      if RegisterProg(sFileType,sStandard,sProgram,sExt) then begin
        WriteLn(Format('Verknuepfung %s wurde erstellt.',[sFileType]));
      end else begin
        WriteLn(Format('Verknuepfung %s konnte nicht erstellt werden.',[sFileType]));
      end;
    end;
    ini.Free;
    sl.Free;
  end;
end;

var
  k : Integer;
begin
  if ParamCount < 1 then begin
    WriteLn('Aufruf:');
    WriteLn(Format('%s Ini-Datei [,Ini-Datei ... ,Ini-Datei]',[ParamStr(0)]));
    Halt(1);
  end;
  for k := 1 to ParamCount do begin
    if not ReadIniFile(ParamStr(k)) then begin
      WriteLn(Format('Die INI-Datei %s wurde nicht gefunden.',[ParamStr(k)]));
    end;
  end;
end.
  Mit Zitat antworten Zitat