Seite 1 von 2

Programmaufruf über Stringgadget

Verfasst: 02.02.2011 17:52
von Velindos
Hallo Leute,
jetzt steh ich auf der Leitung. Habe ein Stringgadget per Drag&Drop mit einen Link aus unseren Forum gefüttert. Anschliessend nach dem Druck auf den Button geht der Aufruf einiger Seiten, aber bei einer Forumeintrag streikt er.

Code: Alles auswählen

;{
Enumeration
  #Window_0
EndEnumeration
; Variablen
Enumeration
  #B_Pfad
  #T_Pfad
  #T_Pfad2
EndEnumeration
;}
Global PfadString$

If OpenWindow(#Window_0, 220, 0, 470, 300, "Programmaufruf über Stringgadget",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
  StringGadget(#T_Pfad, 120, 230, 240, 20, "Test")
  TextGadget(#T_Pfad2, 120, 210, 370, 20, "Drag&Drop Stringgadget, beim Drücken wird Programm aufgerufen! ")
  ButtonGadget (#B_Pfad,100,230,20,20,"#")
  
  EnableGadgetDrop(#T_Pfad,     #PB_Drop_Text,    #PB_Drag_Copy)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow : Break
      Case #PB_Event_Gadget
        Gadget = EventGadget()
        Select Gadget
          Case #B_Pfad                          ;: End     
            PfadString$= GetGadgetText(#T_Pfad)
            RunProgram("Explorer.exe", PfadString$,"",#PB_Program_Wait)
        EndSelect
      Case #PB_Event_Menu
        Select EventMenu()
          Case 1
            ; SendMessage_(GadgetID(#String_0), #WM_PASTE, 0, 0)
        EndSelect
      Case #PB_Event_GadgetDrop
        Select EventGadget()
          Case #T_Pfad
            AddGadgetItem(#T_Pfad, -1, EventDropText())
            SetGadgetText(#T_Pfad, EventDropText()) 
        EndSelect 
    EndSelect
  ForEver
EndIf 

; Problem beim Aufruf
; http://forums.purebasic.com/german/viewtopic.php?f=16&t=23643&sid=8f4080e7b12c1bf7df56f652c9cbf68b
Vielleicht wisst ihr mehr?
Gruss ... Velindos

Re: Programmaufruf über Stringgadget

Verfasst: 02.02.2011 18:03
von Kiffi
wenn Du den Link im Standardprogramm öffnen willst, dann reicht ein

Code: Alles auswählen

RunProgram(PfadString$)
Ansonsten wüsste ich nicht, was der Explorer mit dem Link anstellen soll. ;-)

Grüße ... Kiffi

// Edit: Ach ja: Bitte in Zukunft aussagekräftige Fehlermeldungen posten.
'Er streikt' ist ziemlich schwammig.

Re: Programmaufruf über Stringgadget

Verfasst: 02.02.2011 19:14
von Velindos
Hallo,
was ich konkret meine ist. Wenn ich einen eindeutigen Link hineinziehe ruft er die Seite auf, wie du sagst! Aber bei einen Link wie diesen
http://forums.purebasic.com/german/post ... 501653bdaf
zickt er und ruft den Explorer auf. Nun im Windows werden ja Standard Programme festgelegt, kann man in PB auf diese verweisen?
Oder gibt es eine Möglichkeit das Windows Programmverzeichnis mit einen Befehl zu ermitteln. Dadurch könnte man ermitteln ob Firefox installiert ist und darauf antworten?

Gruss ... Velindos

Re: Programmaufruf über Stringgadget

Verfasst: 02.02.2011 19:19
von Falko
Kiffi hat, wenn es so gemeint war, schon die richtige Lösung für Links mittels
Runprogramm gegeben. Da aber hier Leerzeichen, sowie Steuerzeichn enthalten sein können,
sollte man zusätzlich den Pfad mit "..." vorgeben.
Ich würde es so ändern, dann geht es mit dem Link:

Code: Alles auswählen

RunProgram("explorer.exe ",Chr(34)+PfadString$+Chr(34),"",#PB_Program_Wait)
Gruß Falko

Re: Programmaufruf über Stringgadget

Verfasst: 03.02.2011 08:44
von Velindos
Hallo Falko,

auf Anhieb getroffen! Was sag ich du bist "Spitze". Hab es gleich bei meinen Problem programmiert und siehe da es funzt!
Besten Dank für deine Hilfe!

Was mich noch interessieren würde ist, ob man den aktuellen Pfad der "installierten Programme" unter Windows mit PB abfragen bzw. direkt einstellen(#Winprogpfad etc) kann.

Hab irgendwo ein Beispiel mal gesehen aber nicht mehr gefunden. Damit hätte man die Möglichkeit nachzusehen ob ein Verzeichniss C:\Programme (x86) vorhanden ist. Vielleicht weiss jemand etwas dazu!

Nochmals besten Dank FALKO!

Gruss ... Velindos

Re: Programmaufruf über Stringgadget

Verfasst: 03.02.2011 16:10
von Falko
Freut mich, das es dir geholfen hat. Zu den Programmverzeichnissen weiß ich jetzt nicht,
wie du es genau definiert haben musst.

Ein Beispiel wäre mittels API und SpecialFolders:

http://www.purearea.net/pb/CodeArchiv/W ... Folders.pb

Dort muß aber das declare noch korrigiert werden:
Declare.s GetSpecialfolder(CSIDL) zu Declare.s GetSpecialfolder(CSIDL.l)

oder dieses hier:
http://www.purearea.net/pb/CodeArchiv/W ... ocation.pb
aus den oben genannten, im Source vorgegebenen Konstanten kannst du dann den Debug oder
die Ausgabe anpassen, wie z.B. Debug GetSpecialFolderLocation(#CSIDL_PROGRAM_FILESX86)
um das Programmverzeichnis zu erhalten.

Weitere Programmbeispiele findest du hier, die helfen könnten:
http://www.purearea.net/pb/german/index.htm

Gruß Falko

Re: Programmaufruf über Stringgadget

Verfasst: 03.02.2011 16:47
von ts-soft
Die Funktion im CodeArchiv enhält einen Fehler, besser diese:

Code: Alles auswählen

Procedure.s GetSpecialFolder(CSIDL)
  Protected *itemid.ITEMIDLIST
  Protected location.s = Space(#MAX_PATH)

  If SHGetSpecialFolderLocation_ (0, CSIDL, @*itemid) = #NOERROR
    If SHGetPathFromIDList_(*itemid, @location)
      CoTaskMemFree_(*itemid)
      If Right(location, 1) <> "\" : location + "\" : EndIf
      ProcedureReturn location
    EndIf
  EndIf
EndProcedure
Die erforderlichen Konstanten sind alle vordefiniert oder im StruktureViewer unter Konstanten/#CSIDL_...
nachschauen.

Re: Programmaufruf über Stringgadget

Verfasst: 03.02.2011 17:07
von Velindos
Hallo Leute,
Danke, das ist ja mega Schnell! Gleich ausprobiert und eure Angaben eingearbeitet und funzt! Sehe hier schon eine Chance das ich die aktuellen Pfade ermittle.
Wobei ich beim ersten Test den Pfad für den "Programs folder: " gleich "C:\Users\SONY\AppData\Roaming\Microsoft\Windows\StartMenue\Programs\" , mir aber "C:\Programme\" oder "C:\Programme (x86)\ erwartet habe. Muss sagen habe erst das erste Beispiel probiert und muss erst das zweite studieren! Werde noch tüffteln.
Die erforderlichen Konstanten sind alle vordefiniert oder im StruktureViewer unter Konstanten/#CSIDL_...
nachschauen.
Habe deine Anderung eingespielt und funzt. Zu weiteren muss ich eingestehen, also von dem habe ich keine Ahnung, wie und wo nachschauen, da fehlt bei mir schon der Ansatz Strukturviewer, trotzdem Danke für den Rat.
Gruss ... Velindos

Re: Programmaufruf über Stringgadget

Verfasst: 03.02.2011 17:17
von ts-soft
Werkzeuge - Strukturverzeichnis oder ALT + S

Code: Alles auswählen

Procedure.s GetSpecialFolder(CSIDL)
  Protected *itemid.ITEMIDLIST
  Protected location.s = Space(#MAX_PATH)

  If SHGetSpecialFolderLocation_ (0, CSIDL, @*itemid) = #NOERROR
    If SHGetPathFromIDList_(*itemid, @location)
      CoTaskMemFree_(*itemid)
      If Right(location, 1) <> "\" : location + "\" : EndIf
      ProcedureReturn location
    EndIf
  EndIf
EndProcedure

Debug GetSpecialFolder(#CSIDL_PROGRAM_FILES)
Oder einfacher:

Code: Alles auswählen

Debug GetEnvironmentVariable("ProgramFiles") + "\"
Und jetzt programmierst Du erstmal wieder selber :wink:

Re: Programmaufruf über Stringgadget

Verfasst: 05.02.2011 18:19
von Velindos
Hallo,
super Tip, fragte mich die ganze Zeit wo die Constantenübersicht ist, DANKE. Natürlich lege ich mich wieder rein.
Gruss ... Velindos