Programmaufruf über Stringgadget

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Programmaufruf über Stringgadget

Beitrag 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
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Programmaufruf über Stringgadget

Beitrag 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.
a²+b²=mc²
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Programmaufruf über Stringgadget

Beitrag 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
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Re: Programmaufruf über Stringgadget

Beitrag 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
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Programmaufruf über Stringgadget

Beitrag 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
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Re: Programmaufruf über Stringgadget

Beitrag 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
Bild
Win11 Pro 64-Bit, PB_6.11b1
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: Programmaufruf über Stringgadget

Beitrag 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.
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
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Programmaufruf über Stringgadget

Beitrag 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
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
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: Programmaufruf über Stringgadget

Beitrag 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:
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
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Programmaufruf über Stringgadget

Beitrag 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
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Antworten