Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi "Öffnen mit" und Dateiproblem (https://www.delphipraxis.net/89825-oeffnen-mit-und-dateiproblem.html)

Nils_13 6. Apr 2007 10:35


"Öffnen mit" und Dateiproblem
 
Hi,

mein Programm soll Dateien auch aus dem Explorer öffnen können. Deshalb habe ich einfach ParamStr(1) mit Absicherungen usw. eingebunden. Wenn ich eine Datei über "Öffnen mit" (Explorer) öffne, dann wird ein Application.Terminate sofort nach dem Start der Anwendung aufgerufen. Dies ist ein eindeutiger Hinweis darauf, dass er aus irgendeinem Grund keinen Zugriff auf den Skinordner hat, OBWOHL der Pfad stimmt (habe es überprüft). Woran könnte das liegen ? Ich habe alles auf Terminates (und Close) geprüft und konnte nichts finden.

Delphi-Quellcode:
var paramfiles : Array of String;
    ...
begin
  if (ParamCount > 0) and (FileExists(ParamStr(1))) then
  begin
    SetLength(paramfiles, ParamCount);
    for i := 0 to ParamCount - 1 do
      paramfiles[i] := ParamStr(i);

    FileType := LowerCase(Trim(ExtractFileExt(ParamStr(1))));
    for ArrayIndex := 0 to 10 do
      if FileExt[ArrayIndex] = FileType then
        Break;
    if FileType <> '' then
    begin
      case ArrayIndex of
        // Audio oder Video
        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11:
        begin
          AddFiles(paramfiles);
        end;
        // Playlist
      end;
    end;
  end;
end;

s-off 6. Apr 2007 10:59

Re: "Öffnen mit" und Dateiproblem
 
Hallo,

sollte sich ein solches Problem nicht innerhalb kürzester Zeit mit dem Debugger lösen lassen? :gruebel:

Hawkeye219 6. Apr 2007 11:09

Re: "Öffnen mit" und Dateiproblem
 
Hallo Nils,

ParamCount enthält die Anzahl n der tatsächlichen Programmparameter, die zugehörigen Werte stehen in ParamStr(1)..ParamStr(n). In ParamStr(0) findest du den vollständigen Namen der .exe-Datei.

Der Wert von ArrayIndex ist nach der FOR-Schleife undefiniert, du solltest nicht mehr darauf zugreifen. Wenn die Extensions bereits in einem Array FileExt vorliegen, kannst du mit StrUtils.AnsiIndexText prüfen:

Delphi-Quellcode:
var
  Extension : string;
begin
  Extension := ExtractFileExt(ParamStr(i));
  case AnsiIndexText(Extension, FileExt) of
    0..High(FileExt): (* vorhanden *)
  else
    (* nicht vorhanden *)
  end;
end;
Gruß Hawkeye

Gausi 6. Apr 2007 11:14

Re: "Öffnen mit" und Dateiproblem
 
Wenn du das wirklich per "Öffnen mit" machen willst (also per Rechtklick, "Öffnen mit" -> Deine Anwendung), dann kannst du das Array of String schonmal vergessen. Es wird immer nur die fokussierte Datei an das ausgewählte Programm übergeben.
Ansonsten geh mal die Kommentare im Code durch ;-)
Delphi-Quellcode:
var paramfiles : Array of String;
    ...
begin
  if (ParamCount > 0) and (FileExists(ParamStr(1))) then
  begin
    SetLength(paramfiles, ParamCount);
    for i := 0 to ParamCount - 1 do
      paramfiles[i] := ParamStr(i);

    FileType := LowerCase(Trim(ExtractFileExt(ParamStr(1))));
// Das soll doch sicherlich zur Typen-Bestimmung dienen, oder?
    for ArrayIndex := 0 to 10 do
      if FileExt[ArrayIndex] = FileType then
        Break;

    if FileType <> '' then
    begin
// aber hier ist ArrayIndex möglicherweise unbestimmt - das ist ja nur ne for-Schleifen-Variable!
      case ArrayIndex of
        // Audio oder Video
        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11:
        begin
// Sicher, das nichts ungutes passieren kann, wenn bei AddFiles auch der Dateiname der Exe mit reinkommt? 
          AddFiles(paramfiles);
        end;
        // Playlist
      end;
    end;
  end;
end;
[/quote]

Nils_13 6. Apr 2007 16:45

Re: "Öffnen mit" und Dateiproblem
 
Ich bezweifele, dass dort ein Fehler passiert, aber ich werde es mir nachher noch anschauen, da ich gerade kein Delphi habe (Debian).


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