Author Topic: EA16 JavaScript DLGInputBox bug  (Read 16180 times)

Jan van Duuren

  • EA Novice
  • *
  • Posts: 12
  • Karma: +1/-0
    • View Profile
Re: EA16 JavaScript DLGInputBox bug
« Reply #15 on: December 21, 2023, 05:28:44 pm »
I did find a solution for a messagebox and inputbox using EA 16.x (64 bit) and Javascript.

for a MessageBox it is rather simple solution. Instead of using Scriptcontrol you can use WScript.Shell:

function MsgBox(prompt="", title="MsgBox", style=0) {
   style += 4096; // to make the popup active (foreground)
   var WSH = new COMObject("WScript.Shell");
   return WSH.Popup(prompt, 0, title, style);
}


Regarding an inputbox it is a little more complex. I am using two steps. First it creates a small vbs script in %TEMP% folder. Then it uses this vbs script to display the input box.

function InputBox(prompt="Input", title="Inputbox", defaultText="") {
   const fso = new COMObject("Scripting.FileSystemObject");
   const WSH = new COMObject("WScript.Shell");
   const vbsScriptFile = WSH.ExpandEnvironmentStrings("%TEMP%\\ea_inputbox.vbs");
   const tmpInputFile  = WSH.ExpandEnvironmentStrings("%TEMP%\\ea_input.tmp");
   
   if (!fso.FileExists(vbsScriptFile)) {
      CreateInputboxVBS(vbsScriptFile);
   }
   
   WSH.Run(`WScript "${vbsScriptFile}" "${tmpInputFile}" "${prompt}" "${title}" "${defaultText}"`, 1, true);
   const ForReading = 1;
   const file = fso.OpenTextFile(tmpInputFile, ForReading);
   if (!file.AtEndOfStream) {
      return file.ReadAll();
   }
}

function CreateInputboxVBS(vbsScriptFile) {
   // function to create the inputbox VBS sripts in folder
   const vbsScriptContent = `dim tmpInputFile, prompt, title, defaultText, input
      Set objArgs = WScript.Arguments
      If objArgs.Count = 4 Then
         tmpInputFile = objArgs(0)
         prompt       = objArgs(1)
         title        = objArgs(2)
         defaultText  = objArgs(3)
         input        = InputBox(prompt, title, defaultText)
      End if
         
      Const ForWriting = 2, CreateIfNeeded = true
      set fso = CreateObject("Scripting.FileSystemObject")
      set file = fso.OpenTextFile(tmpInputFile, ForWriting, CreateIfNeeded)
      file.write input
      file.close`.replace(/\t\t/g, '');
   
   const overwrite=true, unicode=true;
   const file = fso.CreateTextFile(vbsScriptFile, overwrite, unicode);
   file.Write(vbsScriptContent);
   file.Close();
}
« Last Edit: December 21, 2023, 05:32:46 pm by Jan van Duuren »
EA scripting since 2013 (JScript and Javascript)

Guillaume

  • EA Practitioner
  • ***
  • Posts: 1370
  • Karma: +42/-2
    • View Profile
    • www.umlchannel.com
Re: EA16 JavaScript DLGInputBox bug
« Reply #16 on: December 22, 2023, 08:32:25 pm »
Hi Jan,

Thank you for the information.
I confirm that MessageBox works, however I didn't manage to get the InputBox to work (EA 16.1 build 1628 64 bits).

I copied your code to a new Javascript EA script and added the following:

   MsgBox("test");
   var testVal = InputBox("test input");
   Session.Output(testVal);

I'm getting an error "fso is not defined" related with the following line:
const file = fso.CreateTextFile(vbsScriptFile, overwrite, unicode);

Any idea ?
Guillaume

Blog: www.umlchannel.com | Free utilities addin: www.eautils.com


Geert Bellekens

  • EA Guru
  • *****
  • Posts: 13381
  • Karma: +563/-33
  • Make EA work for YOU!
    • View Profile
    • Enterprise Architect Consultant and Value Added Reseller
Re: EA16 JavaScript DLGInputBox bug
« Reply #17 on: December 22, 2023, 09:11:22 pm »
You might want to try to add fso to the list of dimmed variables.

Geert

Jan van Duuren

  • EA Novice
  • *
  • Posts: 12
  • Karma: +1/-0
    • View Profile
Re: EA16 JavaScript DLGInputBox bug
« Reply #18 on: December 22, 2023, 09:36:15 pm »
yes, I have a global variable for fso.
You just can add the following line to function "CreateInputboxVBS(vbsScriptFile)"

 const fso = new COMObject("Scripting.FileSystemObject");

Code: [Select]
function InputBox(prompt="Input", title="Inputbox", defaultText="") {
   const fso = new COMObject("Scripting.FileSystemObject");
   const WSH = new COMObject("WScript.Shell");
   const vbsScriptFile = WSH.ExpandEnvironmentStrings("%TEMP%\\ea_inputbox.vbs");
   const tmpInputFile  = WSH.ExpandEnvironmentStrings("%TEMP%\\ea_input.tmp");
   
   if (!fso.FileExists(vbsScriptFile)) {
      CreateInputboxVBS(vbsScriptFile);
   }
   
   WSH.Run(`WScript "${vbsScriptFile}" "${tmpInputFile}" "${prompt}" "${title}" "${defaultText}"`, 1, true);
   const ForReading = 1;
   const file = fso.OpenTextFile(tmpInputFile, ForReading);
   if (!file.AtEndOfStream) {
      return file.ReadAll();
   }
}

function CreateInputboxVBS(vbsScriptFile) {
   // function to create the inputbox VBS sripts in folder
   const fso = new COMObject("Scripting.FileSystemObject");
   const vbsScriptContent = `dim tmpInputFile, prompt, title, defaultText, input
      Set objArgs = WScript.Arguments
      If objArgs.Count = 4 Then
         tmpInputFile = objArgs(0)
         prompt       = objArgs(1)
         title        = objArgs(2)
         defaultText  = objArgs(3)
         input        = InputBox(prompt, title, defaultText)
      End if
         
      Const ForWriting = 2, CreateIfNeeded = true
      set fso = CreateObject("Scripting.FileSystemObject")
      set file = fso.OpenTextFile(tmpInputFile, ForWriting, CreateIfNeeded)
      file.write input
      file.close`.replace(/\t\t/g, '');
   
   const overwrite=true, unicode=true;
   const file = fso.CreateTextFile(vbsScriptFile, overwrite, unicode);
   file.Write(vbsScriptContent);
   file.Close();
}
« Last Edit: December 22, 2023, 09:55:35 pm by Jan van Duuren »
EA scripting since 2013 (JScript and Javascript)

Jan van Duuren

  • EA Novice
  • *
  • Posts: 12
  • Karma: +1/-0
    • View Profile
Re: EA16 JavaScript DLGInputBox bug
« Reply #19 on: December 22, 2023, 10:37:37 pm »
herewith a working script

Code: [Select]
!INC Local Scripts.EAConstants-JScript

/*
 * Script Name:
 * Author:
 * Purpose:
 * Date:
 */
 
function main()
{
var testVal = InputBox("enter your input here", "My InputBox");
MsgBox(testVal);
}

main();

function MsgBox(prompt="", title="MsgBox", style=0) {
style += 4096; // to make the popup active (foreground)
var WSH = new COMObject("WScript.Shell");
return WSH.Popup(prompt, 0, title, style);
}

function InputBox(prompt="Input", title="Inputbox", defaultText="") {
const fso = new COMObject("Scripting.FileSystemObject");
const WSH = new COMObject("WScript.Shell");
const vbsScriptFile = WSH.ExpandEnvironmentStrings("%TEMP%\\ea_inputbox.vbs");
const tmpInputFile  = WSH.ExpandEnvironmentStrings("%TEMP%\\ea_input.tmp");

if (!fso.FileExists(vbsScriptFile)) {
CreateInputboxVBS(vbsScriptFile);
}

WSH.Run(`WScript "${vbsScriptFile}" "${tmpInputFile}" "${prompt}" "${title}" "${defaultText}"`, 1, true);
const ForReading = 1;
const file = fso.OpenTextFile(tmpInputFile, ForReading);
if (!file.AtEndOfStream) {
return file.ReadAll();
}
return "";
}

function CreateInputboxVBS(vbsScriptFile) {
// function to create the inputbox VBS sripts in folder
const fso = new COMObject("Scripting.FileSystemObject");
const vbsScriptContent = `dim tmpInputFile, prompt, title, defaultText, input
Set objArgs = WScript.Arguments
If objArgs.Count = 4 Then
tmpInputFile = objArgs(0)
prompt       = objArgs(1)
title        = objArgs(2)
defaultText  = objArgs(3)
input        = InputBox(prompt, title, defaultText)
End if

Const ForWriting = 2, CreateIfNeeded = true
set fso = CreateObject("Scripting.FileSystemObject")
set file = fso.OpenTextFile(tmpInputFile, ForWriting, CreateIfNeeded)
file.write input
file.close`.replace(/\t\t/g, '');

const overwrite=true, unicode=true;
const file = fso.CreateTextFile(vbsScriptFile, overwrite, unicode);
file.Write(vbsScriptContent);
file.Close();
}
« Last Edit: December 22, 2023, 10:39:20 pm by Jan van Duuren »
EA scripting since 2013 (JScript and Javascript)

Guillaume

  • EA Practitioner
  • ***
  • Posts: 1370
  • Karma: +42/-2
    • View Profile
    • www.umlchannel.com
Re: EA16 JavaScript DLGInputBox bug
« Reply #20 on: December 23, 2023, 12:45:39 am »
Hi Jan,

Thank you for the updated script, it worked  :D
Guillaume

Blog: www.umlchannel.com | Free utilities addin: www.eautils.com