Seite 1 von 1

Dateityp durch Programm öffnen

Verfasst: 20.11.2016 09:48
von kartmanne
HI,

das Thema kenne ich generell nicht, deshalb betrifft diese Frage eine Mischung aus windows- und pb. Als Anfänger sei's gestattet :-)

Also:
Mein mit pb erzeugtes Programm kann Daten in einer Datei speichern und auch wieder lesen. Die Dateiendung hab ich mal mit .zlv festgelegt. Aus dem Programm heraus kann ich diese Dateien mit den Befehlen (OpenFile(), etc) öffnen, lesen, beschreiben usw.

"Komfortabel" wäre ein Öffnen der Dateien durch Doppelklick oder durch Ziehen auf das Programm-icon.

Wie geht das? Und wie geht das in pb?

Re: Dateityp durch Programm öffnen

Verfasst: 20.11.2016 11:16
von ts-soft
Dann siehe Dir erstmal den Befehl ProgramParameter() an. Erstmal versuchen die Datei als Parameter zu übergeben.

Als nächstes, wäre es dann an der Zeit, diesen Dateityp in Windows zum öffnen zu registrieren. Hier gibt es verschiedene
Möglichkeiten. Am einfachsten ist es jedoch, auf so eine Datei einen Rechtsklick und dann Öffnen mit wählen.

Re: Dateityp durch Programm öffnen

Verfasst: 20.11.2016 12:03
von kartmanne
HI,

Danke.

programparameter() und weiteres in dieser Themengruppe hatte ich bisher nicht im Blick. Per Drag&Drop kriege ich nun den vollständigen Pfad der so übergebenen Datei bei Programmstart. Das kann ich weiter benutzen :-).

Geht das auch so einfach, wenn ich die Datei auf (ein Fenster) mein bereits laufendes Programm ziehe? Bisher wird bei dieser Aktion der cursor zu einem "Halteverbot-Zeichen"

Offnen mit und dann Datei wähnlen (ggf. Häckchen setzten) kenne ich. Das ist mir jedoch zu "halbautomatisch" :-) DAS genau hätt ich gern "vollautomatisch", so dass der Programmnutzen eben nur den Doppelklick auf die Datei machen müßte.

Re: Dateityp durch Programm öffnen

Verfasst: 20.11.2016 13:17
von Bisonte
Für das "automatische" öffnen wirst Du evt. hier fündig.
Beinhaltet allerdings Manipulation der Registry, was für einen "Anfänger", wie Du dich ja bezeichnest, schnell zu einer mittelschweren Katastrophe
führen kann.

Bei "Drag&Drop" auf das laufende Fenster, sieh dir einfach mal die Beispiele in der Hilfe (F1) des gleichnamigen Kapitels an.

Re: Dateityp durch Programm öffnen

Verfasst: 20.11.2016 13:22
von ts-soft
Geht das auch so einfach, wenn ich die Datei auf (ein Fenster) mein bereits laufendes Programm ziehe? Bisher wird bei dieser Aktion der cursor zu einem "Halteverbot-Zeichen"
Dafür DragDrop aktivieren und benutzen. Siehe Hilfe!
so dass der Programmnutzen eben nur den Doppelklick auf die Datei machen müßte.
Siehe Dir mal diese Inlcude an: http://www.purebasic.fr/german/viewtopi ... 60#p177460
Die Procedure: AssociateFile(AF_Ext$,ext_description$,programm$,icon$) sollte Dir weiterhelfen.
Ob die Datei noch läuft, da sehr alt, mußte selber testen und korrigieren.

PS: Besser ist es die FileAssociation einem Installer zu überlassen, weil das spart viel Ärger wenn die Registry mal im A*sch ist!

Re: Dateityp durch Programm öffnen

Verfasst: 25.11.2016 04:13
von udg
Programmspezivische Dateiendung in der Registry eintragen (an den Anfang deines Codes packen) ohne Gewähr. Funktioniert hier bei meinem MusikPlayer PB Version 5.30 x86:

Code: Alles auswählen

;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;- Registriere DeinProgramm und Icon in der Registry 
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#SHCNE_ASSOCCHANGED = $8000000 ; überprüfe Eintrag beim Start des Programmes
#SHCNF_IDLIST = $0            ; überprüfe Eintrag beim Start des Programmes
Procedure CreateRegistryKeyValue(topKey.i, KeyName$, ValueName$, Value$, Type.i=#REG_SZ, ComputerName$="")
      Protected SecurityAttributes.SECURITY_ATTRIBUTES
      Protected NewKey.i, GetHandle.i, RemoteRegistry.i
      Protected Datas$, Value.i
      Protected cbData.i
     
      ; Key erstellen
      If Left(KeyName$, 1) = "\"
        KeyName$ = Right(KeyName$, Len(KeyName$) - 1)
      EndIf
      Debug p
     
      If ComputerName$ = ""
        GetHandle = RegCreateKeyEx_(topKey, KeyName$, 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, @SecurityAttributes, @NewKey, @GetHandle)
      Else
        RegConnectRegistry_(ComputerName$, topKey, @RemoteRegistry)
        GetHandle = RegCreateKeyEx_(RemoteRegistry, KeyName$, 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, @SecurityAttributes, @NewKey, @GetHandle)
      EndIf
     
      ; Key setzen
      If GetHandle = #ERROR_SUCCESS
        cbData = 255
        Datas$ = Space(255)
           
        Select Type
           Case #REG_SZ
              GetHandle = RegSetValueEx_(NewKey, ValueName$, 0, #REG_SZ,    @Value$, StringByteLength(Value$) + 1)
           Case #REG_DWORD
              Value = Val(Value$)
              GetHandle = RegSetValueEx_(NewKey, ValueName$, 0, #REG_DWORD, @Value$, 4)
        EndSelect
        RegCloseKey_(NewKey)
      EndIf
    EndProcedure
     
    Procedure AssociateFileExtension(Key$, Ext$, ExtDescription$, Programm$, Icon$, PrgKey$, CmdDescription$, CmdKey$)  ; Dateierweiterung in Registry eintragen
      Protected Cmd$                                                                                                    ; Command
      Protected CmdPath$                                                                                                ; Pfad zu dem Eintrag
     
       CmdPath$ = Key$+"\shell\"+CmdDescription$+"\command"                           ; Pfad erstellen
       Cmd$     = Chr('"')+Programm$+Chr('"') + " " + Chr('"')+"%1"+Chr('"')          ; Command erstellen
       CreateRegistryKeyValue(#HKEY_CLASSES_ROOT,   "."+Ext$,   "", Key$)             ; Schlüssel für die Erweiterung
       CreateRegistryKeyValue(#HKEY_CLASSES_ROOT,   Key$,       "", ExtDescription$)  ; Beschreibung
       CreateRegistryKeyValue(#HKEY_CLASSES_ROOT,   CmdPath$,   "", Cmd$)             ; Programmaufruf
       
       If Icon$                                                                       ; Wenn ein Icon angegeben ist ...
         CreateRegistryKeyValue(#HKEY_CLASSES_ROOT, Key$+"\DefaultIcon",  "", Icon$)  ; Icon-Datei eintragen
       EndIf
    EndProcedure
  
AssociateFileExtension("DeinProgramm", "zlv", "DeinProgramm", ProgramFilename(), ProgramFilename() + ",-1", "DeinProgramm", "open", "")  ; REGISTRY EINTRAG für OPEN DeinProgramm

SHChangeNotify_(#SHCNE_ASSOCCHANGED, #SHCNF_IDLIST, 0, 0) ; überprüfe Eintrag beim Start des Programmes
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; Ende Registriere DeinProgramm und Icon in der Registry 
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Re: Dateityp durch Programm öffnen

Verfasst: 25.11.2016 18:07
von kartmanne
HI,

Anfänger: ist sehr selektiv. Mir fehlt schlicht ein "windows"-Wissen. Deshalb kann ich mit pb recht viel erreichen, da es mir als Nutzer ebensoviel abnimmt.

Drag&Drop: :oops: :oops: :oops:

Danke für die Hinweise zum Registrieren. Wie oben geschrieben, muß ich erst herausfinden, ob und wie mir das hilft. Es erscheint mir ersteinmal... zu viel, da... siehe oben. Es bringt nix, wenn ich das abtipper, und dann nicht mal bemerken kann, ob da ein Fehler irgendwo ist und was der inzwischen angerichtet hat. Der Hinweis zu einem Installer ist besser. Gips einen empfehlenswerten - für einen Anfänger :wink: ?

Re: Dateityp durch Programm öffnen

Verfasst: 25.11.2016 18:23
von ts-soft
Ich würde Inno Setup empfehlen.
Aber da mußt Du dich natürlich auch erstmal einarbeiten. Es gibt deutsche Tutorials, diverse Editoren usw., mußt Du Dir aber
selber im Internet raussuchen.