Jump to content
Sign in to follow this  
Jos

20-9-2015: New SciTE4AutoIt3 available with the updated SciTE v3.6.0 release.

Recommended Posts

20-9-2015: Uploaded a new SciTE4AutoIt3.exe.

Merged the SciTE 3.6.0 source into our version and several fixes.
We now also have set the default encoding to UTF8 W/O Bom when no other File encoding is specified or special ASCII characters are detected in the source. 

 

Enjoy,
Jos

Addition/Changes/Fixes in the current installer:

20-9-2015
*** Merged the SciTE v 3.6.0 by Neil Hodgson with our own version of SciTE. (Jos)
    - More fixes to outputpane lexing to ensure FuncTrace generated lines work again.
    - Added tf8.auto.check=4 default to SciTEGlobal. properties to check files when opened for their encoding or else use utf8 w/o BOM ad default.
*** Updated AutoIt3Wrapper v15.920.938.0 (Jos)
    - 15.729.1555.1: Fixed /Watcher and /Jump2FirstError mechanism to kill the script when Ctrl+Break or via the Menu the script should be terminated.
    - 15.729.1555.2: Added Win10 to the Manifest and made that the default similar to what aut2exe does.
    - 15.729.1555.3: 15.729.1555.4 "Version Diff Source" now properly handling UTF encoded files.
    - 15.729.1555.4: Internal mods.
    - 15.729.1555.5: Added /RunAfter to copy to Programdir and Versioning without compiling.
    - 15.729.1555.6: Changes to the tempfiles generated to allow for concurrent sessions of Autot3Wrapper.
    - 15.729.1555.7: cleanup some tempfile remaining behind.
    - 15.729.1555.8: Fixed consolewrite in debug mode.
    - 15.729.1555.9: killed extra autoit3 pid when restarting the script.
    - 15.729.1555.10: Removed Compiled support statements.
    - 15.729.1555.11: Added a console message when Script requires Admin and SciTE is running on normal level that no console output will be displayed.
*** Updated Au3Stripper v15.920.938.0 (Jos)
    - 15.729.1555.2: Fixed issue for Include files with BOM encoding not recognizing #Include-once on the first line.
    - 15.729.1555.3: Fixed hardcrash in case de au3stripper didn't exist and /debug was specified.
    - 15.729.1555.4: Minor internal changes.
*** Updated SciTEConfig v15.920.938.0 (Jos)
    - added scheme OLD_LCD.SciTEConfig  (mLipok)
*** Updated Au3Stripper v15.729.1555.0 (Jos)
    - 15.729.1555.1: Fixed hardcrash in case an Include is used with BOM and #include-once on the first line.
*** Updated Tidy v15.920.938.0 (Jos)
    - 15.729.1555.1: Fixed hardcrash adding Gobal Const to the variable tables.

==> ScitillaHistory page containing all SciTE-Scintilla updates.
==> Visit the SciTE4AutoIt3 Download page for the latest versions
==> Check the newly formatted the online documentation for an overview of all extra's you get with this installer.

Edited by Jos

SciTE4AutoIt3 Full installer Download page   - Beta files       Read before posting     How to post scriptsource   Forum etiquette  Forum Rules 
 
Live for the present,
Dream of the future,
Learn from the past.
  :)

Share this post


Link to post
Share on other sites

maybe it related to : Fixed issue for Include files with BOM encoding not recognizing #Include-once on the first line.

if you have 3 scripts : main.au3; UDF_n1.au3 and UDF_n2.au3 encoded as UTF8 with BOM :

;# main.au3 ===================

#include "UDF_n1.au3"
#include "UDF_n2.au3"

script body

Exit
;==============================
;# UDF_n1.au3 =================
#include-once
#include "UDF_n2.au3"

script body
;==============================
;# UDF_n2.au3 =================
#include-once
#include "UDF_n1.au3"

script body
;==============================

now, if you run Syntax Check against main.au3 everything is ok

But : if you run Syntax Check against UDF_n1.au3 you get:

warning: $sSomeVariable_from_UDF_n1 already declared/assigned
error: $iSomeConst_from_UDF_n1 previously declared as a 'Const'.
error: SubFunction_from_UDF_n1() already defined.

same with UDF_n2.au3

warning: $sSomeVariable_from_UDF_n2 already declared/assigned
error: $iSomeConst_from_UDF_n2 previously declared as a 'Const'.
error: SubFunction_from_UDF_n2() already defined.

it seems Syntax Check not consider #include-once in head script

Edited by Iczer

Share this post


Link to post
Share on other sites

Maybe you have real errors in your script as the #included filenames are not the same!

In the Main.au3 they do not contain an underscores where as in the UDF_nx.au3 they do?

Jos

Edited by Jos

SciTE4AutoIt3 Full installer Download page   - Beta files       Read before posting     How to post scriptsource   Forum etiquette  Forum Rules 
 
Live for the present,
Dream of the future,
Learn from the past.
  :)

Share this post


Link to post
Share on other sites

no, i mistyped in previous post (corrected now)

if that was reason - i would also get errors after Syntax Check against main.au3 (not found/declared/defined. errors), but everything is ok

 

Share this post


Link to post
Share on other sites

save as UTF8 with BOM and make Syntax Check against each :

;# main.au3 ===================

#include "UDF_n1.au3"
#include "UDF_n2.au3"

SubFunction_UDF_n1_1()
SubFunction_UDF_n1_2()
SubFunction_UDF_n1_3()
SubFunction_UDF_n2_1()
SubFunction_UDF_n2_2()
SubFunction_UDF_n2_3()

Exit
;==============================
;# UDF_n1.au3 =================
#include-once
#include "UDF_n2.au3"
;
Global Const $UDF_n1_const_1 = 1
Global Const $UDF_n1_const_2 = 2
;------------------------------
Func SubFunction_UDF_n1_1()

EndFunc
;------------------------------
Func SubFunction_UDF_n1_2()

EndFunc
;------------------------------
Func SubFunction_UDF_n1_3()

EndFunc
;==============================
;# UDF_n2.au3 =================
#include-once
#include "UDF_n1.au3"
Global Const $UDF_n2_const_1 = 1
Global Const $UDF_n2_const_2 = 2
;------------------------------
Func SubFunction_UDF_n2_1()

EndFunc
;------------------------------
Func SubFunction_UDF_n2_2()

EndFunc
;------------------------------
Func SubFunction_UDF_n2_3()

EndFunc
;==============================

 

Share this post


Link to post
Share on other sites

Understand the issue now. I had made a "workaround" for UTF8/16 encoded main scripts quite some time ago, to copy the main script into a temp file before running au3check as at that time au3chech only supported Ascii.

UTF8 is now supported in au3check so I have removed the check for that in AutoIt3Wrapper and simply process the original file now with the current Beat version of AutoIt3Wrapper.

Jos 


SciTE4AutoIt3 Full installer Download page   - Beta files       Read before posting     How to post scriptsource   Forum etiquette  Forum Rules 
 
Live for the present,
Dream of the future,
Learn from the past.
  :)

Share this post


Link to post
Share on other sites

I Just open SciTe4AutoIt (lates version)

And for me all works correctly.
The same for you:

  1. F1 should open your instaled AutoIt release version
  2. ALT+F1 should open your instaled AutoIt beta version
  3. MENU: "Help/ Help F1" should open your AutoIt release version

which one do not work for you ?


Signature beginning:
Please remember: "AutoIt".....  Wondering who uses AutoIt and what it can be used for ?
* GHAPI UDF - modest beginning - communication with GitHub REST API Forum Rules *
Include Dependency Tree (Tool for analyzing script relations)
ADO.au3 UDF     POP3.au3 UDF     XML.au3 UDF    How to use IE.au3  UDF with  AutoIt v3.3.14.x  for other useful stuff click the following button

Spoiler

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. 

My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAP * WinSCP UDF * GHAPI UDF - modest begining - comunication with GitHub REST APIErrorLog.au3 UDF - A logging Library *

My contribution to others projects or UDF based on  others projects: * _sql.au3 UDF  * POP3.au3 UDF *  RTF Printer - UDF * XML.au3 UDF * ADO.au3 UDF SMTP Mailer UDF * Dual Monitor resolution detection * * 2GUI on Dual Monitor System * _SciLexer.au3 UDF * SciTE - Lexer for console pane

Useful links: * Forum Rules * Forum etiquette *  Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * 

Wiki: Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Good coding practices in AutoIt * 

OpenOffice/LibreOffice/XLS Related: WriterDemo.au3 * XLS/MDB from scratch with ADOX

IE Related:  * How to use IE.au3  UDF with  AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * IE in TaskSchedulerIE Embedded Control Versioning (use IE9+ and HTML5 in a GUI) *

PDF Related:How to get reference to PDF object embeded in IE *

I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions *  EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *

I also encourage you to check awesome @trancexx code:  * Create COM objects from modules without any demand on user to register anything. * Another COM object registering stuffOnHungApp handlerAvoid "AutoIt Error" message box in unknown errors  * HTML editor

"Homo sum; humani nil a me alienum puto" - Publius Terentius Afer
"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming"
:naughty:  :ranting:, be  :) and       \\//_.

Anticipating Errors :  "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty."

Signature last update: 2021-03-17

Share this post


Link to post
Share on other sites

What does Help/About SciTE tell you?
Have you installed the Prod and Beta version of AutoIt3 in the normal way and also installed the latest version of SciTE4AutoIt3 separate installer? 

Jos


SciTE4AutoIt3 Full installer Download page   - Beta files       Read before posting     How to post scriptsource   Forum etiquette  Forum Rules 
 
Live for the present,
Dream of the future,
Learn from the past.
  :)

Share this post


Link to post
Share on other sites

What does Help/About SciTE tell you?

SciTE
Version 3.5.4
    May 17 2015 16:32:11
by Neil Hodgson.
 Updated by Jos
Check the SciTE4AutoIt3 Homepage for Updates
December 1998-March 2015.
http://www.scintilla.org
Lua scripting language by TeCGraf, PUC-Rio
    http://www.lua.org
Contributors:
<snip>

 

Have you installed the Prod and Beta version of AutoIt3 in the normal way and also installed the latest version of SciTE4AutoIt3 separate installer? 

Yes! First I installed AutoIt 3.3.4.1 Then SciTE4AutoIt3 Then again AutoIt 3.3.15.0


EasyCodeIt - A cross-platform AutoIt implementation

DcodingTheWeb Forum - Follow for updates and Join for discussion

Share this post


Link to post
Share on other sites
SciTE
Version 3.6.0 
    Aug  4 2015 17:34:27
by Neil Hodgson.
 Updated by Jos

https://www.autoitscript.com/cgi-bin/getfile.pl?../autoit3/scite/download/SciTE4AutoIt3.exe

 


Signature beginning:
Please remember: "AutoIt".....  Wondering who uses AutoIt and what it can be used for ?
* GHAPI UDF - modest beginning - communication with GitHub REST API Forum Rules *
Include Dependency Tree (Tool for analyzing script relations)
ADO.au3 UDF     POP3.au3 UDF     XML.au3 UDF    How to use IE.au3  UDF with  AutoIt v3.3.14.x  for other useful stuff click the following button

Spoiler

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. 

My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAP * WinSCP UDF * GHAPI UDF - modest begining - comunication with GitHub REST APIErrorLog.au3 UDF - A logging Library *

My contribution to others projects or UDF based on  others projects: * _sql.au3 UDF  * POP3.au3 UDF *  RTF Printer - UDF * XML.au3 UDF * ADO.au3 UDF SMTP Mailer UDF * Dual Monitor resolution detection * * 2GUI on Dual Monitor System * _SciLexer.au3 UDF * SciTE - Lexer for console pane

Useful links: * Forum Rules * Forum etiquette *  Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * 

Wiki: Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Good coding practices in AutoIt * 

OpenOffice/LibreOffice/XLS Related: WriterDemo.au3 * XLS/MDB from scratch with ADOX

IE Related:  * How to use IE.au3  UDF with  AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * IE in TaskSchedulerIE Embedded Control Versioning (use IE9+ and HTML5 in a GUI) *

PDF Related:How to get reference to PDF object embeded in IE *

I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions *  EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *

I also encourage you to check awesome @trancexx code:  * Create COM objects from modules without any demand on user to register anything. * Another COM object registering stuffOnHungApp handlerAvoid "AutoIt Error" message box in unknown errors  * HTML editor

"Homo sum; humani nil a me alienum puto" - Publius Terentius Afer
"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming"
:naughty:  :ranting:, be  :) and       \\//_.

Anticipating Errors :  "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty."

Signature last update: 2021-03-17

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By Mbee
      Hi, @Jos and others!
      I've been running SciTE4AutoIt3 under Windows 7 Pro then Windows 10 Pro for years with a dual-monitor setup. What an awesome set of tools! I'm using version 4.4.6, 32-bit - aka SciTE4AutoIt3 v21.316.1639.2
      Until two days ago, when I double-clicked an au3 file, SciTE opened it's window on my secondary monitor, which is just where I wanted it. But now, all of a sudden, it always opens on the primary monitor, which is just where I don't want it! UltraEdit and Notepad++ always open on the monitor where the last window was opened, which is fine. But not SciTE4AutoIt3.
      It's possible that this problem is related to a newly encountered issue wherein Windows apparently arbitrarily decided that the desktop on the secondary at the long-standing resolution of 1920x1080 should no longer fit the display. I booted up a few days ago to find that the taskbar was no longer visible and the other three edges wouldn't fit either. I was forced to change the resolution to  1680x1050. Perhaps SciTE4AutoIt3 will automatically choose the monitor with the highest resolution?
      To try to solve this issue myself, I've examined all the Options files, but I can't find anything related to monitors. How can I get SciTE to open on my secondary monitor again?
      Thanks!
       
    • By BugFix
      The block comment (internal: box comment) in SciTE cannot be toggled.
      I have now created a script that helps. It works with any file type for which the corresponding entries in the properties are created.For toggeling its required to detect, what the user want to do.
      EDIT 2021-04-14 [v0.10]
      In the meantime, I have changed and discarded a few things. But in my opinion, the current variant is much easier to handle:
      Rules for detection: UNSET COMMENT BLOCK - NEW: NONE SELECTION IS REQUIRED! There must exist an comment block near the cursor position (cursor inside the .start line or above). The script detects automatically the "comment.box.start" and the corresponding "comment.box.end" (also if nested) and works until this line. SET COMMENT BLOCK - Some text must selected (at minimum one character) - Starts and/or ends the selection inside of a line, the selection will expanded to full line. - Ends the selection in a line with text, but at line start position so will this line ignored! - Leading and trailing empty lines in selection will ignored! This means that in nested block comments there is at least one more line between two comment.box.start markers.
      It is recommended to write all block comment settings into "SciTEUser.properties". The setting "comment.box.end.au3" from "SciTEGlobal.properties" is incorrect and must be corrected.
      comment.box.start.au3=#cs #~ If you want characters or tab in each line of comment block (middle lines), define it here. #~ If TAB should used as box.middle, set it so: comment.box.middle.au3=@Tab #~ "@Tab" is replaced by a tabulator by the script. comment.box.middle.au3= comment.box.end.au3=#ce additional [optional] property: #~ message for comment block set or unset - output/none (1/0), default=0 (none output) #~ e.g.: "++ COMMENT BLOCK - UNSET [line 103-106]" #~ SET : current line numbers of commented text including the lines with .start .end #~ UNSET: current line number(s) of text that was commented comment.box.output=0 Connection to SciTE
      Search a free command number. Use a Hotkey of your choice. (or use the default shortcut: Ctrl+Shift+Q)
      If you have declared an option for user lua scripts (e.g.: "Lua.User.Scripts.Path=C:\code\lua"), copy the script to this folder.
      Otherwise copy it to a folder of your choice and change the path in the command: "dofile". But backslashes in the path must be masked. ("\\").
      If your path has spaces don't forgot to encapsulate in string delimiters.
      # 24 Toggle Block Comment command.name.24.*=Toggle Block Comment command.24.*=dofile $(Lua.User.Scripts.Path)/BlockComment.lua command.mode.24.*=subsystem:lua,savebefore:no command.shortcut.24.*=Ctrl+Alt+F10  
      Here the lua script:
      -- TIME_STAMP 2021-04-14 17:56:37 v 0.10 --[[ Toggle Block Comments ©BugFix ( autoit[at]bug-fix.info ) For toggeling its required to detect, what the user want to do. Rules for detection: UNSET COMMENT BLOCK - NEW: NONE SELECTION IS REQUIRED! There must exist an comment block near the cursor position (cursor inside the .start line or above). The script detects automatically the "comment.box.start" and the corresponding "comment.box.end" (also if nested) and works until this line. SET COMMENT BLOCK - Some text must selected (at minimum one character) - Starts and/or ends the selection inside of a line, the selection will expanded to full line. - Ends the selection in a line with text, but at line start position so will this line ignored! - Leading and trailing empty lines in selection will ignored! Properties: It is recommended to write all block comment settings into SciTEUser.properties. The setting "comment.box.end.au3" from "au3.properties" is wrong and must be corrected. comment.box.start.au3=#cs #~ If you want characters or tab in each line of comment block (middle lines), define it here. #~ If TAB should used as box.middle, set it so: comment.box.middle.au3=@Tab #~ "@Tab" is replaced by a tabulator by the script. comment.box.middle.au3= comment.box.end.au3=#ce additional [optional] property: #~ message for comment block set or unset - output/none (1/0), default=0 (none output) #~ e.g.: "++ COMMENT BLOCK - UNSET [line 103-106]" #~ SET : current line numbers of commented text including the lines with .start .end #~ UNSET: current line number(s) of text that was commented comment.box.output=0 Example with AutoIt comment: "SelectionStart" = [S] "SelectionEnd" = [E] ---------------------------------------------------------------------- selection: or or 1 [S]line with some text[E] 1 [S] 1 lin[S]e with some text[E] 2 line with some text[E] or or or 1 [S] 1 [S]line with some text 1 [S] 2 line with some text 2 [E] 2 line with so[E]me text 3 [E] or or 1 [S] 1 [S] ... empty lines 2 line with some text 5 ... empty lines 6 line with some text 6 7 [E] 7 [E] result for all: 1 #cs 2 line with some text 3 #ce ---------------------------------------------------------------------- ]] --[[ History v 0.10 - fixed: If last selected line is also last line in editor, the comment.end was set in this line and so was this line deleted if has toggled. v 0.9 - removed: comment.box.ignore.empty.before/after - was not very usefull - added: detection (and excluding) of leading and/or trailing empty lines in selection v 0.8 - fixed: Problem with selection starts/ends in the middle of a line or ends at the first position of the line with text v 0.7 - added: Automatic detection for comment blocks, NO SELECTION REQUIRED to unset a comment block - added: properties comment.box.ignore.empty.before: if first selected line is empty -- don't include in comment block comment.box.ignore.empty.after: if last selected line is empty -- don't include in comment block comment.box.output: if "1" -- write result of proceeding to console, default is "0" - changed: minimum required selection to start block comment: 1 character v 0.6 - fixed: if selection for uncommenting is wrong, leading/trailing empty line will removed v 0.5 - fixed: the trailing line break from comment.end while uncommenting will not removed v 0.4 - added: detection for uncommenting if selection is wrong (starts/ends in empty line) v 0.3 - project new designed (object syntax) v 0.2 - fixed: missed adding of middle marker in first line ]] local BlockComment = { -- variables ext, -- file extension boxStart, -- property: comment.box.start boxMiddle, -- property: comment.box.middle boxEnd, -- property: comment.box.end bMiddle, -- bool: boxMiddle is defined lenEOL, -- length of line break character(s) from file in editor eol, -- the end of line character(s) in this file msg = {}, -- store line numbers (start, end) for proceeding message selS = {}, -- selection start selE = {}, -- selection end -- selection table fields: -- .pos, -- selection position -- .line, -- selection line number newText, -- the text that replaces the selection -- initialize variables Init = function(self) self.ext = props["FileExt"] self.boxStart = props["comment.box.start."..self.ext] self.boxMiddle = props["comment.box.middle."..self.ext] self.bMiddle = not (self.boxMiddle == "") self.boxEnd = props["comment.box.end."..self.ext] if self.boxMiddle == "@Tab" then self.boxMiddle = "\t" end self.selS = self:SelLineData(editor.SelectionStart) self.selE = self:SelLineData(editor.SelectionEnd) self.lenEOL = self:GetEOL() self.eol = "\n" if self.lenEOL == 2 then self.eol = "\r\n" end self.newText = "" end, -- stores #pos and #line from selection position SelLineData = function(self, _selPos) -- _selPos: editor.SelectionStart or editor.SelectionEnd local t = {} t.pos = _selPos t.line = editor:LineFromPosition(t.pos) return t end, -- returns position from start and end (behind last visible char) of a line LineStartEndPos = function(self, _line) local startP = editor:PositionFromLine(_line) local endP = editor.LineEndPosition[_line] return startP, endP end, -- returns the length of EOL (default) or with "_getMode=true": LF/CRLF -- asking the property "eol.mode.type" is not safe, maybe not set and the global value may differ from the file in the editor GetEOL = function(self, _getMode) -- It is possible that another program makes entries (e.g.: version number) at the beginning of the file.. -- ..with a different EOL mode, therefore the second last line (last line with line break) of the file is checked. local l = editor.LineCount -2 local lenEOL if l < 0 then -- the eol.mode from properties will used instead (but not sure, if exists) local mode = props["eol.mode."..self.ext] -- mode for file type (if declared) if mode == "" then mode = props["eol.mode"] end -- otherwise the global mode if mode == "LF" then lenEOL = 1 else lenEOL = 2 end else local textEnd = editor.LineEndPosition[l] -- pos after last visible character local posLineStart = editor:PositionFromLine(l) -- first pos in line local textLen = textEnd - posLineStart -- pure text length local len = editor:LineLength(l) -- length of line including the line break characters lenEOL = len - textLen -- length of line line break characters end if _getMode then if lenEOL == 1 then return "LF" else return "CRLF" end else return lenEOL end end, -- detects if is/not selection IsSelection = function(self) return (self.selS.pos ~= self.selE.pos) end, -- mask magic characters MaskMagic = function(self, _s) if _s == nil then return "" end return _s:gsub('([%(%)%.%%%+%-%*%?%[%^%$])', '%%%1') end, -- checks if line is empty (has only a line break) LineIsEmpty = function(self, _line) -- _line: number or text from "editor:GetLine" if type(_line) == "string" then return (_line:len() == self.lenEOL) end if _line == nil then return true end local len = editor:LineLength(_line) return (len <= self.lenEOL) end, -- checks if line starts with/has box.start -- detects it also, if nested and middle marker(s) before the start marker LineHasStart = function(self, _line) if self:LineIsEmpty(_line) then return false end if type(_line) == "number" then _line = editor:GetLine(_line) end local pattern if self.boxMiddle == '' then pattern = self:MaskMagic(self.boxStart) else pattern = self:MaskMagic(self.boxMiddle)..'*'..self:MaskMagic(self.boxStart) end local n = _line:find(pattern) return (n ~= nil) end, -- checks if line starts with/has box.end -- detects it also if nested, and middle marker(s) before the end marker LineHasEnd = function(self, _line) if self:LineIsEmpty(_line) then return false end if type(_line) == "number" then _line = editor:GetLine(_line) end local pattern if self.boxMiddle == '' then pattern = self:MaskMagic(self.boxEnd) else pattern = self:MaskMagic(self.boxMiddle)..'*'..self:MaskMagic(self.boxEnd) end local n = _line:find(pattern) return (n ~= nil) end, -- remove middle marker/add line UncommentMiddleLine = function(self, _bMiddle, _text) if _bMiddle then self.newText = self.newText.._text:gsub("^("..self:MaskMagic(self.boxMiddle)..")", "") else self.newText = self.newText.._text end end, -- checks if passed line is last line in editor AND selection ends not at line start position IsLastLine = function(self, _line) return (editor.LineCount == (_line + 1)) and (editor:PositionFromLine(_line) ~= self.selE.pos) end, -- the ternary operator ternary = function(self, _condition, _ifTrue, _ifFalse) if _condition == true then return _ifTrue else return _ifFalse end end, -- creates the text to toggle and replace the selection with it Toggle = function(self) self:Init() local firstVisibleLine = editor.FirstVisibleLine local countNesting, bStart, nStart, text, nLine, replS, replE = 0, false, -1 local lineStart, lineEnd, bLastLine local sStart, sEnd = self:MaskMagic(self.boxStart), self:MaskMagic(self.boxEnd) local sMiddle = self:MaskMagic(self.boxMiddle) local bUsedMiddle = false -- (for uncommenting) check if first line after comment.start, starts with comment.box.middle marker local insertMiddle = "" if self.bMiddle then insertMiddle = self.boxMiddle end -- error check if self.boxStart == "" or self.boxEnd == "" then return print("! ERROR - The comment.box properties for *."..self.ext.." files are missing or incomplete.") end -- check for set comment block if (not self:IsSelection()) then -- none selection - means: Unset CommentBlock -- start unset self.msg.action = 'COMMENT BLOCK - UNSET' nLine = self.selS.line while nLine < editor.LineCount do text = editor:GetLine(nLine) -- line with eol if (not bStart) and self:LineHasStart(text) then -- first line with comment.box.start bStart = true self.msg.starts = nLine nStart = nLine replS = editor:PositionFromLine(nLine) -- save the start position for replacing end if nLine == nStart +1 then -- first line after comment.box.start if self.bMiddle then -- check if comment.box.middle is used, if defined local n = text:find(sMiddle) if n == 1 then bUsedMiddle = true end -- true, if starts with it end end if self:LineIsEmpty(text) then -- do nothing with empty lines, add them only if start was detected before if bStart then self.newText = self.newText..text end -- text is only a line break else if self:LineHasEnd(text) then -- the box.end or a nested box.end countNesting = countNesting -1 -- decrease nesting counter if countNesting == 0 then -- it's the corresponding end position self.newText = self.newText:sub(1, -(self.lenEOL +1)) -- ignore text from this line and delete line break from stored line before replE = editor.LineEndPosition[nLine] -- save the end position (w.o. line break) for replacing self.msg.ends = nLine -2 break -- leave the loop else -- will be treated as middle line (it's a nested comment.box.end) self:UncommentMiddleLine(bUsedMiddle, text) end elseif self:LineHasStart(text) then countNesting = countNesting +1 -- increase nesting counter -- countNesting == 1 it's the real start of block comment --> ignore this line if countNesting > 1 then self:UncommentMiddleLine(bUsedMiddle, text) end -- treat it like a middle line else -- all other cases are middle lines but if not start was detected - ignore this line if bStart then self:UncommentMiddleLine(bUsedMiddle, text) end end end nLine = nLine +1 end if (not bStart) then return print("! ERROR - None comment block starts near the cursor.") -- text near Cursor isn't comment block start marker end else -- set comment block self.msg.action = 'COMMENT BLOCK - SET' if self.selS.line == self.selE.line then -- selection is in one line text = editor:GetLine(self.selS.line) lineStart = editor:PositionFromLine(self.selS.line) lineEnd = editor.LineEndPosition[self.selS.line] + self.lenEOL editor:SetSel(lineStart, lineEnd) -- select all text in line bLastLine = self:IsLastLine(self.selE.line) if bLastLine then self.boxEnd = self.eol..self.boxEnd end self.newText = self.boxStart..self.eol..insertMiddle..text..self.boxEnd..self:ternary(bLastLine, '', self.eol) self.msg.starts = self.selS.line self.msg.ends = self.selS.line +2 else -- as 1.: find the last line with text in selection, possibly blank lines are selected at the end local iLineLastText = -1 for i = self.selE.line, self.selS.line, -1 do if (not self:LineIsEmpty(i)) then iLineLastText = i break end end -- none text selected if iLineLastText == -1 then return print("! ERROR - Only empty lines selected.") end if iLineLastText ~= self.selE.line then self.selE.line = iLineLastText self.selE.pos = editor.LineEndPosition[self.selE.line] end bLastLine = self:IsLastLine(self.selE.line) if bLastLine then self.boxEnd = self.eol..self.boxEnd end for i = self.selS.line, self.selE.line do text = editor:GetLine(i) if i == self.selS.line then -- selection start line if (not self:LineIsEmpty(text)) then lineStart = editor:PositionFromLine(self.selS.line) if lineStart ~= self.selS.pos then self.selS.pos = lineStart editor:SetSel(self.selS.pos, self.selE.pos) end self.newText = self.boxStart..self.eol..insertMiddle..text self.msg.starts = i else -- start line is empty - do nothing end elseif i == self.selE.line then -- selection end line if self.newText == "" then -- the last line is the 1st line with text in selection self.newText = self.boxStart..self.eol self.selS.pos = editor:PositionFromLine(i) self.msg.starts = i end lineStart = editor:PositionFromLine(i) lineEnd = editor.LineEndPosition[i] if lineStart == self.selE.pos then -- selection ends at line start position self.newText = self.newText..self.boxEnd..self.eol -- ignore this line self.msg.ends = i +2 break end if lineEnd == self.selE.pos then -- selection ends behind last visible char self.newText = self.newText..insertMiddle..text..self.boxEnd -- without EOL self.msg.ends = i +2 break end if lineEnd > self.selE.pos then -- selection ends inside the line, line will used self.selE.pos = lineEnd + self.lenEOL -- set selE.pos to line end for correct replacing end self.newText = self.newText..insertMiddle..text..self.boxEnd..self:ternary(bLastLine, '', self.eol) self.msg.ends = i +2 else -- middle lines if (not self:LineIsEmpty(i)) and self.newText == "" then -- may be only empty lines in selection before self.newText = self.boxStart..self.eol self.selS.pos = editor:PositionFromLine(i) self.msg.starts = i end if self.newText ~= "" then self.newText = self.newText..insertMiddle..text end end end editor:SetSel(self.selS.pos, self.selE.pos) end end -- replace the selection with the new toggled text if bStart then editor:SetSel(replS, replE) end -- for uncommenting exists none selection - do it here editor:ReplaceSel(self.newText) -- replace the next editor:SetSel(self.selS.pos,self.selS.pos) -- set the cursor to start position editor.FirstVisibleLine = firstVisibleLine -- make the first visible line visible again if props["comment.box.output"] == "1" then print(string.format('++ %s [line %d-%d]', self.msg.action, self.msg.starts +1, self.msg.ends +1)) end end } BlockComment:Toggle() As far as I know, it is not possible to overwrite SciTE internal hotkeys. In this case "Ctrl+Shift+B" for IDM_BLOCK_COMMENT. Therefore I used the connection shown here.
      But if overwriting is possible, I would be interested in this solution.
       
      BlockComment.lua
    • By Dave1
      Hello everyone,
      I have several signals on the screen that need to be monitored while a program is running. These signals are scattered around an image which is maximized on 4  equal resolution screens - the AutoIT Window Info does not recognize any objects on the program meaning that I'm left with the PixelSearch() and PixelCheckSum() functions to monitor the signals:
      The signals are as small as a 5x5 pixel area and their coordinates are known.
      I've been digging around for a while now in this forum about the PixelSearch() and PixelCheckSum()  and found some interesting and useful ideas for the use of them. I also came across some other UDF functions like MultiMon(), FastFind(), TtColXY() and the ImageSearch2015 scripts that might be useful for the final output. I don't know if hovering the mouse by using TtColXY() and output its ToolTip() information onto the log file will be faster than using PixelSearch() and/or PixelCheckSum() in a loop for all signals' coordinates.
      The colours of the signals are below:
      red - 0x00FF00 (opaque red)
      green - 0x00FF00 (opaque green)
      yellow - 0xFFFF00 (opaque yellow)
      black - 0x000000 (opaque black, default colour)
      EDIT:
      The desired output is to monitor and record/log the changes and status of each inside a .txt file or a .csv with the below format: 
      Local Machine Time        Signal,      Change,               delta-t
      14:32:07                  Signal1     Green - Yellow         DELTA-t1
      14:34:02                  Signal1     Yellow - Red           DELTA-t1
      14:35:14                  Signal2     Yellow - Red           DELTA-t2
      ...
      Below is the code I came up with. 
      #include <AutoItConstants.au3> #include <MsgBoxConstants.au3> #include <misc.au3> #include <Date.au3> #include <Array.au3> #include <File.au3> #include <ScreenCapture.au3> #include <WinAPI.au3> #include <WinAPIHObj.au3> Global $program_name, $program_open, $Wname, $tCurrent Global $button_xy[2] = [150, 175] Global $iniColour, $ColourCheck, $NewCheck Global $Red, $Green, $Blue, $Nil Global $sFilePath = @ScriptDir & "\Signals_status.txt" Global $SignalID[10] = ["Signal_1", "Signal_2", "Signal_3", "Signal_4", "Signal_5", "Signal_6", "Signal_7", "Signal_8", "Signal_9", "Signal_10"] $program_name = "Signals.exe" $Wname = "Training Task 3" $program_open = ShellExecute($program_name, @ScriptDir) WinWait($Wname) $iniColour = "0x" & Hex(PixelGetColor($button_xy[0], $button_xy[1]), 6) ;~ $iniChecksum = "0x" & Hex(PixelChecksum($button_xy[0], $button_xy[0] - 5, $button_xy[1], $button_xy[1] + 5), 6) $ColourCheck = "0x" & Hex(PixelChecksum($button_xy[0], $button_xy[0] - 5, $button_xy[1], $button_xy[1] + 5, 1, $Wname), 6) ConsoleWrite(_ColourID($iniColour) & " // " & _ColourID($ColourCheck) & @CRLF) ;~ $ColourCheck = "0x " & Hex(PixelGetColor($button_xy[0], $button_xy[1]), 6) $iniColour = $ColourCheck ;$iniChecksum = $currentCheck Do ;~ While 1 _WindowOnTop() _Close_Notepad() $NewCheck = "0x" & Hex(PixelChecksum($button_xy[0], $button_xy[0] - 5, $button_xy[1], $button_xy[1] + 5, 1, $Wname), 6) $tCurrent = _NowCalc() $LogFile = FileOpen($sFilePath, 2) FileWriteLine($LogFile, "Local Machine Time " & "Signal, " & "Change, " & "delta-t") ;~ $ColourCheck = "0x" & Hex(PixelChecksum($button_xy[0], $button_xy[0] - 5, $button_xy[1], $button_xy[1] + 5, 1, $Wname), 6) If $ColourCheck <> $NewCheck Then ;If there's a colour change from the current colour $ColourCheck = $NewCheck Local $tChange, $NewCheckID, $ColourCheckID, $sLogMsg $tChange = _NowCalc() ConsoleWrite("Colour changed!" & @CRLF) $ColourCheckID = _ColourID($ColourCheck) $NewCheckID = _ColourID($NewCheck) $iTimeDiffh = _DateDiff('h', $tChange, $tCurrent) ; time difference in hours $iTimeDiffm = _DateDiff('n', $tChange, $tCurrent) ; time difference in minutes $iTimeDiffs = _DateDiff('s', $tChange, $tCurrent) ; time difference in seconds $durationCheckSum = $iTimeDiffh & ":" & $iTimeDiffm & ":" & $iTimeDiffs ; Timestamp of the signal until PixelCheckSum $sLogMsg = " " & $SignalID[0] & " " & $ColourCheckID & " - " & $NewCheckID & " " & $durationCheckSum _FileWriteLog($LogFile, $sLogMsg) ElseIf $ColourCheck = $NewCheck Then Local $Colour_check = _ColourID("0x" & Hex(PixelChecksum($button_xy[0], $button_xy[0] - 5, $button_xy[1], $button_xy[1] + 5, 1, $Wname), 6)) ConsoleWrite($tCurrent & " " & $Colour_check & @CRLF) EndIf FileClose($sFilePath) Until Not ProcessExists($program_name) And Not WinExists($Wname) _IsProgramOpen() Func _Close_Notepad() $notepad_open = ProcessExists("notepad.exe") ? ProcessClose("notepad.exe") : ProcessClose("notepad.exe") $notepad_open = WinActive("[CLASS:Notepad]") ? WinClose("[CLASS:Notepad]") : ProcessClose("notepad.exe") EndFunc ;==>_Close_Notepad Func _ColourID($sColour) $Red = Int("0x" & StringRegExpReplace($sColour, "(..)(..)(..)(..)", "\2")) $Green = Int("0x" & StringRegExpReplace($sColour, "(..)(..)(..)(..)", "\3")) $Blue = Int("0x" & StringRegExpReplace($sColour, "(..)(..)(..)(..)", "\4")) If $Green > $Blue And $Red > $Blue And $Green >= 0xB0 And $Red >= 0xB0 Then $sCol = "Yellow" ElseIf $Blue > 0xE0 And $Green > 0xE0 And $Red > 0xE0 Then $sCol = "White" ElseIf $Blue > 0x50 And $Blue = $Green And $Blue = $Red Then $sCol = "Grey" ElseIf $Red > $Green And $Red > $Blue And $Red > 0x70 Then $sCol = "Red" ElseIf $Green > $Red And $Green >= $Blue And $Green > 0x70 Then $sCol = "Green" ElseIf $Blue > $Red And $Blue > $Green And $Blue > 0x70 Then $sCol = "Blue" Else $sCol = "Nil" EndIf Return $sCol EndFunc ;==>_ColourID Func _WindowOnTop() WinActivate($Wname) WinSetOnTop($Wname, "", $WINDOWS_ONTOP) Opt("MouseCoordMode", 0) EndFunc ;==>_WindowOnTop Func _IsProgramOpen() If Not ProcessExists($program_name) And Not WinExists($Wname) Then Break(1) EndIf EndFunc ;==>_IsProgramOpen When the program is running, the window opens in the centre of the screen however, the PixelChecksum function is not looking at the correct area. In addition:
      1 - I'm not sure about how to put the message into the log file.
      2 - I tested this script but it is not recording the message into the log file.
      3 - Is there other way to calculate the duration in these lines?
      $iTimeDiffh = _DateDiff('h', $tChange, $tCurrent) ; time difference in hours $iTimeDiffm = _DateDiff('n', $tChange, $tCurrent) ; time difference in minutes $iTimeDiffs = _DateDiff('s', $tChange, $tCurrent) ; time difference in seconds $durationCheckSum = $iTimeDiffh & ":" & $iTimeDiffm & ":" & $iTimeDiffs ; Timestamp of the signal until PixelCheckSum $sLogMsg = " " & $SignalID[0] & " " & $ColourCheckID & " - " & $NewCheckID & " " & $durationCheckSum _FileWriteLog($LogFile, $sLogMsg) Thanks in advance!
    • By Bhooshan
      I need to mute an ongoing call on Microsoft teams without activating the window. Teams allows us to mute using shortcut key Ctrl+Shift+m but only when the window is active.
      # Used set option as ongoing call can be with any person which leads to change in Title Name.
      AutoItSetOption ( "WinTitleMatchMode", 2 ) 
      # I am not clear with the control ID which will be good to use here and also the key combination of ^M       
      ControlSend ( "Microsoft Teams", "", "[CLASS:Intermediate D3D Window; INSTANCE:1]", "{ctrl down}")
       
      Can anyone help...!!! 
       

    • By Sayed
      Hi there, 
      I'm new in AutoIt forms and using AutoIt to automate desktop application (able to automate the application normally but facing issue when I've to re-run the application twice within the same script...so need help in this please)
      here is the steps then followed by the issue in a brief : 
      1- run application . 
      2- do some actions (click menus,activate windows,set texts..)
      3- close the application. 
      4- run the application again & access the same controls.
      5- open the same windows again (like step 2)
      6- perform some validations (by getting texts from some text boxes)
      7- close the application again (and repeat 1-7 for 15 times in average )
      The issue 
      * all controls are accessible in the first run and actions done successfully on controls (for steps 1-3) BUT from the second run of the application from step-4 it's able to set focus only the main application window.
      Note: only unique properties used to while mapping the controls. 
      Error that appear in the console :
      UIAWrappers.au3" (1673) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.: $x = Int($t[1] + ($t[3] / 2)) $x = Int($t[1] + (^ ERROR  
      Simple spy code  of one of the controls that has this strange issue(menubar&view menu Item): 
      ;~ *** Standard code maintainable *** #include "UIAWrappers.au3" AutoItSetOption("MustDeclareVars", 1) _UIA_setVar("oP1","Title:=XXX;controltype:=UIA_WindowControlTypeId;class:=WindowsForms10.Window.8.app") ;main app form xxx _UIA_setVar("oP2","Title:=menuStrip1;controltype:=UIA_MenuBarControlTypeId;class:=WindowsForms10.Window.8.app") ;menuStrip1 ;~ $oUIElement=_UIA_getObjectByFindAll("View.mainwindow", "title:=View;ControlType:=UIA_MenuItemControlTypeId", $treescope_subtree) _UIA_setVar("oUIElement","Title:=View;controltype:=UIA_MenuItemControlTypeId;class:=") ;ControlType:=UIA_MenuItemControlTypeId;classname:=") ;~ Actions split away from logical/technical definition above can come from configfiles ;~_UIA_Action("oP1","highlight") _UIA_Action("oP1","setfocus") ;~_UIA_Action("oP2","highlight") _UIA_Action("oP2","setfocus") _UIA_action("oUIElement","highlight") ;~_UIA_action("oUIElement","click")  
       
×
×
  • Create New...