TheAutomator

Edit: Detect key before updating content?

33 posts in this topic

#1 ·  Posted (edited)

Hi everyone :) ,

i'm trying to make some sort of full screen console window where some of the text must be non-editable like windows CMD.exe.

Text already typed before pressing enter or the working folder 'C:\...>' is read only in CMD.exe and I want to know if mimicking this behavior in an edit control is possible.

 

My attempt to make a console makes all the [A-Za-z0-9] keys a hotkey and the main edit control is set to read only.

Every time the user types something the hotkey function is triggered, the cursor in the edit control is set to the end of the text and the character you typed is added to the edit.

If you try to press the {backspace} key when you are at the edge of some text that is read only nothing happens.

 

This works but I guess it is not the best or most clean way to make something like this..

Can someone give me some advice or help me make a better function for having full control over text in the edit control?

 

kind regards, :)

TheAutomator

 

#include <GuiEdit.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$Form = GUICreate("Console", @DesktopWidth, @DesktopHeight, 0, 0, BitOR($WS_POPUP, $DS_SETFOREGROUND), $WS_EX_TOPMOST)
    GUISetBkColor(0x000000)

    $Console = GUICtrlCreateEdit('Loading...', 32, 32, @DesktopWidth-15, @DesktopHeight - 64, BitOR($ES_READONLY,$WS_VSCROLL), 0)
        GUICtrlSetFont(-1, 28, 400, 0, 'OCR A Extended')
        GUICtrlSetColor(-1, 0x00FF00)
        GUICtrlSetBkColor(-1, 0x000000)
        GUICtrlSetCursor (-1, 2)
        _GUICtrlEdit_SetMargins( -1, $EC_RIGHTMARGIN, Default, 49)

GUISetState(@SW_SHOW)

;##################################################################################################################

Global $keys = 'abcdefghijklmnopqrstuvwxyz _ABCDEFGHIJKLMNOPQRSTUVWXYZ'

;##################################################################################################################

For $_ = 1 To StringLen($keys)
    HotKeySet( StringMid($keys,$_,1), 'keypress')
Next
For $_ = 0 To 9
    HotKeySet($_, 'keypress')
    HotKeySet('{numpad'&$_&'}', 'keypress')
Next
HotKeySet('{bs}','Keypress')
HotKeySet('{enter}','Enter')

_GUICtrlEdit_AppendText($Console, @CRLF&'Type a command:')

$MIN = StringLen(GUICtrlRead($Console)) + 1
$MAX = $MIN

;##################################################################################################################

Func Keypress()
    Local $key = @HotKeyPressed

    If StringLen($key) = 1 Then
        _GUICtrlEdit_AppendText($Console, $key)
        $MAX += 1

    ElseIf StringRegExp($key,'\{numpad[0-9]\}') Then
        _GUICtrlEdit_AppendText($Console, StringMid($key,8,1))
        $MAX += 1

    ElseIf $key = '{bs}' Then
        If $max = $min then
            Return
        Else
            Local $len = StringLen(GUICtrlRead($Console))
            _GUICtrlEdit_SetSel($Console, $len - 1, $len)
            _GUICtrlEdit_ReplaceSel($Console, '')
            $MAX -= 1
        EndIf

    EndIf
EndFunc

Func Enter();handle typed commands when ENTER is pressed:
    Switch StringStripWS(StringLower(StringMid(GUICtrlRead($Console),$min,$max)),8)
        Case ''
            Beep(1000,50)
        Case 'clear'
            GUICtrlSetData($Console,'Command:')
            $MIN = StringLen(GUICtrlRead($Console)) + 1
            $MAX = $MIN
            Return
        Case 'quit'
            Quit()
        Case Else
            _GUICtrlEdit_AppendText($Console, @CRLF&@TAB&'Unknown command!')
    EndSwitch
    _GUICtrlEdit_AppendText($Console, @CRLF&'Type a command:')
    $MIN = StringLen(GUICtrlRead($Console)) + 1
    $MAX = $MIN
EndFunc

;=============================================================

Func Quit()
    _GUICtrlEdit_AppendText($Console, @CRLF&@TAB&'Goodbye...')
    Sleep(1500)
    Exit
EndFunc

While True
    If GUIGetMsg() = $GUI_EVENT_CLOSE Then
        Quit()
    EndIf
WEnd
Edited by TheAutomator
1 person likes this

Share this post


Link to post
Share on other sites



Please also read the section in our rules on building a keylogger. This is pretty close to one.

Jos

I'm just trying to make a console screen,

it would even be better if i don't have to use hotkeys so that the keys are only captured when the edit is visible and active.

How can I ask help for making this console without making it look like a key logger?

Share this post


Link to post
Share on other sites

#4 ·  Posted (edited)

I wasn't trying to say you are having malicious intentions because then the thread would have been locked and you would be able to post any more by now. ;)

All I am saying is that your posted script looks a lot like it could be used for it so please be careful when posting code in our forums.

Jos

 

Edited by Jos

Visit the SciTE4AutoIt3 Download page for the latest versions        Beta files                                                          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've got a question is this going to be an actual command prompt? If so I have a few ideas and once I go through and edit a few things I'll post them here for you to consider.

Share this post


Link to post
Share on other sites

#8 ·  Posted (edited)

Custom commands is a great idea but also having the normals of a command prompt are nice features as well.

Here is a couple things I've tested :

Variable Changes :

Global $keys = 'abcdefghijklmnopqrstuvwxyz _ABCDEFGHIJKLMNOPQRSTUVWXYZ-;:/?<>,.`~@$%&*()=}|[]\' & "'" & '"'
 ; never know what someone may want to try
Global $string = "Type a command : " ; reason for this is for a switch you'll see in the next code

Keys i didn't get to work are : ! # ^ + {

Change this :

_GUICtrlEdit_AppendText($Console, @CRLF&'Type a command:')

To this :

_GUICtrlEdit_AppendText($Console, @CRLF& $string)

lastly add this to/below your Quit case :

Case 'quit' or 'exit'
            Quit()
        Case 'A:\' or 'A:/'  ; lowercase versions too for lazy people
            $string = "A:\ > "
        Case 'C:\' or 'C:/'
            $string = "C:\ > "
        Case 'D:\' or 'D:/'
            $string = "D:\ > "
        Case '/?' or '\?' or '?' or 'help' or 'command' or 'commands'
            $some variable to hold command list
        ;then some case to hold descriptions/usages of the commands per command
        ;i think another switch would work well for that

That about does it for my ideas so far.

 

edit : If this was Java then id say use a startswith for some of the things that will be needed later on but I'm not sure what autoit has to offer like that.

Edited by xxaviarxx

Share this post


Link to post
Share on other sites

I would go with a separate control for input than you do for display, seems like it would make it all much easier.


,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-.
|(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/
(_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_)
| | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) (
| | | | |)| | \ / | | | | | |)| | `--. | |) \ | |
`-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_|
'-' '-' (__) (__) (_) (__)

Share this post


Link to post
Share on other sites

I found the idea funny... ;)

First attempt :

#include <GuiEdit.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>

Global $prompt = "#Type a command:> "
Global $sel, $oldsel, $readonly, $iMinPos, $iStyle

Global $Form = GUICreate("Console", @DesktopWidth, @DesktopHeight, 0, 0, BitOR($WS_POPUP, $DS_SETFOREGROUND), $WS_EX_TOPMOST)
GUISetBkColor(0x000000)

Global $Console = GUICtrlCreateEdit('Loading...', 32, 32, @DesktopWidth-15, @DesktopHeight - 64, $ES_AUTOVSCROLL, 0)
GUICtrlSetFont(-1, 12, 400, 0, 'OCR A Extended')
GUICtrlSetColor(-1, 0x00FF00)
GUICtrlSetBkColor(-1, 0)
GUICtrlSetCursor (-1, 2)
_GUICtrlEdit_SetMargins( -1, $EC_RIGHTMARGIN, Default, 49)

Global $dummy = GUICtrlCreateDummy()

Global $aKeys[1][2] = [["{ENTER}", $dummy]]
GUISetAccelerators($aKeys)

GUISetState(@SW_SHOW)
Sleep(1000)

_Enter()

While True
    $msg = GUIGetMsg()
    Switch $msg
        Case $GUI_EVENT_CLOSE
            Quit()
        Case $dummy
            _Enter()
    EndSwitch
    

    $sel = _GUICtrlEdit_GetSel($Console)
    If $sel <> $oldsel Then
        $oldsel = $sel
        If $sel[0] < $iMinPos Or $sel[1] < $iMinPos Then
            If NOT $readonly Then 
                GUICtrlSetStyle($Console, $ES_READONLY)
                $readonly = 1
            EndIf
        Else
            If $readonly Then
                $readonly = 0
                $iStyle   = _WinAPI_GetWindowLong(GUICtrlGetHandle($Console), $GWL_STYLE)
                 GUICtrlSetStyle($Console, BitXOR($iStyle, $ES_READONLY))
            EndIf
        EndIf
    EndIf
WEnd


Func Quit()
    _GUICtrlEdit_AppendText($Console, @CRLF&@TAB&'Goodbye...')
    Sleep(1500)
    Exit
EndFunc

Func _Enter()
    Local $sCommand = StringRegExp( GUICtrlRead($Console), "\R\Q" & $prompt & "\E\h*(\N*)$|()$", 1)[0]
    Switch $sCommand
        Case "clear"
            GUICtrlSetData($Console, "")
        Case "quit", "exit"
            Quit()
        Case ""
            Beep(1000,50)
        Case Else
            _GUICtrlEdit_AppendText($Console, @CRLF & @TAB & $sCommand & " : command not found")
    EndSwitch
    
    _GUICtrlEdit_AppendText($Console, @CRLF & $prompt)
    $iMinPos = StringLen(GUICtrlRead($Console) )
EndFunc

 

3 people like this

Share this post


Link to post
Share on other sites

xxaviarxx,

Thanks for the ideas, I think a simple exec with cmd.exe will give me almost all of the functionality of windows command prompt if I want ;).

I like the $string switch idea btw :) .

 

boththose,

"a separate control for input" and that would be? :) .

 

jguinch,

Brilliant! B)

(noticed a little bug, try to remove the space at the end of "#Type a command:> " and then try to type something.)

Share this post


Link to post
Share on other sites

#12 ·  Posted (edited)

(noticed a little bug, try to remove the space at the end of "#Type a command:> " and then try to type something.)

also problems with the TAB key...

Quick impressions:

1 - Seems like a combination of the two techniques will work

     a - hotkey to trap any key that will affect the behavior of the edit control

     b - regexp to parse the input

@xxaviarxx - what is the end game?  If your purpose is to try to mimic cmd.exe that has been tried with many issues, search the forum for several examples.  If you are trying to create a app/function/command driver of sorts then there is a whole host of issues to consider, among them, console output, command management, possibly security, etc.

By the way, I like the gui.  Going to use it for the little guessing games that I make for my grandchildren...

kylomas

 

 

 

 

 

Edited by kylomas
correction
1 person likes this

Forum Rules         Procedure for posting code

"I like pigs.  Dogs look up to us.  Cats look down on us.  Pigs treat us as equals."

- Sir Winston Churchill

Share this post


Link to post
Share on other sites

"a separate control for input" and that would be?

another edit control strictly for entering commands to the 'console', and then you can take that and send it to run and write it prefaced with whatever you want into the readonly edit control.  Much like you see in game console or a chat window. 


,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-.
|(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/
(_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_)
| | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) (
| | | | |)| | \ / | | | | | |)| | `--. | |) \ | |
`-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_|
'-' '-' (__) (__) (_) (__)

Share this post


Link to post
Share on other sites

boththose,

oh, I thought you meant some other type of control, not a second control.

Nah, that's the easy way :P , that's how I did it in a previous version, it also looks better as it is now.

Share this post


Link to post
Share on other sites

#15 ·  Posted (edited)

kylomas,

hotkey to trap any key that will affect the behavior of the edit control

That doesn't work i'm afraid :(

[EDIT:] try $WS_TABSTOP

nice to hear you like the old style console look ;) hope your grandchildren have fun with it to :) 

Edited by TheAutomator

Share this post


Link to post
Share on other sites

TheAutomator,

I addressed this to the wrong person.  It was meant for you.

@xxaviarxx - what is the end game?  If your purpose is to try to mimic cmd.exe that has been tried with many issues, search the forum for several examples.  If you are trying to create a app/function/command driver of sorts then there is a whole host of issues to consider, among them, console output, command management, possibly security, etc.


Forum Rules         Procedure for posting code

"I like pigs.  Dogs look up to us.  Cats look down on us.  Pigs treat us as equals."

- Sir Winston Churchill

Share this post


Link to post
Share on other sites

#18 ·  Posted (edited)

TheAutomator,

I addressed this to the wrong person.  It was meant for you.

It's just a funny project, make a full screen console with a custom font and colors, put my own commands in there and add a few tweaks to make it look better.

I'm writing a dll that will handle the commands and scripts because I'm making a programming language for it to (so no need for cmd.exe itself),

so that I can open my own scripts with that console and see the output, make it a useful tool. a bit like batch-files but my language's syntax will be different..

Edited by TheAutomator

Share this post


Link to post
Share on other sites

Ambitious project.  I'll look forward to seeing the results, if your willing to share.

Good Luck,

kylomas


Forum Rules         Procedure for posting code

"I like pigs.  Dogs look up to us.  Cats look down on us.  Pigs treat us as equals."

- Sir Winston Churchill

Share this post


Link to post
Share on other sites

2nd attempt :

#include <GuiEdit.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <Array.au3>

Global $prompt = "#Type a command :> "
Global $sel, $oldsel, $readonly, $iMinPos, $iStyle
Global $iFontSize = 12, $sFontName = "OCR A Extended", $iFontcolor = 0x00FF00

Global $Form = GUICreate("Console", @DesktopWidth, @DesktopHeight, 0, 0, BitOR($WS_POPUP, $DS_SETFOREGROUND))
GUISetBkColor(0x000000)

Global $Console = GUICtrlCreateEdit('Loading...', 32, 32, @DesktopWidth-15, @DesktopHeight - 64, $ES_AUTOVSCROLL, 0)
GUICtrlSetStyle($Console, $ES_READONLY)
GUICtrlSetFont(-1, $iFontSize, 400, 0, $sFontName)
GUICtrlSetColor(-1, $iFontcolor)
GUICtrlSetBkColor(-1, 0)
GUICtrlSetCursor (-1, 2)
_GUICtrlEdit_SetMargins( -1, $EC_RIGHTMARGIN, Default, 49)

Global $dummyEnter = GUICtrlCreateDummy()
Global $dummyTab = GUICtrlCreateDummy()
Global $dummyBS = GUICtrlCreateDummy()
Global $dummyPreviousFunc = GUICtrlCreateDummy()
Global $dummyNextFunc = GUICtrlCreateDummy()
Global $dummyEsc = GUICtrlCreateDummy()
Global $dummyCtrlD = GUICtrlCreateDummy()
Global $dummyCtrlC = GUICtrlCreateDummy()

Global $aHistory[1], $iIndexFunc = 1

Global $aFunctions = [ ["__clear", "clear,cls"], _ 
                       ["__quit", "quit,exit,close"], _ 
                       ["__help", "help"] ]

_ArraySort($aFunctions)


Global $aKeys = [ ["{ENTER}", $dummyEnter], _
                  ["{TAB}", $dummyTab], _
                  ["{BACKSPACE}", $dummyBS], _
                  ["{UP}", $dummyPreviousFunc], _
                  ["{DOWN}", $dummyNextFunc], _
                  ["{ESC}", $dummyEsc ], _
                  ["^d", $dummyCtrlD], _
                  ["^q", $dummyCtrlD], _
                  ["^c", $dummyCtrlC] ]
GUISetAccelerators($aKeys)

GUISetState(@SW_SHOW)
Sleep(1000)


_Enter()
$iStyle   = _WinAPI_GetWindowLong(GUICtrlGetHandle($Console), $GWL_STYLE)
GUICtrlSetStyle($Console, BitXOR($iStyle, $ES_READONLY))

While True
    $msg = GUIGetMsg()
    Switch $msg
        Case $GUI_EVENT_CLOSE, $dummyCtrlD
            __Quit()
        Case $dummyEnter
            _Enter()
        Case $dummyBS
            _BackSpace()
        Case $dummyPreviousFunc
            _PreviousFunc()
        Case $dummyNextFunc
            _NextFunc()
        Case $dummyEsc
            _Esc()
        Case $dummyCtrlC
            _CtrlC()
    EndSwitch
    

    $sel = _GUICtrlEdit_GetSel($Console)
    If $sel <> $oldsel Then
        $oldsel = $sel
        If $sel[0] < $iMinPos Or $sel[1] < $iMinPos Then
            If NOT $readonly Then 
                GUICtrlSetStyle($Console, $ES_READONLY)
                $readonly = 1
            EndIf
        Else
            If $readonly Then
                $readonly = 0
                $iStyle   = _WinAPI_GetWindowLong(GUICtrlGetHandle($Console), $GWL_STYLE)
                 GUICtrlSetStyle($Console, BitXOR($iStyle, $ES_READONLY))
            EndIf
        EndIf
    EndIf
WEnd

Func _CtrlC()
    _GUICtrlEdit_AppendText($Console, @CRLF & $prompt)
    $iMinPos = StringLen(GUICtrlRead($Console) )
EndFunc

Func _Esc()
    Local $sCommand = StringRegExp( GUICtrlRead($Console), "\R\Q" & $prompt & "\E\h*(\N*)$|()$", 1)[0]
    _GUICtrlEdit_SetSel($Console, StringLen(GUICtrlRead($Console)), StringLen(GUICtrlRead($Console)) - StringLen($sCommand) )
    _GUICtrlEdit_ReplaceSel($Console, "")
EndFunc

Func _PreviousFunc()
    If $iIndexFunc = 1 Then Return
    $iIndexFunc -= 1
    Local $sCommand = StringRegExp( GUICtrlRead($Console), "\R\Q" & $prompt & "\E\h*(\N*)$|()$", 1)[0]
    _GUICtrlEdit_SetSel($Console, StringLen(GUICtrlRead($Console)), StringLen(GUICtrlRead($Console)) - StringLen($sCommand) )
    _GUICtrlEdit_ReplaceSel($Console, $aHistory[$iIndexFunc])
EndFunc

Func _NextFunc()
    If $iIndexFunc = UBound($aHistory) - 1 Then Return
    $iIndexFunc += 1
    
    Local $sCommand = StringRegExp( GUICtrlRead($Console), "\R\Q" & $prompt & "\E\h*(\N*)$|()$", 1)[0]
    _GUICtrlEdit_SetSel($Console, StringLen(GUICtrlRead($Console)), StringLen(GUICtrlRead($Console)) - StringLen($sCommand) )
    _GUICtrlEdit_ReplaceSel($Console, $aHistory[$iIndexFunc])
EndFunc

Func _BackSpace()
    Local $aSel = _GUICtrlEdit_GetSel($Console)
    If $aSel[0] = $aSel[1] Then
        If $aSel[0] > $iMinPos Then
            _GUICtrlEdit_SetSel($Console, $aSel[0] - 1, $aSel[0])
            _GUICtrlEdit_ReplaceSel($Console, "")
        EndIf
    Else
        _GUICtrlEdit_ReplaceSel($Console, "")
    EndIf
EndFunc

Func _Enter()
    Local $iFound = 0
    Local $sCommand = StringRegExp( GUICtrlRead($Console), "\R\Q" & $prompt & "\E\h*(\N*)$|()$", 1)[0]
        
    If NOT StringRegExp($sCommand, "^\v*$") Then
        Redim $aHistory[ UBound($aHistory) + 1]
        $aHistory[ UBound($aHistory) - 1] = $sCommand
        $iIndexFunc = UBound($aHistory)
    EndIf
    
    For $i = 0 To UBound($aFunctions) - 1
        If StringRegExp($sCommand, "^\h*$") Then
            $iFound = 1
            ExitLoop
        Else
            If StringRegExp($aFunctions[$i][1], "(?:^|,)" & $sCommand & "(?:,|$)") Then
                $iFound = 1
                GUICtrlSetStyle($Console, $ES_READONLY)
                Call($aFunctions[$i][0])
                $iStyle   = _WinAPI_GetWindowLong(GUICtrlGetHandle($Console), $GWL_STYLE)
                GUICtrlSetStyle($Console, BitXOR($iStyle, $ES_READONLY))
                ExitLoop
            EndIf
        EndIf
    Next
    
    If NOT $iFound Then _GUICtrlEdit_AppendText($Console, @CRLF & @TAB & $sCommand & " : command not found. Type ""help"" to list the available commands." & @CRLF)

    _GUICtrlEdit_AppendText($Console, @CRLF & $prompt)
    $iMinPos = StringLen(GUICtrlRead($Console) )
EndFunc

Func __help()
    Local $command
    Local $sAlias
    
    _GUICtrlEdit_AppendText($Console, @CRLF  & "List of available commands : " & @CRLF)
    For $i = 0 To UBound($aFunctions) - 1
        $command = StringRegExpReplace($aFunctions[$i][1], ",\V+", "")
        $alias = StringRegExpReplace($aFunctions[$i][1], "^.+?,", "")
        If @extended Then
            $sAlias = " (alias " & StringReplace($alias, ",", "/") & ")"
        Else
            $sAlias = ""
        EndIf
        _GUICtrlEdit_AppendText($Console, "   " & $command & $sAlias & @CRLF)
    Next
EndFunc

Func __clear()
    GUICtrlSetData($Console, "")
EndFunc

Func __quit()
    GUICtrlSetState($Console, $GUI_DISABLE)
    _GUICtrlEdit_AppendText($Console, @CRLF & @TAB & "Goodbye..." & @CRLF)
    Sleep(1000)
    Exit
EndFunc

 

3 people like this

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Similar Content

    • nacerbaaziz
      By nacerbaaziz
      Hi dears
      How are you?
      I have a question, to you please.
      How do I create an edit box for numbers only and does not accept letters? using autoit
      greetings to all
      I hope you help ME
      Thanks to all in advance
    • Simpel
      By Simpel
      Hi,
      I'm trying to create a console reader. All is working but I have a problem with the look. I want the line numbers with another backgroundcolor in silver. I made this with a small silver label. The edit control over the label has a transparent background.
      But if I start the prog then i can see how the line numbers wipe the silver background off. And if I click into the Edit then the silver label disappears completely.
      #include <WindowsConstants.au3> #include <GUIConstantsEx.au3> #include <ColorConstants.au3> #include <StaticConstants.au3> #include <GuiEdit.au3> Opt("GUIOnEventMode", 1) Global $g_iZaehler = 0 Global $g_hGUI = GUICreate("Console: StdoutRead" , 800, 800, -1, -1, $WS_OVERLAPPEDWINDOW + $WS_CLIPCHILDREN, $WS_EX_ACCEPTFILES) GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit") Global $text = GUICtrlCreateEdit("",10,30,780,760, $ES_AUTOVSCROLL + $WS_VSCROLL + $ES_READONLY + $ES_NOHIDESEL) GUICtrlSetState(-1, $GUI_DROPACCEPTED) GUICtrlSetFont(-1, 9, -1, -1, "Lucida Console") GUICtrlSetResizing(-1, $GUI_DOCKBORDERS) GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT) Global $g_LaZeilen = GUICtrlCreateLabel("Zeilen: " & StringFormat("% 5d", $g_iZaehler), 680, 10, 100, 9, $SS_LEFTNOWORDWRAP) GUICtrlSetFont(-1, 9, -1, -1, "Lucida Console") GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKTOP + $GUI_DOCKSIZE) Global $g_hCbFreeze = GUICtrlCreateCheckbox("&Freeze", 13, 5, 90) GUICtrlSetFont(-1, 9, -1, -1, "Lucida Console") GUICtrlSetResizing(-1, $GUI_DOCKALL) GUICtrlCreateLabel("", 11, 31, 42, 758) ; soll die Ziffern andersfarbig hinterlegen GUICtrlSetBkColor(-1, $COLOR_SILVER) GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKBOTTOM + $GUI_DOCKWIDTH) GUISetState(@SW_SHOW) Global $sText = StringFormat("% 5d", $g_iZaehler) & @CRLF _GUICtrlEdit_AppendText($text, $sText) While 1 Sleep(200) $g_iZaehler += 1 $sText = StringFormat("% 5d", $g_iZaehler) & @CRLF _GUICtrlEdit_AppendText($text, $sText) WEnd Func _Exit() Exit EndFunc Do you have any suggestions.
      Regards, Conrad
    • Chimp
      By Chimp
      Given an "Edit control" with Horizontal and Vertical scroll bars, setted with a monospace font,
      How can I know:
      1) the exact client area dimension (excluding the surface of the Vert and Horiz. scroll bars )
      2) the dimensions (in pixel or whatever) of the hidden portions of the "Edit control" that are on the right and/or on the left and/or over the top and/or below the bottom of the visible part?, that is:
      if the content of the Edit control is completly visible, then there are not hidden portions, while if the content of the control is biggher of the visible area, then there are hidden parts. How to know the dimensions of the not visible portions of the Edit control  on any given moment while I'm  scrolling vertically and/or horizzontaly or if I change the dimensions of the font as well?
      For example, when I set the Font dimension = 7, the whole text is visible, so the scrollbars are grayed out and parameters of the hidden parts should be all 0.
      Since I'm sure that my explanation in english is not clear, I post this short script to show in practice the question:
      Thanks for any suggestion.
      #include <GUIConstants.au3> HotKeySet("{ESC}", "End") Local $aData Local $Char = " 1 2 3 4 5 6 7 8" & @CRLF $Char &= "12345678901234567890123456789012345678901234567890123456789012345678901234567890" & @CRLF For $i = 3 To 22 $Char &= StringFormat('%02i', $i) & _StringReplicate(" ", 7) & "|" & _StringReplicate(" |", 7) & @CRLF Next Global $MyGui = GUICreate("", 600, 430) Global $hEdit1 = GUICtrlCreateEdit($Char, 0, 0, 500, 300, BitOR($ES_WANTRETURN, $WS_VSCROLL, $WS_HSCROLL, $ES_READONLY, $ES_MULTILINE)) GUICtrlSetFont(-1, 7, 0, 0, "Courier New") GUICtrlSetBkColor($hEdit1, 0xffffff) Local $idRadio1 = GUICtrlCreateRadio("Font size 7", 505, 10, 120, 20) Local $idRadio2 = GUICtrlCreateRadio("Font size 10", 505, 40, 120, 20) Local $idRadio3 = GUICtrlCreateRadio("Font size 12", 505, 70, 120, 20) Local $idRadio4 = GUICtrlCreateRadio("Font size 16", 505, 100, 120, 20) GUICtrlSetState($idRadio1, $GUI_CHECKED) GUICtrlCreateLabel("pixel hidden on the left : " & @CRLF & _ "pixel hidden on the right : " & @CRLF & _ "pixel hidden over the top : " & @CRLF & _ "pixel hidden below bottom : " & @CRLF & _ "Width of the edit : " & @CRLF & _ "Height of the edit : ", 5, 305, 400, 150) GUICtrlSetFont(-1, 12, 0, 0, "Courier New") Local $hParameters = GUICtrlCreateLabel("", 300, 305, 200, 150) GUICtrlSetFont(-1, 12, 0, 0, "Courier New") GUISetState() While 1 $iMsg = GUIGetMsg() Select Case $iMsg = $GUI_EVENT_CLOSE End() Case $iMsg = $idRadio1 GUICtrlSetFont($hEdit1, 7, 0, 0, "Courier New") Case $iMsg = $idRadio2 GUICtrlSetFont($hEdit1, 10, 0, 0, "Courier New") Case $iMsg = $idRadio3 GUICtrlSetFont($hEdit1, 12, 0, 0, "Courier New") Case $iMsg = $idRadio4 GUICtrlSetFont($hEdit1, 16, 0, 0, "Courier New") EndSelect $aData = _CheckEdit($hEdit1) ; this should return actual parameters of the Edit <----- ??? how to get this data ??? GUICtrlSetData($hParameters, $aData[0] & @CRLF & $aData[1] & @CRLF & $aData[2] & @CRLF & $aData[3] & @CRLF & $aData[4] & @CRLF & $aData[5]) WEnd Func _CheckEdit($hEdit1) ; <----- ??? how to get this data about the passed Edit ??? Local $aData[6] $aData[0] = "???" ; Hidden pixels on the left $aData[1] = "???" ; Hidden pixels on the right $aData[2] = "???" ; Hidden pixels over the top $aData[3] = "???" ; Hidden pixels below bottom $aData[4] = "???" ; Width of the visible portion of the Edit (without scrollbar surface) $aData[5] = "???" ; Height of the visible portion of the Edit (without scrollbar surface) Return $aData EndFunc ;==>_CheckEdit ; returns one or more chars replicated n times ; Example: ConsoleWrite(_StringReplicate('*', 5) & @CRLF) Func _StringReplicate($sChars = "", $iRepeats = 0) $sChars = String($sChars) $iRepeats = Int(Abs(Number($iRepeats))) Return StringReplace(StringFormat('%' & $iRepeats & 's', ""), " ", $sChars) EndFunc ;==>_StringReplicate Func End() If WinActive("[ACTIVE]") = $MyGui Then Exit EndIf EndFunc ;==>End  
    • TheDcoder
      By TheDcoder
      Hello! I think the thread title is obvious enough , Here is my code:
      #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #Region ### START Koda GUI section ### Form= $Form1 = GUICreate("Form1", 290, 139, 192, 124) $Edit1 = GUICtrlCreateEdit("Test", 8, 8, 273, 121, $ES_READONLY) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd  
      Thanks in advance, TD
    • Rhazz
      By Rhazz
      Hello. First of all, my full code:
      #include <WinAPI.au3> #include <File.au3> #include <String.au3> Local $aFiles, $IntOrFloat Local $aFileToRead = _WinAPI_GetOpenFileName("Open file to read", "Text Files (*.txt)") Local $aFinalFile = _WinAPI_GetSaveFileName("How do you want to save the file?", "Text Files (*.txt)") Local $sFilenameWithoutExtension = _StringBetween($aFinalFile[2],"",".") Local $sLinesPerLine = InputBox("Lines Per Line", "How many lines per line do you want?","","") Local $sCountLines = _FileCountLines($aFileToRead[2]) If ($sCountLines/$sLinesPerLine) >= 1 Then ; When the division result is a number with decimal, there will be less words in the last file and the script won't create it , therefore I add 1 to the result to prevent a file lack. Am I wrong? For example: if user introduces 3 the operation will be "4/3=1.33" and I need two files, the first "line1,line2,line3" and the second "line4". $IntOrFloat = $sCountLines/$sLinesPerLine Else $IntOrFloat = ($sCountLines/$sLinesPerLine) + 1 EndIf For $i = 1 To $IntOrFloat MsgBox(0,"", "Creating file " & $i) $aFiles = $aFinalFile[1] & "\" & $sFilenameWithoutExtension[0] & "-" & $i & ".txt" _FileCreate($aFiles) FileOpen($aFiles,2) For $a = ( ( ( $i - 1 ) * $sLinesPerLine ) + 1 ) To ( $i * $sLinesPerLine ) FileWrite($aFinalFile[2],FileReadLine($aFileToRead[2], $a) & ",") Next FileClose($aFiles) Next MsgBox(0,"Done","Done") With it I want to read a text file with a lot of lines and I wanna split it in multiple files with multiple lines (of the first file) in each line, separated by commas.
      For example: the user executes the script and selects a text file to open that contains:
      Then, the user selects the path and name of the result files. Suppose "C:\result.txt"
      Finally, the user introduces the number of lines per line (lines of the initial text file to each line of the result text files). Suppose the user enters 2.
      So far my code works fine. But I tried to code a loop for do (continuing the example):
      Start first loop repetition. Create "C:\result.-1.txt", and write on it "Line 1 asdf,Line 2 asdf" End first loop repetition. Start second loop repetition. Create "C:\result.-2.txt", and write on it "Line 3 asdf,Line 4 asdf" End second loop repetition. But my code results (continuing the example) in three files created:
      C:\result.txt that contains "Line 1 asdf,Line 2 asdf,Line 3 asdf,Line 4 asdf," C:\result.-1.txt that contains nothing. C:\result.-2.txt that contains nothing. Where is the error? I can't understand where is it...