Dateityp durch Programm öffnen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
kartmanne
Beiträge: 108
Registriert: 19.03.2015 18:16
Wohnort: Altenstadt
Kontaktdaten:

Dateityp durch Programm öffnen

Beitrag 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?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Dateityp durch Programm öffnen

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
kartmanne
Beiträge: 108
Registriert: 19.03.2015 18:16
Wohnort: Altenstadt
Kontaktdaten:

Re: Dateityp durch Programm öffnen

Beitrag 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.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Dateityp durch Programm öffnen

Beitrag 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.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Dateityp durch Programm öffnen

Beitrag 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!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: Dateityp durch Programm öffnen

Beitrag 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 
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
kartmanne
Beiträge: 108
Registriert: 19.03.2015 18:16
Wohnort: Altenstadt
Kontaktdaten:

Re: Dateityp durch Programm öffnen

Beitrag 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: ?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Dateityp durch Programm öffnen

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten