Entwickler-Ecke

Windows API - Öffnen mit... --> Mein Programm


Bergmann89 - Mo 23.06.08 00:01
Titel: Öffnen mit... --> Mein Programm
HI,

ich hab mir n Prog geschrieben wo man die Sachen die man erstellt hat in ner Datei speichern kann. Die Datei hat n eigenen Typ von mir bekommen, also keinen dem Windows schon kennt.

Nun die Frage: Ist es möglich beim Doppelklick auf die Datei das Programm zu öffnen und gleichzeitig die Datei zu laden?
Wenn ja, wie geht das?

Schonma danke für die Hilfe.

MfG & Thx Bergmann.

Moderiert von user profile iconChristian S.: Überflüssige Zeilenumbrüche entfernt
Moderiert von user profile iconChristian S.: Topic aus VCL (Visual Component Library) verschoben am Mo 23.06.2008 um 00:03


optikandy - Mo 23.06.08 00:25

du kannst bei windows einstellen, dass sich dateien mit bestimmten endungen auch mit bestimmten programmen öffnen lassen...
z.B. ".doc" wird normal mit "microsoft word" geöffnet... du kannst es aber auch so einstellen, dass diese datei mit dem programm von open office geöffnet wird.

aber keine ahnung, wie der diese datei dann auch laden kann...


Xentar - Mo 23.06.08 00:30

http://www.delphi-treff.de/tipps/dateienverzeichnisse/tipp/154/


Bergmann89 - Mo 23.06.08 00:46

HI,

wie man das im Win-Explorer ändert weiß ich, aber ich wollte das gern mein Programm erledigen lassen, denn nich jeder User weiß wie das geht^^
Sowas wie Xentar verlinkt hat such ich...THX!
Jetzt muss ich nur noch in erfahrung bringen wie ich die Datei dann laden kann, wenn ich sie per Doppelklick geöffnet hab!

MfG & Thx Bergmann.

Moderiert von user profile iconNarses: überflüssige Zeilenumbrüche entfernt


optikandy - Mo 23.06.08 01:12

bei dem link von xentar steht doch ganz unten, wie man eine solche datei öffnet.
so wie ich das sehe, musst du den Parameter im zusammenhang von assingfile beutzen.

musst das mal ausprobieren, habe kp ob das klappt


huuuuuh - Mo 23.06.08 07:41

Der Dateiname und Pfad wird in dem fall als parameter der datei beim start mitgegeben. wie man das dann auffängt weiss ich allerdings nich
edit: hier dürftest du was finden http://www.tutorials.de/forum/delphi-kylix-pascal/12431-delphi-datei-mit-selbst-geschriebenem-programm-oeffnen.html


Timosch - Mo 23.06.08 12:34

Dateiname wird als erster Parameter übergeben, also

Delphi-Quelltext
1:
If ParamCount>0 then ShowMessage(ParamStr(1));                    

(zeigt dir z.B. den Dateinamen an)


hansa - Mo 23.06.08 14:52

user profile iconTimosch hat folgendes geschrieben:
(zeigt dir z.B. den Dateinamen an)


Das ist etwas irreführend. Der Dateiname des aufrufenden Programmes wird mit ParamStr (0) angezeigt. Wird dieses Programm mit einem oder mehreren Parametern aufgerufen, dann wäre der erst davon ParamStr (1)


Timosch - Mo 23.06.08 14:54

user profile iconhansa hat folgendes geschrieben:
user profile iconTimosch hat folgendes geschrieben:
(zeigt dir z.B. den Dateinamen an)


Das ist etwas irreführend. Der Dateiname des aufrufenden Programmes wird mit ParamStr (0) angezeigt. Wird dieses Programm mit einem oder mehreren Parametern aufgerufen, dann wäre der erst davon ParamStr (1)

Sag ich doch. Wenn über Öffnen mit eine Datei mit deinem Programm geöffnet wird, steht der Name dieser Datei in ParamStr(1), also dem ersten Parameter. ParamStr(0) ist ja kein Parameter, sondern der Programmname selbst.


Bergmann89 - So 29.06.08 21:31

Hi,

hab folgendes Problem:
Ich hab das jetzt alles in meinem Prog eingebaut, die Dateiendung Regestriert und das Prog
geht auch auf wenn ich die Datei anklick.
Nur wird sie nich geladen! Und das is noch nich alles: das komiche ist, wenn ich die Datei
nich anklick, sondern auf die Exe zieh, dann gehts??! VERWIRRENT!!
Wenn ich mich richtig erinner, dann ging das mit anklicken in meinem Test-Programm auch.
kp was ich falsch mach!


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
if ParamCount > 0 then
  if ParamSTR(1) <> '' then
    if ExtractFileExt(ParamSTR(1)) <> '.mdb' then
      begin
        MessageDLG('Unbekanntes Format',mtError,[mbOK],0);
        Close;
      end
    else
      begin
        Daten.Clear;
        Daten.LoadFromFile(ParamSTR(1));
        MessageDLG('Laden erfolgreich!',mtInformation,[mbOK],0);
      end;

Kann jmd helfen?

MfG Bergmann.


huuuuuh - So 29.06.08 21:42

gibt es denn eine fehlermeldung beim falschen format?


Bergmann89 - So 29.06.08 21:44

ne eben nich, das Programm geht einfach auf, so als ob ich ganz normal auf die exe geklickt hätte...


Bergmann89 - So 29.06.08 22:13

jetzt gehts...?!

vorher

Delphi-Quelltext
1:
InstallExt('.XXX','XXX-Datei','XXX',ExtractFilePath(ParamStr(0))+'XXX.exe','',0)                    

nachher

Delphi-Quelltext
1:
InstallExt('.XXX','XXX-Datei','XXX',ExtractFilePath(ParamStr(0))+'XXX.exe','"%1"',0)                    


und jetzt wird der name übergeben, aber nur bis ein Leerzeichen kommt. dann muss ich den nächsten ParamStr nehmen, komisch!
auf jedenfall sieht das jetzt so aus:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
  if ParamCount > 0 then
    begin
      if FileExists(ParamStr(1)) then FileName := ParamStr(1)
      else
        begin
          FileName := '';
          for i := 1 to ParamCount do
            begin
              FileName := FileName + ParamStr(i);
              if i <> ParamCount then FileName := FileName + ' '
            end;
        end;

      if ParamSTR(1) <> '' then
        if ExtractFileExt(FileName) <> '.mdb' then
          begin
            MessageDLG('Unbekanntes Format',mtError,[mbOK],0);
            Close;
          end
        else
          begin
            Daten.Clear;
            Daten.LoadFromFile(FileName);
            MessageDLG('Laden erfolgreich!',mtInformation,[mbOK],0);
          end;
    end;


MfG Bergmann.


eins.null - Di 29.07.08 09:38

Hallo

Sobald ein Leerzeichen im Parameter-String auftaucht, wird dies als neuer Parameter gewertet. Somit wird auch 'Eigene Dateien' als zwei Parameter gewertet.

Als Lösung schlage ich dir vor, alle Pfade und Dateinamen immer in Anfüruhrungszeichen zu setzen.
(So wie du das schon mit '"%1"' gemacht hast)


Beste Grüße
Matthias


Wolle92 - Di 29.07.08 12:28

Aber obwohl er es so gemacht hat, werden es mehrere parameter


Terra23 - Di 10.11.09 16:54

So, da ja meine Antwort von vorhin verschwunden ist, frage ich halt nochmal:

Ist es normal, dass der Pfad der zu öffnenden Datei immer zerlegt wird, sobald man auf ein Leerzeichen trifft?

Gibt es keine andere Möglichkeit, damit man sich nicht selbst den kompletten Pfad zusammenbasteln muss?

Und warum muss man erst abfragen...


Delphi-Quelltext
1:
If FileExists(ParamStr(1))...                    


..., wenn der Pfad doch zerlegt ist? Dann kann ja nur False bei rauskommen, denn in meinem Programm ist ParamStr(1) nämlich C:\Dokumente

Gruß,

Terra


Xentar - Di 10.11.09 19:50

Und für sowas gräbst du einen ein Jahr alten Thread aus?

Pack den Parameter in "" und schon gehts.


Terra23 - Di 10.11.09 20:01

Ja, für sowas grabe ich einen solch alten Thread aus, denn in diesem Thread gab es ja auch augenscheinlich keine Lösung.

Was willst du eigentlich von mir? Auf der einen Seite soll man die Suche benutzen bevor man neue Threads aufmacht und auf der anderen Seite darf man dann in die gefundenen Threads nicht posten?

Ich war 5 Jahre in einem anderen Forum Moderator und ich kann deine Engstirnigkeit absolut nicht nachvollziehen. Wäre der Thread nun 2 oder 3 Jahre alt, dann ja. Aber so?

Und BTW: Meine Parameter sind in "", so wie es auch in EasyHelper gemacht wurde.

Bei mir steht also: '"%1"' und der Pfad wird trotzdem zerlegt.

Ich habe es aber inzwischen so gelöst, dass ich die Anzahl von ParamCount abfrage und den Pfad selber wieder zusammenbaue.

Terra

PS: Wenn es nicht erwünscht ist, dass man in solche Threads postet, dann solltet ihr die vielleicht schließen. Aber da hier ja auch noch keine Lösung für den Threadersteller vorhanden war (sonst hätte er das Thema ja markiert), wird man ja wohl posten dürfen, oder?


Martok - Di 10.11.09 20:05

Ja und? Du hast doch schon einen Thread.

Fürs Protokoll: http://delphi-forum.de/viewtopic.php?p=584088#584088

Antwort kommt gleich, da wo sie hingehört.


Bergmann89 - Di 10.11.09 20:38

Hey,

eigentlich war das Problem behoben, habs nur nich abgehackt ^^

MfG Bergmann


Terra23 - Di 10.11.09 21:04

Dann schlage ich an dieser Stelle vor, dass in solchen Fällen evtl. die Lösungen nochmal zum Abschluss gepostet werden, denn ich persönlich bin nicht draus schlau geworden.

Aber wie dem auch sei:

Ich möchte mich nochmal eben für meine forsche Antwort entschuldigen, die ich Xentar gab.

Terra


Bergmann89 - Mi 11.11.09 08:24

Wo hast du denn noch Probleme? Mit den Leerzeichen in dem String? Das hab ich auch net anders gelöst als du: einfach mit ner Schleife zusammenstückeln...


jaenicke - Mi 11.11.09 11:35

Das ist gar nicht notwendig, wenn die in Anführungszeichen stehen. Dann wird das komplett in einem Parameter übergeben.

Das Problem in diesem Fall war, dass nicht nur einmal welche hinzugefügt wurden, sondern zweimal. Also ""%1"", so dass es wieder nicht ging. Mit "%1" in der Registry klappt es auch.


Terra23 - Mi 11.11.09 11:52

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Das ist gar nicht notwendig, wenn die in Anführungszeichen stehen. Dann wird das komplett in einem Parameter übergeben.

Das Problem in diesem Fall war, dass nicht nur einmal welche hinzugefügt wurden, sondern zweimal. Also ""%1"", so dass es wieder nicht ging. Mit "%1" in der Registry klappt es auch.


Das Problem an sich war, dass der Fehler schon aus dem Eintrag in EasyHelper hervorging.

Für alle, die in Zukunft nach diesem Thread suchen und keine Lösung finden:



Dies ist die Funktion zur Verknüpfung einer Dateiendung mit dem Programm:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
function TForm1.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;


--> Der orangene Teil ist im EasyHelper-Eintrag auch noch in " " geschrieben.

So verknüpft man eine bestimmte Dateiendung mit dem Programm:

Delphi-Quelltext
1:
InstallExt('.Dateiendung''Beschreibung der Dateiendung''Beschreibung des Programms', ParamStr(0), '"%1"'0);                    


--> ParamStr(0) gibt den Pfad der EXE zurück, die die Datei ausführen soll; in diesem Fall ist es euer Programm. Die 0 am Ende gibt das Icon eurer Anwendung mit und somit erhalten die registrierten Dateien euer Logo, so wie auch jedes Word-Dokument ein eigenes Symbol hat.

So wertet man die Parameter aus, wenn die Datei z.B. über den Explorer geöffnet wird:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
If ParamCount > 0 Then
  If FileExists (ParamStr(1) )
  Then Begin
       FileName := ParamStr(1);
       TueWas mit FileName; /// z.B. FileName an den OpenDialog übergeben und die Öffnen-Prozedur durchlaufen
       End;


Danke für die Hilfe (auch in meinem Thread) und dann sollte man hier evtl. dann doch schließen, bevor jemand den Thread in einem Jahr nochmal ausgräbt. ;)

Gruß,

Terra


Xentar - Mi 11.11.09 13:02

user profile iconTerra23 hat folgendes geschrieben Zum zitierten Posting springen:
Danke für die Hilfe (auch in meinem Thread) und dann sollte man hier evtl. dann doch schließen, bevor jemand den Thread in einem Jahr nochmal ausgräbt. ;)

Dann wird er schon drauf aufmerksam gemacht.. :D