Pfad ermitteln bei 'Öffnen mit'
Pfad ermitteln bei 'Öffnen mit'
Hallo!
Typische Anfängerfrage:
Wie ermittle ich mit PB den Pfad zu einer Datei, die ich mittels 'Öffnen mit' mit meinem in PB (v4b7) geschriebenen Programm aufrufe?
DeltaG
Typische Anfängerfrage:
Wie ermittle ich mit PB den Pfad zu einer Datei, die ich mittels 'Öffnen mit' mit meinem in PB (v4b7) geschriebenen Programm aufrufe?
DeltaG
- 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
GetPathPart() gibt Dir den Pfad der Datei zurück. Ich nehme mal an, dies ist
nicht das, was Du suchst, aber dazu fehlen einfach die erforderlichen Infos
nicht das, was Du suchst, aber dazu fehlen einfach die erforderlichen Infos
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- Green Snake
- Beiträge: 1394
- Registriert: 22.02.2005 19:08
Hallo ts-soft!
Beispiel:
Es soll eine Datei "C:/Ordner1/Unterordner/Test.txt" mittels RMB -> 'Öffnen mit' -> 'Eigenes PB-Programm' aufgerufen werden. Die 'Test.txt' soll dann mit dem aufrufenden Programm bearbeitet werden.
Soviel ich weiß, liefert GetPathPart() den Pfad-Anteil ("C:/Ordner1/Unterordner/") eines bereits bekannten Pfades zurück.
Doch dazu müßte ich erst diesen gesamten Pfad "C:/Ordner1/Unterordner/Test.txt" kennen.
DeltaG
Beispiel:
Es soll eine Datei "C:/Ordner1/Unterordner/Test.txt" mittels RMB -> 'Öffnen mit' -> 'Eigenes PB-Programm' aufgerufen werden. Die 'Test.txt' soll dann mit dem aufrufenden Programm bearbeitet werden.
Soviel ich weiß, liefert GetPathPart() den Pfad-Anteil ("C:/Ordner1/Unterordner/") eines bereits bekannten Pfades zurück.
Doch dazu müßte ich erst diesen gesamten Pfad "C:/Ordner1/Unterordner/Test.txt" kennen.
DeltaG
- 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
Code: Alles auswählen
Procedure.s GetExePath()
Protected Result.s
If GetPathPart(ProgramFilename()) = #PB_Compiler_Home + "Compilers\"
Result = Space(#MAX_PATH)
GetCurrentDirectory_(#MAX_PATH, @Result)
Else
Result = GetPathPart(ProgramFilename())
EndIf
If Right(Result, 1) <> "\" : Result + "\" : EndIf
ProcedureReturn Result
EndProcedure
Zuletzt geändert von ts-soft am 23.03.2006 18:07, insgesamt 2-mal geändert.
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- Green Snake
- Beiträge: 1394
- Registriert: 22.02.2005 19:08
@ts-soft und Green Snake:
Danke für eure Antworten.
Ich bin leider (noch) nicht so schnell (Anfänger, deshalb Anfänger-Forum) mit dem Programmieren. Werde mir eure Antworten genau ansehen, PB starten und austesten, ob es funktioniert.
Melde mich (heute nicht) wieder.
Vorab nochmals besten Dank für die Antworten.
DeltaG
Danke für eure Antworten.
Ich bin leider (noch) nicht so schnell (Anfänger, deshalb Anfänger-Forum) mit dem Programmieren. Werde mir eure Antworten genau ansehen, PB starten und austesten, ob es funktioniert.
Melde mich (heute nicht) wieder.
Vorab nochmals besten Dank für die Antworten.
DeltaG
Hallo!
Wie versprochen kommt hier die Rückmeldung.
Der Tip von Green Snake es mit ProgramParameter() zu versuchen war goldrichtig.
Damit ihr seht, wozu ich die Info brauchte, habe ich den Quellcode drangehängt.
Das Programm dient dem Vergleichen zweier Files. Es kann, deshalb meine Frage, mit Rechtsklick und 'Öffnen mit' auf eines der beiden zu vergleichenden Files gestartet werden.
Bitte nicht zu sehr zerreißen, da Erstlingswerk.
Es gibt sicherliche sehr viele Möglichkeiten, das Programm anders zu gestalten, doch es erledigt ersteinmal seine Aufgabe.
DeltaG
Das dazugehörige Include-File:
Wie versprochen kommt hier die Rückmeldung.
Der Tip von Green Snake es mit ProgramParameter() zu versuchen war goldrichtig.

Damit ihr seht, wozu ich die Info brauchte, habe ich den Quellcode drangehängt.
Das Programm dient dem Vergleichen zweier Files. Es kann, deshalb meine Frage, mit Rechtsklick und 'Öffnen mit' auf eines der beiden zu vergleichenden Files gestartet werden.
Bitte nicht zu sehr zerreißen, da Erstlingswerk.

Es gibt sicherliche sehr viele Möglichkeiten, das Programm anders zu gestalten, doch es erledigt ersteinmal seine Aufgabe.

DeltaG
Code: Alles auswählen
IncludeFile "IncludeFile.pb"
Global OK1, OK2
Global Sector
Global FileLenght1, FileLenght2
Global FileName1$, FileName2$
Global File1$, File2$
Global FilePath1$, FilePath2$
Global Dim df1$(256)
Global Dim df2$(256)
Global Home$="C:\"
Procedure GetFile1()
SetGadgetText(#String_1, "")
SetGadgetText(#Text_1, "Filesize: ")
If FilePath1$
Home$=FilePath1$
ElseIf FilePath2$
Home$=FilePath2$
Else
Home$="C:\"
EndIf
File1$ = OpenFileRequester("Select File 1", Home$, "Alle Dateien (*.*)|*.*", 2)
If File1$
OK1=ReadFile(1, File1$)
If OK1
FileName1$=GetFilePart(File1$)
FilePath1$=GetPathPart(File1$)
SetGadgetText(#String_1, FileName1$)
FileLenght1=Lof(1)-1
TGFcolor=$000000
If FileLenght1+1=0
TGFcolor=$0000FF
EndIf
SetGadgetColor(#Text_1, #PB_Gadget_FrontColor, TGFcolor)
SetGadgetText(#Text_1, "Filesize: " + RSet(Hex(FileLenght1+1),8,"0")+ " Byte")
Sector=0
EndIf
EndIf
EndProcedure
Procedure GetFile2()
SetGadgetText(#String_2, "")
SetGadgetText(#Text_2, "Filesize: ")
If FilePath2$
Home$=FilePath2$
ElseIf FilePath1$
Home$=FilePath1$
Else
Home$="C:\"
EndIf
File2$ = OpenFileRequester("Select File 2", Home$, "Alle Dateien (*.*)|*.*", 2)
If File2$
OK2=ReadFile(2, File2$)
If OK2
FileName2$=GetFilePart(File2$)
FilePath2$=GetPathPart(File2$)
SetGadgetText(#String_2, FileName2$)
FileLenght2=Lof(2)-1
TGFcolor=$000000
If FileLenght2+1=0
TGFcolor=$0000FF
EndIf
SetGadgetColor(#Text_2, #PB_Gadget_FrontColor, TGFcolor)
SetGadgetText(#Text_2, "Filesize: " + RSet(Hex(FileLenght2+1),8,"0")+ " Byte")
EndIf
Sector=0
EndIf
EndProcedure
Procedure RedrawBox()
Box(14, 63, 352, 387, RGB(212,208,200))
Box(404, 63, 352, 387, RGB(212,208,200))
FrontColor($000000)
EndProcedure ; RedrawBox()
Procedure ShowPage()
If OK1; file 1 is selected, so we got something to show
FileSeek(1,Sector*256)
i=0
j=0
byte.c=0
Repeat
f1$= " "+RSet(Hex(i*8+256*Sector),8,"0")+": "
merk$=""
j=0
Repeat
byte=ReadByte(1)
df1$(i*8+j)=Chr(byte)
f1$=f1$+RSet(Hex(byte),2,"0")+" "
If byte<32
merk$=merk$+"."
Else
merk$=merk$+Chr(byte)
EndIf
INC j
Until j=8
f1$=f1$+" "+merk$+" "
DrawText(20, 64+i*12, f1$)
INC i
Until i=32
EndIf
If OK2; file 2 is selected, so we got something to show
FileSeek(2,Sector*256)
i=0
j=0
byte=0
Repeat
f2$= " "+RSet(Hex(i*8+256*Sector),8,"0")+": "
merk$=""
j=0
Repeat
byte=ReadByte(2)
df2$(i*8+j)=Chr(byte)
f2$=f2$+RSet(Hex(byte),2,"0")+" "
If byte<32
merk$=merk$+"."
Else
merk$=merk$+Chr(byte)
EndIf
INC j
Until j=8
f2$=f2$+" "+merk$+" "
DrawText(410, 64+i*12, f2$)
INC i
Until i=32
EndIf
EndProcedure ; ShowPage()
Procedure ShowDiff()
If OK1 And OK2; we got two files to compare
DrawingMode(2)
i=0
Repeat
j=0
Repeat
If df1$(i*8+j) <> df2$(i*8+j)
Box(110+j*21, 64+i*12,16,12)
Box(300+j*7, 64+i*12,7,12)
Box(500+j*21, 64+i*12,16,12)
Box(690+j*7, 64+i*12,7,12)
EndIf
INC j
Until j=8
INC i
Until i=32
DrawingMode(0)
EndIf
EndProcedure ; ShowDiff()
Procedure Compare()
If File1$=File2$
MessageRequester("Ooops...", "Please select two different files.", #MB_OK|#MB_ICONWARNING)
Else
INC Sector
FileSeek(1,Sector * 256)
FileSeek(2,Sector * 256)
i=(Sector)*256
If i<FileLenght1 And i<FileLenght2
If FileLenght1>FileLenght2
ProgressBarGadget(#ProgressBar_1, 10, 493, 750, 10, 0, FileLenght1/256)
Else
ProgressBarGadget(#ProgressBar_1, 10, 493, 750, 10, 0, FileLenght2/256)
EndIf
Repeat
byte=ReadByte(1)
SetGadgetState (#ProgressBar_1, i/256)
INC i
Until (byte <> ReadByte(2)) Or i>FileLenght1 Or i>FileLenght2
DEC i
Sector = Int (i/256 )
ShowPage()
ShowDiff()
SetGadgetState (#ProgressBar_1, 0)
EndIf
EndIf
EndProcedure ; Compare()
;---MAIN--------------------------------------------------------
Open_Window_1()
; Get Parameter if started via 'Öffnen mit'
If CountProgramParameters()
File1$ = ProgramParameter()
FilePath1$=GetPathPart(File1$)
FileName1$ = GetFilePart(File1$)
OK1=ReadFile(1, File1$)
SetGadgetText(#String_1, FileName1$)
FileLenght1=Lof(1)-1
TGFcolor=$000000
If FileLenght1+1=0
TGFcolor=$0000FF
EndIf
SetGadgetColor(#Text_1, #PB_Gadget_FrontColor, TGFcolor)
SetGadgetText(#Text_1, "Filesize: " + RSet(Hex(FileLenght1+1),8,"0")+ " Byte")
ShowPage()
EndIf
;- Main loop
Repeat
Event = WaitWindowEvent()
;- Repaint
If Event = #PB_Event_Repaint
ShowPage()
ShowDiff()
EndIf
;- Menu
If Event = #PB_Event_Menu
MenuID = EventMenu()
;- -Open
If MenuID = #MENU_1
If OK1; we already openend a file as file 1, so close it first
CloseFile(1)
OK1=0
EndIf
GetFile1()
If OK2; we already openend a file as file 2, so close it first
CloseFile(2)
OK2=0
EndIf
GetFile2()
If File1$=File2$ Or File1$="" Or File2$=""; just to make sure you noticed
MessageRequester("Ooops...", "Please select two different files.", #MB_OK|#MB_ICONWARNING)
RedrawBox()
EndIf
If OK1 And OK2; show the new files
ShowPage()
ShowDiff()
EndIf
;- -Close
ElseIf MenuID = #Menu_2
If OK1
CloseFile(1)
EndIf
If OK2
CloseFile(2)
EndIf
End
;- -Compare
ElseIf MenuID = #Menu_3
Compare()
;- -Top of file
ElseIf MenuID = #Menu_4
Sector=0
ShowPage()
ShowDiff()
;- -Bottom of file #1
ElseIf MenuID = #MENU_5
Sector=Int(FileLenght1/256)
ShowPage()
ShowDiff()
;- -Bottom of file #2
ElseIf MenuID = #Menu_6
Sector=Int(FileLenght2/256)
ShowPage()
ShowDiff()
;- -Help ;-)
ElseIf MenuID = #Menu_7
InfoText$="Do you really need help???"+Chr(13)
InfoText$=InfoText$+"Sorry, but this tiny program comes without any help."+Chr(13)
MessageRequester("Help needed?",InfoText$,#PB_MessageRequester_Ok)
If OK1 And OK2
ShowPage()
ShowDiff()
EndIf
InfoText$="Here are some hints:"+Chr(13)
InfoText$=InfoText$+Chr(13)+"... = Pick files to compare."+Chr(13)+Chr(13)
InfoText$=InfoText$+Chr(13)+"T = Move to start of file."+Chr(13)
InfoText$=InfoText$+Chr(13)+"B = Move to end of file."+Chr(13)
InfoText$=InfoText$+Chr(13)+"U = Move one page up."+Chr(13)
InfoText$=InfoText$+Chr(13)+"D = Move one page down."+Chr(13)+Chr(13)
InfoText$=InfoText$+Chr(13)+"Compare = Find next different page"+Chr(13)+Chr(13)
InfoText$=InfoText$+Chr(13)+"Or use the menue"+Chr(13)
MessageRequester("Almost no help...",InfoText$,#PB_MessageRequester_Ok)
;- -Info
ElseIf MenuID = #MENU_8
InfoText$="FileCompare is a little tool to compare files."+Chr(13)+Chr(13)
InfoText$=InfoText$+"Written in PureBasic v4b7 by DeltaG."+Chr(13)+Chr(13)
InfoText$=InfoText$+"V 0.0.1 ;-) There will be no update."+Chr(13)
MessageRequester("Info...",InfoText$,#PB_MessageRequester_Ok)
;- -Up
ElseIf MenuID = #Menu_9
DEC Sector
If Sector<0
Sector=0
EndIf
ShowPage()
ShowDiff()
;- -Down
ElseIf MenuID = #Menu_10
INC Sector
If Sector > Int(FileLenght1/256) And Sector > Int(FileLenght2/256)
DEC Sector
EndIf
ShowPage()
ShowDiff()
EndIf; Menu
EndIf; EventMenu
;- Gadgets
If Event = #PB_Event_Gadget
GadgetID = EventGadget()
;- -Select file #1
If GadgetID = #Button_1
If OK1
CloseFile(1)
OK1=0
EndIf
GetFile1()
RedrawBox()
ShowPage()
;- -Select file #2
ElseIf GadgetID = #Button_2
If OK2
CloseFile(2)
OK2=0
EndIf
GetFile2()
RedrawBox()
ShowPage()
;- -Compare
ElseIf GadgetID = #Button_3
Compare()
;- -Top
ElseIf GadgetID = #Button_4
Sector=0
ShowPage()
ShowDiff()
;- -Bottom
; (toggles between file 1 and file 2)
ElseIf GadgetID = #Button_5
If Sector=Int(FileLenght2/256)
Sector=Int(FileLenght1/256)
Else
Sector=Int(FileLenght2/256)
EndIf
ShowPage()
ShowDiff()
;- -Up
ElseIf GadgetID = #Button_6
DEC Sector
If Sector<0
Sector=0
EndIf
ShowPage()
ShowDiff()
;- -Down
ElseIf GadgetID = #Button_7
INC Sector
If Sector > Int(FileLenght1/256) And Sector > Int(FileLenght2/256)
DEC Sector
EndIf
ShowPage()
ShowDiff()
EndIf; Gadgets
EndIf; EventMenu
Until Event = #PB_Event_CloseWindow
End
;-
Code: Alles auswählen
; IncludeFile for CompareFile
;- Window Constants
;
Enumeration
#Window_1
EndEnumeration
;- MenuBar Constants
;
Enumeration
#MenuBar_1
EndEnumeration
Enumeration
#MENU_1
#Menu_2
#Menu_3
#Menu_4
#MENU_5
#Menu_6
#Menu_7
#MENU_8
#MENU_9
#MENU_10
EndEnumeration
;- Gadget Constants
;
Enumeration
#Frame3D_1
#Frame3D_2
#Frame3D_3
#Frame3D_4
#String_1
#String_2
#Text_1
#Text_2
#Button_1
#Button_2
#Button_3
#Button_4
#Button_5
#Button_6
#Button_7
#ProgressBar_1
EndEnumeration
Procedure Open_Window_1()
If OpenWindow(#Window_1, 130,125,775,530 , "FileCompare", #PB_Window_SystemMenu | #PB_Window_TitleBar)
If LoadFont (1, "Courier New", 8)
If StartDrawing(WindowOutput(#Window_1))
DrawingMode(0)
DrawingFont(FontID(1))
If CreateMenu(#MenuBar_1, WindowID(#Window_1))
MenuTitle("File")
MenuItem(#MENU_1, "&Open"+Chr(9)+" O")
MenuBar()
MenuItem(#Menu_2, "&Quit"+Chr(9)+" Q")
MenuTitle("Project")
MenuItem(#Menu_3, "&Compare"+Chr(9)+" C")
MenuBar()
MenuItem(#Menu_4, "&Top"+Chr(9)+" T")
MenuItem(#MENU_5, "Bottom File &1"+Chr(9)+" 1")
MenuItem(#Menu_6, "Bottom File &2"+Chr(9)+" 2")
MenuTitle("Help")
MenuItem(#Menu_7, "&Help"+Chr(9)+" H")
MenuBar()
MenuItem(#MENU_8, "&Info"+Chr(9)+" I")
EndIf
If CreateGadgetList(WindowID(#Window_1))
ProgressBarGadget(#ProgressBar_1, 10, 493, 750, 10, 0, 10)
StringGadget(#String_1, 50, 20, 310, 20, "")
StringGadget(#String_2, 440, 20, 310, 20, "")
Frame3DGadget(#Frame3D_1, 10, 0, 360, 50, "File 1")
Frame3DGadget(#Frame3D_2, 400, 0, 360, 50, "File 2")
ButtonGadget(#Button_1, 20, 20, 20, 20, "...")
ButtonGadget(#Button_2, 410, 20, 20, 20, "...")
ButtonGadget(#Button_3, 350, 463, 70, 20, "Compare")
Frame3DGadget(#Frame3D_3, 10, 54, 360, 399, "")
Frame3DGadget(#Frame3D_4, 400, 54, 360, 399, "")
TextGadget(#Text_1, 70, 463, 200, 20, "Filesize: ", #PB_Text_Center)
TextGadget(#Text_2, 500, 463, 200, 20, "Filesize: ", #PB_Text_Center)
ButtonGadget(#Button_4, 375, 60, 20, 30, "T")
ButtonGadget(#Button_5, 375, 423, 20, 30, "B")
ButtonGadget(#Button_6, 375, 216, 20, 30, "U")
ButtonGadget(#Button_7, 375, 266, 20, 30, "D")
GadgetToolTip(#Button_1, "Select file 1")
GadgetToolTip(#Button_2, "Select file 2")
GadgetToolTip(#Button_3, "Compare files and jump to next difference")
GadgetToolTip(#Button_4, "Top of files")
GadgetToolTip(#Button_5, "Toggles between end of file 1 and end of file 2")
GadgetToolTip(#Button_6, "One page up")
GadgetToolTip(#Button_7, "One page down")
GadgetToolTip(#String_1, "Selected file 1")
GadgetToolTip(#String_2, "Selected file 2")
EndIf
AddKeyboardShortcut(0, #PB_Shortcut_O, #MENU_1)
AddKeyboardShortcut(0, #PB_Shortcut_Q, #MENU_2)
AddKeyboardShortcut(0, #PB_Shortcut_C, #MENU_3)
AddKeyboardShortcut(0, #PB_Shortcut_T, #MENU_4)
AddKeyboardShortcut(0, #PB_Shortcut_1, #MENU_5)
AddKeyboardShortcut(0, #PB_Shortcut_2, #MENU_6)
AddKeyboardShortcut(0, #PB_Shortcut_H, #MENU_7)
AddKeyboardShortcut(0, #PB_Shortcut_I, #MENU_8)
AddKeyboardShortcut(0, #PB_Shortcut_U, #MENU_9)
AddKeyboardShortcut(0, #PB_Shortcut_D, #MENU_10)
EndIf
EndIf
EndIf
EndProcedure
Hallo DeltaG,
Finde ich gut, dass Du hier ein Feedback gibst (das tun nicht viele)!
> Bitte nicht zu sehr zerreißen, da Erstlingswerk.
nee, keine Panik. Dein Projekt ist top!
Kleiner Tipp noch: Für Chr(13) könnte man die Konstante #CR$
verwenden. Ist leichter lesbar und spart 3 Zeichen beim tippen.
Ansonsten: Hut ab!
Vielleicht hast Du Lust, Dein Projekt im ShowCase der PureArea zu
veröffentlichen?
Grüße ... Kiffi
// Edit
Kleiner Zusatz noch: Es ist eigentlich nicht üblich, Menü-Shortcuts mit nur
einem Buchstaben aufzurufen. File/Open wird beispielsweise mit Ctrl + O
aufgerufen.
Finde ich gut, dass Du hier ein Feedback gibst (das tun nicht viele)!
> Bitte nicht zu sehr zerreißen, da Erstlingswerk.

nee, keine Panik. Dein Projekt ist top!

Kleiner Tipp noch: Für Chr(13) könnte man die Konstante #CR$
verwenden. Ist leichter lesbar und spart 3 Zeichen beim tippen.

Ansonsten: Hut ab!
Vielleicht hast Du Lust, Dein Projekt im ShowCase der PureArea zu
veröffentlichen?
Grüße ... Kiffi
// Edit
Kleiner Zusatz noch: Es ist eigentlich nicht üblich, Menü-Shortcuts mit nur
einem Buchstaben aufzurufen. File/Open wird beispielsweise mit Ctrl + O
aufgerufen.
Zuletzt geändert von Kiffi am 24.03.2006 16:31, insgesamt 1-mal geändert.
a²+b²=mc²
Ich muss dich loben, du programmierst sehr ordentlich!
meine erstes Werk sah etwas anders aus...
Ich hatte zum Beispiel keine Einrückungen und so wie ich es von BASIC gewohnt war, habe ich 'des öfteren' mal GOTO verwendet...
Aber das vergleichen zweier Dateien geht doch auch mit COMP ?
START => AUSFÜHREN => CMD => COMP /?
oder irre ich mich?
meine erstes Werk sah etwas anders aus...

Aber das vergleichen zweier Dateien geht doch auch mit COMP ?
START => AUSFÜHREN => CMD => COMP /?
oder irre ich mich?
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End