Seite 1 von 2

Pfad ermitteln bei 'Öffnen mit'

Verfasst: 23.03.2006 17:44
von DeltaG
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

Verfasst: 23.03.2006 17:47
von ts-soft
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

Verfasst: 23.03.2006 17:57
von Green Snake
ich glaube das müsste ProgramParameter sein

Edit:
wenn ich dich richtig verstanden habe:
JA, es geht mit programparameter :D

Verfasst: 23.03.2006 18:03
von DeltaG
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

Verfasst: 23.03.2006 18:03
von ts-soft

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
Liefert Dir den Pfad zu Deiner Exe, und zwar auch wenn Du in der IDE kompilierst. Ansonsten genügt GetPathPart(ProgramFilename())

Verfasst: 23.03.2006 18:04
von Green Snake
ich sagte doch, ProgramParameter()

oder bin ich da voll falsch? :?

Verfasst: 23.03.2006 18:21
von DeltaG
@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

Verfasst: 24.03.2006 16:09
von DeltaG
Hallo!

Wie versprochen kommt hier die Rückmeldung.

Der Tip von Green Snake es mit ProgramParameter() zu versuchen war goldrichtig. :allright:

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. :oops:
Es gibt sicherliche sehr viele Möglichkeiten, das Programm anders zu gestalten, doch es erledigt ersteinmal seine Aufgabe. :wink:

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
;-
Das dazugehörige Include-File:

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

Verfasst: 24.03.2006 16:29
von Kiffi
Hallo DeltaG,

Finde ich gut, dass Du hier ein Feedback gibst (das tun nicht viele)!

> Bitte nicht zu sehr zerreißen, da Erstlingswerk. :oops:

nee, keine Panik. Dein Projekt ist top! :allright:

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.

Verfasst: 24.03.2006 16:31
von AND51
Ich muss dich loben, du programmierst sehr ordentlich!

meine erstes Werk sah etwas anders aus... :oops: 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?