Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Registry - FileExtensions eintragen (https://www.delphipraxis.net/42698-registry-fileextensions-eintragen.html)

Jarmen_Kell 22. Mär 2005 18:10


Registry - FileExtensions eintragen
 
Also unter der folgenden Url

http://www.dsdt.info/tipps/?id=236

habe ich eine Function gefunden, um Dateiendungen in die Registry einzutragen.

So das ganze sieht bei mir jetzt so aus.
Also auf einem Form befindet sich eine Check-List-Box (ClBoxFileAssis) u.A mit folgenden Items:

.mp2
.mp3
.wma

Dan wird bei einem ButtonOnClick das folgende gemacht:
Delphi-Quellcode:
var
I:Integer;
begin
 [...]
  for I:=0 to CLBoxFileAssis.Items.Count do
    if CLBoxFileAssis.Checked[I]
      then
        mainform.RegistExtension(ClBoxFileAssis.Items[I],ClBoxFileAssis.Items[I] + '-File','PhynPlayer',mainform.pppath + 'phynplayer.exe',ParamStr(0),'"%1"',0);
Dann in TMainform:

Delphi-Quellcode:
function Tmainform.RegistExtension(Extension, ExtDescription, FileDescription,
OpenWith, ParamString: string; IconIndex: Integer = 0): Boolean;
var
  Reg: TRegistry;
begin
  Result := False;
  if Extension <> '' then
  begin
    if Extension[1] <> '.' then
      Extension := '.' + Extension;

    Reg := TRegistry.Create;
    try
      Reg.RootKey := HKEY_CLASSES_ROOT;
      if Reg.OpenKey(Extension, True) then
      begin
       Reg.WriteString('', ExtDescription);
       if Reg.OpenKey('\' + ExtDescription, True) then
       begin
         Reg.WriteString('', FileDescription);
         if Reg.OpenKey('DefaultIcon', True) then
         begin
           Reg.WriteString('', Format('%s,%d', [OpenWith, IconIndex]));
           if Reg.OpenKey('\' + ExtDescription + '\Shell\Open\Command', True) then
           begin
             Reg.WriteString('', Format('"%s" "%s"', [OpenWith, ParamString]));
             Result:=True;
           end;
         end;
       end;
     end;
  finally
    Reg.Free;
  end;
end;

Nun erscheint der folgende Fehler:
"Incompatible Types: Integer and String" soweit recht logisch. Aber in diesem Fall weiß ich nicht, was hier falsch ist.

:wiejetzt:

Und dann noch etwas: würden damit beim Aufruf mehrerer Dateien über den Explorer auch alle Datei-Namen an das Prog übermittelt werden, oder nur einer davon?

Und denn Sinn von

ParamStr(0), '"%1"'

habe ich auch nicht so ganz verstanden :gruebel:


Joa, mal gucken, ob das jemand erklären kann ^^
Naja bestimmt :thumb:

Luckie 22. Mär 2005 18:14

Re: Registry - FileExtensions eintragen
 
Zitat:

Zitat von Jarmen_Kell
Nun erscheint der folgende Fehler:
"Incompatible Types: Integer and String" soweit recht logisch. Aber in diesem Fall weiß ich nicht, was hier falsch ist.

Deutlicher kann eine Fehlemeldung vom Kompiler kaum noch sein.

Zitat:

Und dann noch etwas: würden damit beim Aufruf mehrerer Dateien über den Explorer auch alle Datei-Namen an das Prog übermittelt werden, oder nur einer davon?
Für jede Datei wir deine neue Instanz deines Programmes gestartet.

Zitat:

ParamStr(0), '"%1"'
"%1" bedeutet, dass die Datei als Parameter an dein Programm weitergeben wird.

Zitat:

Joa, mal gucken, ob das jemand erklären kann ^^
Mit etwas nachdenken, hättest du dir das auch selbner erklären können.

Jarmen_Kell 22. Mär 2005 18:25

Re: Registry - FileExtensions eintragen
 
Fehler: Ja, er ist deutlich, aber hier gehört ein Integer hin und da ist auch einer!
Instanzen: Gut ist bei mir aufgrund einer Mutex nicht möglich, aber ich werd' mich noch mal damit befassen
Parameter: Danke
Nachdenken: Wenn ich es mir erklären könnte, würde ich hier nicht posten

Luckie 22. Mär 2005 18:26

Re: Registry - FileExtensions eintragen
 
Zitat:

Zitat von Jarmen_Kell
Fehler: Ja, er ist deutlich, aber hier gehört ein Integer hin und da ist auch einer!

WO? Ich habe keine Lust deinen ganzen Quellcode nach dem Fehler abzusuchen.

Jarmen_Kell 22. Mär 2005 18:32

Re: Registry - FileExtensions eintragen
 
Da:
Delphi-Quellcode:
mainform.RegistExtension(ClBoxFileAssis.Items[I],ClBoxFileAssis.Items[I] + '-File','PhynPlayer',mainform.pppath + 'phynplayer.exe',ParamStr(0),'"%1"',0);
als Aufruf folgender Funktion:
Delphi-Quellcode:
function Tmainform.RegistExtension(Extension, ExtDescription, FileDescription,
OpenWith, ParamString: string; IconIndex: Integer = 0): Boolean;

Gregg 22. Mär 2005 19:56

Re: Registry - FileExtensions eintragen
 
Zitat:

function Tmainform.RegistExtension(Extension, ExtDescription, FileDescription,
OpenWith, ParamString: string; IconIndex: Integer = 0): Boolean;)
Zitat:

mainform.RegistExtension(ClBoxFileAssis.Items[I],ClBoxFileAssis.Items[I] + '-File','PhynPlayer',mainform.pppath + 'phynplayer.exe',ParamStr(0),'"%1"',0);
Du musst denk ich mal ParamStr(0) und '"%1"' nicht mit Komma, sondern mit einem + verbinden. Probiers mal

Gregg 22. Mär 2005 20:06

Re: Registry - FileExtensions eintragen
 
Bei mir klappts so:

Delphi-Quellcode:
InstallExt('.mp3', 'MP3 - Datei', 'MP3 Audio', Application.ExeName, '%1',0);
InstallExt = RegistExtension

Jarmen_Kell 23. Mär 2005 11:15

Re: Registry - FileExtensions eintragen
 
Ja kuhl jetzt klappt das.
Möglicherweise lag' der Fehler nicht mal unbedingt da

:oops:

Jetzt muss ich nur noch zusehen, dass ich damit mehrere Datei-Parameter an die Appi bekomme, aber ich glaub' das habe ich schon.
Und dann gucken, wie ich das noch mit der Mutex vereinbaren kann.
:gruebel:

Na, fällt mir schon noch ein

Danke vielmals!
( Vor allem, wenn das wirklich gar nicht der Hauptfehler gewesen sein sollte :roll: )

Gregg 23. Mär 2005 13:25

Re: Registry - FileExtensions eintragen
 
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
type
    Einstellungen = record
     Lautstaerke : integer;
     Skin : string[1];        {Buttons}
     playlistnamen : boolean; {Vollst. Namen anzeigen?}
     Color : Tcolor;          {Hintergrund}
     Color_ue : Tcolor;       {Ueberschriftenfarbe}
     Color_sch : Tcolor;      {Schriftfarbe}
     Font_ue : TFont;         {Schriftart(Ueberschriften)}
     Font : TFont;            {Schriftart(Normalschriften)}
    end;

var i,j:integer;
    groesse:longint;
    Sem: THandle;
    strin:string;
    Mutex: THandle;
    Was:Einstellungen;
    f:file of byte;
    temp:textfile;

label 99;

begin
  if paramcount>0 then
  begin
  i:=0;
  assignfile(temp,(extractfiledrive(paramstr(0))+'\Mediaplayer_System\temp.dat'));
    if not fileexists(extractfiledrive(paramstr(0))+'\Mediaplayer_System\temp.dat') then
    rewrite(temp) else append(temp);

  99:
  strin:='';
 if (paramcount>0) then
  begin
   {mehre Dateien in Temporärer Datei speichern}
   while not fileexists(strin) do begin
   i:=i+1;
    strin:=strin+paramstr(i);
    end;
    writeln(temp,strin);
    if i<paramcount then goto 99;
    closefile(temp);
   {Überprüfung ende}
    if GetLastError = ERROR_ALREADY_EXISTS then halt;
   listbox1.items.clear;
    listbox1.items.add(extractfilename(strin));
    maxlied:=1;
    mediaplayer1.close;
    Label1.caption:=extractfilename(strin);
   FillID3TagInformation(strin, Title,Artist,Album,Year,Comment, Genre);
   mediaplayer1.filename:=strin;
   mediaplayer1.open;
   SetMPVolume(mediaplayer1,trackbar2.position);
   gesamtzeitsek:=(mediaplayer1.length div 1000);
   gesamtzeitmin:=0;
   trackbar1.max:=mediaplayer1.length;
   gauge1.maxvalue:=mediaplayer1.length;
   while (gesamtzeitsek>=60) do
    begin
     gesamtzeitsek:=gesamtzeitsek-60;
     gesamtzeitmin:=gesamtzeitmin+1;
    end;
   if gesamtzeitsek<10 then gesamtzeit.caption:=inttostr(gesamtzeitmin)+':0'+inttostr(gesamtzeitsek)
   else gesamtzeit.caption:=inttostr(gesamtzeitmin)+':'+inttostr(gesamtzeitsek);
  mediaplayer1.play;
  end;
end;
  for i:=0 to MaxID3Genre do genre.items.add(ID3Genre[i]);

  MediaplayerMsg := RegisterWindowMessage('Mediaplayer');
  Mutex := CreateMutex(nil, False, 'Mediaplayer');
  if GetLastError = ERROR_ALREADY_EXISTS then halt;
  if Mutex <> 0 then
    ReleaseMutex(Mutex);
Das is meine Form.Create Methode

Hoffe ich konnte helfen

Jarmen_Kell 23. Mär 2005 13:48

Re: Registry - FileExtensions eintragen
 
Ô.o

Ah ja ... also ich muss gestehen, dass sieht toll aus :roll:

Aber ich hab KP, was das alles soll :gruebel:

MathiasSimmack 23. Mär 2005 13:52

Re: Registry - FileExtensions eintragen
 
Das ist auch unwichtig, weil es dir für dein Projekt vermutlich nicht helfen wird.

Jarmen_Kell 23. Mär 2005 14:05

Re: Registry - FileExtensions eintragen
 
Naja ich habe vereinzelt "MediaPlayer" und Mutex etc erspäht ... das ist schon mal gut (:

Also im Prinzip habe ich jetzt noch das Problem, dass beim Öffnen, einer nun ja erfolgreich registrierten Datei zwar das Prog geöffnet wird und der Parameter übergeben. Das Problem an der Sache ist nur, dass immer nur ein Dateiname übergeben wird.
Vermutlich, weil normalerweise für jede Datei das Prog neu gestartet wird. Dies wird allerdings durch die Mutex gleich wieder gekillt.
Also muss ich jetzt versuchen, dass vor der "Vernichtung" die Parameter an die Haupt-App übergeben werden.
:gruebel:

Oder so in der Art :zwinker:

Edit: Plural von "Problem" durch den Singular ersetzt - scheinbar habe ich beim schreiben vergessen, was mein 2. Prob war ;)

Gregg 23. Mär 2005 22:56

Re: Registry - FileExtensions eintragen
 
Delphi-Quellcode:
   assignfile(temp,(extractfiledrive(paramstr(0))+'\Mediaplayer_System\temp.dat')); {Weise der Variable temp die temporäre Datei zu}
    if not fileexists(extractfiledrive(paramstr(0))+'\Mediaplayer_System\temp.dat') then {Wenn die temporäre Datei nicht existiert dann}
    rewrite(temp) {erstelle sie} else append(temp); {sonst öffne sie um Dateien anzuhängen}
 99: {label 99}
  strin:=''; {setze den zwischenspeicher für den Dateinamen auf nichts zurück}
if (paramcount>0) then {wenn einer oder mehrere Dateinamen übermittelt wurden dann}
  begin
   {mehre Dateien in Temporärer Datei speichern} 
   while not fileexists(strin) do begin {solange (strin) nicht existiert füge den nächsten Parameter hinzu}
   i:=i+1; {da ich keine For-Schleife benutzen kann, aber der Parameter verändert werden soll}
    strin:=strin+paramstr(i); {Zwischenspeicher = Zw.Speicher + aktueller Parameter}
    end;
    writeln(temp,strin); {temp ist die temporäre auslagerungsdatei; Schreibe in temp eine neue Zeile mit dem Inhalt (strin)}
    if i<paramcount then goto 99; {wenn i kleiner als die Gesamtanzahl an Paramtern ist, dann gehe zu label 99}
    closefile(temp); {Schließe die Temporäre Datei}
   {Überprüfung ende} 
    if GetLastError = ERROR_ALREADY_EXISTS then halt; {Wenn das Program schon geöffnet ist, schließe es (nachdem die temporäre Datei geschrieben wurde)}
So Hui
hoffe ich konnte dir etwas helfen

Luckie 23. Mär 2005 23:07

Re: Registry - FileExtensions eintragen
 
Zitat:

Zitat von Jarmen_Kell
Das Problem an der Sache ist nur, dass immer nur ein Dateiname übergeben wird.
Vermutlich, weil normalerweise für jede Datei das Prog neu gestartet wird. Dies wird allerdings durch die Mutex gleich wieder gekillt.
Also muss ich jetzt versuchen, dass vor der "Vernichtung" die Parameter an die Haupt-App übergeben werden.

Genau und das könnte man mit WM_COPYDATA machen. Oder man nimmt die Unit von Nico: http://www.luckie-online.de/Delphi/Importe/Nico/

Jarmen_Kell 24. Mär 2005 10:12

Re: Registry - FileExtensions eintragen
 
Also die Unit von Nico ist mir ehrlich gesagt irgendwie zu kompliziert.
Ich kann das natürlich einfach alles kopieren und in mein Prog einfügen - vermutlich ginge es auch, aber ich wills ja auch schon irgendwie verstehen (:

Ich will nicht auch irgend ein Copy-n-Paste-Prog haben, bei dem ich das meißte nicht mal selber verstehe ;)

Aber die Lösung von Gregg klingt für mich nachvollziehbar.
Die Frage ist jetzt nur, wie ich das bereits aktive Prog dazu bringe, zu bemerken, dass die Temp-Datei jetzt von einer anderen Instanz geändert wurde.

Gregg 24. Mär 2005 12:23

Re: Registry - FileExtensions eintragen
 
Delphi-Quellcode:
procedure TForm1.Timer2Timer(Sender: TObject);
var j,groesse:integer;
    fmp:TFileStream;
    s:string;
    i:integer;
label 1,3;

begin
  if ((label1.caption<>'Verzeichnis') or fileexists(extractfiledrive(paramstr(0))+'\Mediaplayer_System\temp.dat')) and (mediaplayer1.error=0) then
  begin
  if fileexists(extractfiledrive(paramstr(0))+'\Mediaplayer_System\temp.dat') then {Überprüfe ob die temporäre Datei existiert und wenn ja dann}
   begin
    memo1.lines.loadfromfile(extractfiledrive(paramstr(0))+'\Mediaplayer_System\temp.dat'); {Der Inhalt der Playlist wird der inhalt der temporären Datei übergeben}
    listbox1.items:=memo1.lines;
    deletefile(extractfiledrive(paramstr(0))+'\Mediaplayer_System\temp.dat'); {lösche die temporäre Datei}
 {...Nochn paar andere Einstelungen...}
  playbutton.glyph:=pausebutton.glyph;
  if playlistnamen.checked=false then for i:=0 to memo1.lines.count-1 do listbox1.items[i]:=extractfilename(listbox1.items[i]);
  listbox1.sorted:=false;
  listbox1.itemindex:=0;
  zaehler:=0;
  maxlied:=memo1.Lines.count-1;
  Label1.caption:=extractfilename(memo1.lines[0]);
   mediaplayer1.close;
   mediaplayer1.filename:=memo1.lines[0];
   FillID3TagInformation(mediaplayer1.filename,title,artist,album,year,comment,genre);
   mediaplayer1.open;
   trackbar1.max:=mediaplayer1.length;
   gauge1.maxvalue:=mediaplayer1.length;
   gesamtzeitsek:=(mediaplayer1.length div 1000);
   gesamtzeitmin:=0;
   while (gesamtzeitsek>=60) do
    begin
     gesamtzeitsek:=gesamtzeitsek-60;
     gesamtzeitmin:=gesamtzeitmin+1;
    end;
   if gesamtzeitsek<10 then gesamtzeit.caption:=inttostr(gesamtzeitmin)+':0'+inttostr(gesamtzeitsek)
   else gesamtzeit.caption:=inttostr(gesamtzeitmin)+':'+inttostr(gesamtzeitsek);
   mediaplayer1.play;
  end;
Ich überprüfe im Intervall von einer Sekunde mit einem OnTimer Event

Jarmen_Kell 24. Mär 2005 17:14

Re: Registry - FileExtensions eintragen
 
Ja ok ist zwar natürlich weitaus unprofessioneller, aber das versteh' ich ^^

Kann ich ja sonst später immernoch durch das andere ersetzen.
Danke
Auch den anderen - gute Ratschläge, aber ich bin vermutlich einfach noch nicht weit genug!


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz