Adăugarea unei interfețe grafice la VBScript (Programare, Interfață Utilizator, Vbscript)

Deniz da King a intrebat.

În prezent lucrez la un script vbs, dar am nevoie de interacțiunea utilizatorului cu scriptul. Practic am nevoie de două butoane și 4 căsuțe de control ( căsuțele de control nu este important).

Mulțumesc în avans

Comentarii

  • Verificați această soluție WSH VBS GUI WSH VBS. –  > Por omegastripes.
3 răspunsuri
peter

VBScript are dialoguri, numai că nu multe și nu există casete de selectare, ar fi nevoie de un obiect COM pentru a face acest lucru (și există). Sunt sigur că știi Messagebox și aici un exemplu de Popup mai puțin cunoscut

Dim WshShell, BtnCode
Set WshShell = WScript.CreateObject("WScript.Shell")

BtnCode = WshShell.Popup("Do you feel alright?", 7, "Answer This Question:", 4 + 32)

Select Case BtnCode
   case 6      WScript.Echo "Glad to hear you feel alright."
   case 7      WScript.Echo "Hope you're feeling better soon."
   case -1     WScript.Echo "Is there anybody out there?"
End Select

Cu toate acestea, cea mai bună modalitate de a avea mai multe dialoguri în vbscript este folosirea HTA. iată un exemplu

<HTML><HEAD>
   <HTA:APPLICATION
   ID = "oApp"
   APPLICATIONNAME = "Example"
   BORDER = "thick"
   CAPTION = "yes"
   ICON = "app.ico"
   SHOWINTASKBAR = "yes"
   SINGLEINSTANCE = "yes"
   SYSMENU = "yes"
   WINDOWSTATE = "normal"
   SCROLL = "yes"
   SCROLLFLAT = "yes"
   VERSION = "1.0"
   INNERBORDER = "yes"
   SELECTION = "no"
   MAXIMIZEBUTTON = "yes"
   MINIMIZEBUTTON = "yes"
   NAVIGABLE = "yes"
   CONTEXTMENU = "yes"
   BORDERSTYLE = "normal"
   >

   <SCRIPT language="vbscript">
   sub SimpleExeample()
     document.body.innerHTML = "<form name=myform><input type=checkbox name=chk1>Check me<br><br><button onclick='alert(myform.chk1.checked)'>Show if checked</button></form>"
   end sub
   </SCRIPT>

</HEAD>
<BODY onLoad="SimpleExeample()">
</BODY>
</HTML>

Într-un singur lucru sunt de acord cu Cody, vbscript este aproape mort, dacă vă apucați de programare alegeți un alt limbaj. Aruncați o privire la Ruby, începutul este ușor de învățat și este DISTRACTIV. aici un exemplu de script ruby u folosind pantofi ca GUI

require 'green_shoes'
Shoes.app{
  button("Click me!"){alert("You clicked me.")}
}

EDIT: din moment ce alternativa mea Ruby ridică unele întrebări, aici un mod mai tradiționalel mai aproape de Vbscript folosește același exemplu. Exemplul de mai sus este folosit mai mult pentru un mod de programare funcțional înlănțuit.

require 'green_shoes'
Shoes.app do
  button("Click me!") do
    alert("You clicked me.")
  end
end

Comentarii

  • Singurul lucru pe care Popup îl adaugă la MsgBox este un timp de așteptare opțional. În rest, totul este la fel. Nu există suport pentru căsuțe de selectare sau butoane personalizate. –  > Por Cody Gray.
  • Cunosc limbajul java, dar trebuie să fac ceva de bază, cum ar fi vbs. Nu pot să testez codurile acum, dar când mă întorc acasă o să le testez. Mulțumesc.  > Por Deniz da King.
  • nu spun asta, dar este posibil cu soluția HTA, am adaptat exemplul pentru a arăta asta în mod clar.  > Por peter.
  • @peter De ce spui că vbscript este mort ? Poți să te duci la orice calculator la întâmplare și acolo ai un interpretor vbscript de folosit. Pe majoritatea computerelor aleatorii, nu ai voie să instalezi software nou. Cum obții atunci interpretul ruby ? –  > Por Shodan.
  • Trebuie să fiu de acord că faptul că VBScript este în esență integrat în Windows îl face extrem de valoros pentru multe sarcini. –  > Por StayOnTarget.
Igor Krupitsky

Cea mai bună abordare pe care am găsit-o este să deschidem fișierul HTA din VBS utilizând „WScript.Shell Run” și să comunicăm înapoi către VBS utilizând un fișier XML.

Exemplu (dialog.vbs)

Set fso = CreateObject("Scripting.FileSystemObject") 
Set oFile = fso.GetFile(Wscript.ScriptFullName) 
sFolder = oFile.ParentFolder 
sHtaFilePath = sFolder & "dialog.hta"
Dim oShell: Set oShell = CreateObject("WScript.Shell")
oShell.Run sHtaFilePath, 1, True

'Load return data from XML File
If fso.FileExists(sHtaFilePath & ".xml") Then
    Set oXml = CreateObject("Microsoft.XMLDOM")
    oXML.async = False
    oXML.load sHtaFilePath & ".xml"

    MsgBox "Value 1: " & oXML.SelectSingleNode("/root/txt1").text
    MsgBox "Value 2: " & oXML.SelectSingleNode("/root/txt2").text

    fso.DeleteFile sHtaFilePath & ".xml"
End If

Exemplu HTA (dialog.hta)

<html>
  <title>Test</title>
  <head>
  <HTA:APPLICATION 
  ID=oHTA 
  SINGLEINSTANCE="yes"
  SCROLL="no"
  />
</head>

<script language="vbscript">
  Window.ResizeTo 300, 200
  Set fso = CreateObject("Scripting.FileSystemObject") 

  Sub Send()
    Dim sFilePath: sFilePath = Replace(location.href,"file:///","")
    sFilePath = Replace(sFilePath,"/","")
    sFilePath = Replace(sFilePath," %20"," ")

    'Save return date to XML File
    Set oXml = CreateObject("Microsoft.XMLDOM")
    Set oRoot = oXml.createElement("root")
    oXml.appendChild oRoot
    AddXmlVal oXml, oRoot, "txt1", txt1.value
    AddXmlVal oXml, oRoot, "txt2", txt2.value
    oXml.Save sFilePath & ".xml"

    self.Close()
  End Sub

  Sub AddXmlVal(oXml, oRoot, sName, sVal)
    Set oNode = oXml.createElement(sName)
    oNode.Text = sVal
    oRoot.appendChild oNode
  End Sub

</script>

<body>
  <div>
    Value 1 
    <input id="txt1" style="width: 100px;">
  </div>

  <div>
    Value 2 
    <select id=txt2 style="width: 100px;">
      <option value="A">A</option>
      <option value="B">B</option>
      <option value="C">D</option>
    </select>
  </div>

<p align=center>
  <input type="button" value="Send" onclick="Send()">
  <input type="button" value="close" onclick="self.Close()">
</p>

</body>
</html>

O abordare și mai bună este ca fișierul HTA să fie creat de fișierul VBS și apoi șters. În acest fel, HTA nu trebuie să fie distribuit împreună cu VBS.

Set fso = CreateObject("Scripting.FileSystemObject") 

sHtml = "<div>Value 1 " & _
    "<input id='txt1' style='width: 100px'>" & _
  "</div>" & _
  "<div>Value 2 " & _
    "<select id='txt2' style='width: 100px'>" & _
      "<option value='A'>A</option>" & _
      "<option value='B'>B</option>" & _
      "<option value='C'>D</option>" & _
    "</select>" & _
  "</div>" & _
  "<p align=center>" & _
    "<input type='button' value='Send' onclick='Send()'> " & _
    "<input type='button' value='Close' onclick='self.Close()'>" & _
  "</p>"

  Set oRet = OpenDialog(sHtml, "txt1,txt2", 300, 200, "Dialog 1")
  MsgBox "Value 1: " & oRet("txt1") & ", Value 2: " & oRet("txt2")

'==================================
Function OpenDialog(sHtml, sFields,iWidth,iHeight, sTitle)
  sHtaFilePath = Wscript.ScriptFullName & ".hta"

  CreateHtaFile sHtaFilePath, sHtml, sFields,iWidth,iHeight,sTitle

  Set f = fso.GetFile(sHtaFilePath)
  f.attributes = f.attributes + 2 'Hidden

  Dim oShell: Set oShell = CreateObject("WScript.Shell")

  oShell.Run """" & sHtaFilePath & """", 1, True

  If fso.FileExists(sHtaFilePath) Then
    fso.DeleteFile sHtaFilePath
  End If

  Set oRet = CreateObject("Scripting.Dictionary")

  'Load return data from XML File
  If fso.FileExists(sHtaFilePath & ".xml") Then
      Set oXml = CreateObject("Microsoft.XMLDOM")
      oXML.async = False
      oXML.load sHtaFilePath & ".xml"

      For each sField In Split(sFields,",")
        oRet.Add trim(sField), oXML.SelectSingleNode("/root/" & trim(sField)).text
      Next

      fso.DeleteFile sHtaFilePath & ".xml"
  End If

  Set OpenDialog = oRet
End Function

Sub CreateHtaFile(sHtaFilePath, sHtml, sFields, iWidth, iHeight, sTitle)
  Set f = fso.CreateTextFile(sHtaFilePath, True)
  f.WriteLine "<html><title>FL Reporting</title><head><HTA:APPLICATION ID=oHTA SINGLEINSTANCE=""yes"" SCROLL=""no""/></head>"
  f.WriteLine "<script language=""vbscript"">"
  f.WriteLine "Window.ResizeTo " & iWidth & ", " & iHeight
  f.WriteLine "Set fso = CreateObject(""Scripting.FileSystemObject"")"
  f.WriteLine ""
  f.WriteLine "Sub Send()"
  f.WriteLine " Dim sFilePath: sFilePath = Replace(location.href,""file:///"","""")"
  f.WriteLine " sFilePath = Replace(sFilePath,""/"","""")"
  f.WriteLine " sFilePath = Replace(sFilePath,""%20"","" "")"
  f.WriteLine " Set oXml = CreateObject(""Microsoft.XMLDOM"")"
  f.WriteLine " Set oRoot = oXml.createElement(""root"")"
  f.WriteLine " oXml.appendChild oRoot"

  For each sField In Split(sFields,",")
    f.WriteLine " AddXmlVal oXml, oRoot, """ & sField & """, GetVal(" & sField & ")"
  Next

  f.WriteLine " oXml.Save sFilePath & "".xml"""
  f.WriteLine " self.Close()"
  f.WriteLine "End Sub"
  f.WriteLine ""
  f.WriteLine "Sub AddXmlVal(oXml, oRoot, sName, sVal)"
  f.WriteLine " Set oNode = oXml.createElement(sName)"
  f.WriteLine " oNode.Text = sVal"
  f.WriteLine " oRoot.appendChild oNode"
  f.WriteLine "End Sub"
  f.WriteLine ""
  f.WriteLine "Function GetVal(o)"
  f.WriteLine " GetVal = o.value"
  f.WriteLine " If o.Type = ""checkbox"" Then"
  f.WriteLine "   If o.checked = False Then"
  f.WriteLine "     GetVal = """""
  f.WriteLine "   End If"
  f.WriteLine " End If"
  f.WriteLine "End Function"  
  f.WriteLine "</script>"
  f.WriteLine "<body>"
  f.WriteLine sHtml
  f.WriteLine "</body></html>"
  f.Close
End Sub

Mergeți la Namhyeon

Astăzi, aș dori să vă prezint două proiecte care vă vor interesa.

  • wsh-js-gtk – Creați-vă propria interfață grafică din JScript/VBScript cu GTK-server
  • welsonjs – Construiți o aplicație desktop Windows bazată pe WSH/HTA cu polyfills de compatibilitate ES6/HTML5, module.exports(NodeJS), implementare de module în stil NodeJS.