Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Autom. Dateiöffnen scheitert an Leerzeichen trotz "%1" (https://www.delphipraxis.net/89125-autom-dateioeffnen-scheitert-leerzeichen-trotz-1-a.html)

JayRZay 26. Mär 2007 20:10


Autom. Dateiöffnen scheitert an Leerzeichen trotz "%1&q
 
Hi, sorry dass ich schon wieder was frage, aber beim letzten Überarbeiten des Programms fallen mir lauter Schwächen auf, mit denen ich gar nicht gerechnet habe.

Ich hoffe allerdings, das war erstmal die letzte dumme Frage.

Mein Problem ist folgendes. Ich möchte per Windows meinen eigenen Dateityp automatisch per ParamStr(1) öffnen lassen. Klappt auch normalerweise aber gerade bemerke ich, dass es nicht klappt, wenn Leerzeichen im Dateinamen (oder den Ordnernamen, wie in meinem akuten Fall) sind.

Schon klar, Parameter gehen nur bis zum Leerzeichen. Aber ich habe meine Dateiendung korrekt mit "%1" statt nur %1 registriert. Sämtliche Foren geben, soweit ich sehen konnte, immer nur die fehlenden Anführungszeichen als Fehlerquelle an. Ich stehe vor einem Rätsel.

Die Registrierungszeile lautet:

Delphi-Quellcode:
InstallExt('bst', 'BLE', 'Bestellliste', ParamStr(0), '"%1"',1)
Ich verwende XP, wenn das irgendeinen Unterschied machen sollte.

Danke für die Hilfe!

EDIT: Interessante Bemerkung: Wenn ich per "Ausführen" den Namen meines Programms angebe und in "..." den Dateinamen anhänge (also so, wie es eigentlich sein sollte!), funktioniert es trotz Leerzeichen. Also muss wohl irgendwas mit dem Registrieren falsch laufen. Ich sehe aber trotzdem nich, was.

EDIT2: Folgende Überlegung: Da mein Programm-Ordner ebenfalls Leerzeichen enthält, wird er beim Öffnen dann selbst in Anführungszeichen gesetzt? So dass sich z.B.:

"C:\Programm Ordner\Programm Name.exe *"

wenn man an die Position des Sternchens den ebenfalls eingehakten Dateinamen setzt, folgendes rauskommt:

"C:\Programm Ordner\Programm Name.exe "C:\Datei Ordner\Datei Name.bst"" ergibt, so dass die Aufteilung ergibt:

1. "C:\Programm Ordner\Programm Name.exe "
2. C:\Datei Ordner\Datei Name.bst
3. ""

Also durch die doppelten Anführungszeichen der Dateiname ausgeklammert, statt eingeklammert, wird? Wenn ja, gibt es Auswege oder eine Möglichkeit, zu testen obs daran überhaupt liegt?

Christian Seehase 26. Mär 2007 20:47

Re: Autom. Dateiöffnen scheitert an Leerzeichen trotz "
 
Moin JayRZay,

wie sieht denn InstallExt aus?

JayRZay 26. Mär 2007 21:00

Re: Autom. Dateiöffnen scheitert an Leerzeichen trotz "
 
Ich Depp. Entschuldigung. Das hätte ich vielleicht mal erwähnen sollen.

Delphi-Quellcode:
function InstallExt(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;
end;

Christian Seehase 26. Mär 2007 21:13

Re: Autom. Dateiöffnen scheitert an Leerzeichen trotz "
 
Moin JayRZay,

da ParamString schon von der Funktion in "" eingeschlossen werden, solltest Du das beim Aufruf der Funktion weglassen.

BTW:
TRegistry.Free führt zwar auch ein Close aus, aber eben nur eines.
Es werden aber mehrere Keys geöffnet...
Ausserdem fehlen, deshalb, dort noch so einige try/finally-Blöcke, um das Schliessen der Keys sicherzustellen.

SirThornberry 26. Mär 2007 21:27

Re: Autom. Dateiöffnen scheitert an Leerzeichen trotz "
 
durch openkey wird automatisch ein CloseKey durchgeführt.

JayRZay 26. Mär 2007 21:39

Re: Autom. Dateiöffnen scheitert an Leerzeichen trotz "
 
Peinlich, die Lösung ist vollkommen richtig. :oops: Ich danke dir, Seehase. Hat mir sehr geholfen!

Was das Schließen von Keys beim Öffnen eines Anderen angeht, hat SirThornberry allerdings recht. :wink:

Christian Seehase 27. Mär 2007 18:22

Re: Autom. Dateiöffnen scheitert an Leerzeichen trotz "
 
Moin Jens,

Zitat:

Zitat von SirThornberry
durch openkey wird automatisch ein CloseKey durchgeführt.

bei welcher Delphi-Version?
Ich habe das vorher bei D7 nachgesehen, da wird bei OpenKey kein CloseKey durchgeführt.
Da D2006 die gleiche Routine verwendet gehe ich mal davon aus, dass es bei den dazwischenliegenden Versionen auch nicht gemacht wird.

marabu 27. Mär 2007 18:37

Re: Autom. Dateiöffnen scheitert an Leerzeichen trotz "
 
Hallo,

die D7 Online-Hilfe ist da wie so oft etwas missverständlich. Das regelmäßige automatische Schließen offener Schlüssel betrifft nur TRegIniFile, nicht TRegistry. Bei den Methoden von TRegistry wird ein CloseKey nur dann ausgeführt, wenn es der VCL-Code erfordert oder sinnvoll erscheinen lässt, nicht als Komfortmerkmal für den Programmierer. Deshalb gehört hinter jedes WriteString() ein CloseKey(). Besser ist das.

Freundliche Grüße

Christian Seehase 27. Mär 2007 18:42

Re: Autom. Dateiöffnen scheitert an Leerzeichen trotz "
 
Moin Marabu,

Zitat:

Zitat von marabu
Das regelmäßige automatische Schließen offener Schlüssel betrifft nur TRegIniFile,

was bitte steht denn da in der deutschen Hilfe?
In der englischen Fassung ist bei OpenKey nicht die Rede davon, dass ein geöffneter Key geschlossen wird...

marabu 27. Mär 2007 18:46

Re: Autom. Dateiöffnen scheitert an Leerzeichen trotz "
 
Moin Chris,

im Topic "TRegistry.CloseKey" findet sich folgende Beschreibung:

Zitat:

... Viele Methoden von TRegistry rufen CloseKey routinemäßig nach Lese- oder Schreibvorgängen auf. ...
Freundliche Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:22 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