Ru-Board.club
← Вернуться в раздел «Программы»

» AutoIT

Автор: VitAlll2013
Дата сообщения: 01.09.2008 10:47
#include <GuiConstantsEx.au3>

$sFile1 = @ScriptDir & "\Test1.txt"
$sFile2 = @ScriptDir & "\Test2.txt"
$sFileContent = FileRead($sFile1)

$GUI = GUICreate("Test Script", 300, 200)
$Edit_config = GUICtrlCreateEdit($sFileContent, 20, 20, 260, 120)
$Save_Button = GUICtrlCreateButton("Save", 20, 160, 60, 20)
$rbText1 = GUICtrlCreateRadio("text1", 104, 160, 57, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
$rbText2 = GUICtrlCreateRadio("text2", 176, 160, 65, 17)

GUISetState(@SW_SHOW, $GUI)

While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
            
        Case $rbText1
            $sFileContent = FileRead($sFile1)
                If @error = 1 Then
                $sFileContent = "Can't find file text1.txt"
                EndIf
            GUICtrlSetData ($Edit_config, $sFileContent)
            $sFile = $sFile1
            
        Case $rbText2
            $sFileContent = FileRead($sFile2)
                If @error = 1 Then
                $sFileContent = "Can't find file text2.txt"
                EndIf
            GUICtrlSetData ($Edit_config, $sFileContent)
            $sFile = $sFile2
        
Case $Save_Button
$sEditContent = GUICtrlRead($Edit_config)

If $sEditContent <> $sFileContent Then
$sFileContent = $sEditContent

$hFOpen = FileOpen($sFile, 2)
FileWrite($hFOpen, $sFileContent)
FileClose($hFOpen)

MsgBox(64, "Done!", "Data is saved!", 0, $GUI)
Else
MsgBox(48, "Attention!", "There is no changes to the data.", 0, $GUI)
EndIf
EndSwitch
WEnd

получилось, разбираюсь почему...
Автор: NIKZZZZ
Дата сообщения: 01.09.2008 11:05
Маленький вопросик, как определить координаты и размеры окна, открытого с помощью GuiCreate() ? Не смог найти в хелпе, хотя наверняка есть.
Автор: Maza Faka
Дата сообщения: 01.09.2008 12:12
NIKZZZZ

Код:
WinGetPos()
Автор: ViSiToR
Дата сообщения: 01.09.2008 12:12
NIKZZZZ 12:05 01-09-2008
Цитата:
как определить координаты и размеры окна, открытого с помощью GuiCreate() ?

Через WinGetPos?


Код: #include <GuiConstantsEx.au3>

$GUI = GUICreate("Test Script", 300, 200)
GUISetState(@SW_SHOW, $GUI)

$aGUI_Pos = WinGetPos($GUI)

MsgBox(64, "Coords:", _
StringFormat("Left = %i\nTop = %i\nWidth = %i\nHeight = %i", $aGUI_Pos[0], $aGUI_Pos[1], $aGUI_Pos[2], $aGUI_Pos[3]))

While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Автор: VladDao
Дата сообщения: 01.09.2008 14:22

Цитата:
Есть ли в AutoIt3 зарегестрированные клавиши завершения скрипта



А разве в других скриптовых языках есть такое? Смотри в справке функцию HotKeySet()


Да, например в SilkTest нажимаешь два шифта работа скрипта прерывается

Добавлено:
столкнулся с проблемой при записи в файл *.txt 1527 строк скрипт выдает сообщение о том что не может открыть файл в чем может быть проблема?
Вот скрипт.

Func LogFile($log, $logcherta,$koltesttexts,$kol)
    $namefile ="d:\log" & $data & ".html"
    $file = FileOpen($namefile, 1)

    ; Check if file opened for writing OK
    If $file = -1 Then
        MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf

    FileWriteLine($file, $log )
    FileWriteLine($file, $logcherta )
    FileWriteLine($file, $koltesttexts & $kol )
    FileClose($namefile)
EndFunc
Автор: ViSiToR
Дата сообщения: 01.09.2008 15:00
VladDao 15:22 01-09-2008
Цитата:
Да, например в SilkTest нажимаешь два шифта работа скрипта прерывается

Это не разумно со стороны разработчиков, пользователь (скриптер) сам должен решать как будет завершаться скрипт.


Цитата:
в чем может быть проблема?

В том что закрывать нужно не имя файла, а идентификатор (Handle) открытия файла...


Код: Func LogFile($log, $logcherta,$koltesttexts,$kol)
$namefile ="d:\log" & $data & ".html"
$file = FileOpen($namefile, 1)

; Check if file opened for writing OK
If $file = -1 Then
MsgBox(0, "Error", "Unable to open file.")
Exit
EndIf


FileWriteLine($file, $log)
FileWriteLine($file, $logcherta)
FileWriteLine($file, $koltesttexts & $kol)

FileClose($file)
EndFunc
Автор: VladDao
Дата сообщения: 01.09.2008 15:36
Я использую MsgBox
такую строчку
MsgBox(36,"Close","close ?")
появляется сообщение с кнопками да нет.
как можно использовать это условие что бы при нажатии да нужное мне окно окно закрывалось а при нет не закрывалось?
Автор: timsky
Дата сообщения: 01.09.2008 15:57
VladDao
Посмотри в хелпе о возвращаемых ф-ей MsgBox данных - там есть все.
Автор: ziherun
Дата сообщения: 02.09.2008 08:27
Как сделать чтобы 2 скрипта работали одновременно, а то запускаешь один он работает потом включаешь 2 скрипт, но он сначала прерывает первый а по повторному нажатию запускает второй так жи и наоборот вот мой пример что я накарябал
#include <GUIConstants.au3>
Global $Paused
HotKeySet("^ф", "ShowMessage1")
HotKeySet("^я", "ShowMessage2")

Func ShowMessage1()
    $Paused = NOT $Paused
While $Paused
    ToolTip("Run 1 сек",0,0)
ControlSend("тест - Блокнот", "", "Edit1", "1 сек")

Sleep(2000)
WEnd
    ToolTip("")
    EndFunc
Func ShowMessage2()
    $Paused = NOT $Paused
While $Paused
    ToolTip("Run 2 сек",0,20)
ControlSend("тест - Блокнот", "", "Edit1", "2 сек ")

Sleep(5000)
WEnd
    ToolTip("")
    EndFunc
GUICreate("проба",250,300,100,200)
GUISetBkColor (0x00E0FFFF)
GUISetState()
$Menu1 = GUICtrlCreateMenu("Файл")
$AboutItem3 = GUICtrlCreateMenuitem("Открыть", $Menu1)
$AboutItem1 = GUICtrlCreateMenuitem("Сохранить", $Menu1)
$AboutItem2 = GUICtrlCreateMenuitem("Сохранить как...", $Menu1)

$Menu = GUICtrlCreateMenu("Помощь")
$AboutItem4 = GUICtrlCreateMenuitem("F.A.Q.", $Menu)
$AboutItem = GUICtrlCreateMenuitem("О программе", $Menu)

GUISetState()

Do
$msg = GUIGetMsg ()
Select
Case $msg = $AboutItem3
$file = FileOpenDialog("Открыть файл", "", "(*.dll)", 1)
Case $msg = $AboutItem2
$file = FilesaveDialog("Сохранить файл", "", "(*.dll)", 1)
Case $msg = $AboutItem4
Case $msg=$AboutItem
MsgBox("О программе", "", "Версия 0.1")
         exit
     EndSelect
Until $msg = $GUI_EVENT_CLOSE
Автор: Maza Faka
Дата сообщения: 02.09.2008 10:48
ziherun

Цитата:
Как сделать чтобы 2 скрипта работали одновременно

Ты имеешь в виду 2 функции? AutoIt не поддерживет мультипоточность, то есть нельзя вызвать вторую функцию, пока не отработает первая. Частично это можно обойти используя API-функцию SetTimer, для примера смотри в справке функцию _Timer_SetTimer(), также можно поискать примеры на офф.форуме
Автор: NIKZZZZ
Дата сообщения: 02.09.2008 11:41
Интересно, а можно ли написать сервис на Autoit ? Имеется ввиду не запустить exe файл как сервис, а именно сервис ?
Автор: Maza Faka
Дата сообщения: 02.09.2008 13:10
NIKZZZZ

Цитата:
Имеется ввиду не запустить exe файл как сервис, а именно сервис ?

А как работают Windows сервисы? Вроде бы все так или иначе запускаются из exe-файлов? И что мешает запускать скомпилированный скрипт как сервис?
Автор: Hackproof
Дата сообщения: 02.09.2008 13:43
На офф. форуме был скрипт для запуска других скриптов, как служб, но у меня это как-то не заработало. В списке служб скрипт появлялся, но при запуске появлялось сообщение вроде "Служба не ответила за установленный промежуток времени". Стандартная виндовая прога srvinstw.exe с той же проблемой.
Автор: Leony8
Дата сообщения: 02.09.2008 13:48
По идее, чтобы быть сервисом, программа должна поддерживать мультипотоковость, а AutoIt не поддерживает её – получатся костыли, а не программа.
Автор: Maza Faka
Дата сообщения: 02.09.2008 15:57
Leony8
Не надо забывать, что AutoIt всё таки скриптовый язык со всеми вытекающими отсюда ограничениями. Но среди скриптовых языков AutoIt IMHO лучший.
Автор: Loopback
Дата сообщения: 02.09.2008 19:16
Ну, в принципе необязательно запускать скрипты напрямую, srvany.exe очень хорошо в этом деле помогает.
Автор: VladDao
Дата сообщения: 04.09.2008 09:42
Не могу разобраться с возращаемым значением функции msgbox;
как мне вызвать блокнот и нажать F1 если нажали да и
просто запустить блокнот если нажали нет
Вот скрипт:

$k = MsgBox(36,"Open?","Open?")

if $k = 1 Then
    run("notepad")
    WinActivate("Безымянный - Блокнот")
    Send("{F1}")
    Exit
Else
    run("notepad")
    WinActivate("Безымянный - Блокнот")
    Exit
EndIf    
Автор: Loopback
Дата сообщения: 04.09.2008 12:37

Цитата:
Не могу разобраться с возращаемым значением функции msgbox;

В справке очень наглядная табличка возвращаемых значений есть. Ну вот смотри, для MsgBox используешь флаг 4, т.е. будут созданы кнопки YES и NO. Теперь смотрим таблицу значений: нажатие YES вернет 6, NO - 7. Так что будет:

If $k = 6 Then ...
Автор: gal7
Дата сообщения: 04.09.2008 14:01
Можно ли в Autoit получить id элемента по его hwnd и как? Ато одна функция возвращает hwnd, а нужен id.
Автор: VladDao
Дата сообщения: 04.09.2008 14:53

Цитата:
Теперь смотрим таблицу значений: нажатие YES вернет 6, NO - 7. Так что будет:

Спасибо , за подсказку .
немного стормозил.

Автор: ViSiToR
Дата сообщения: 04.09.2008 23:10
gal7 15:01 04-09-2008
Цитата:
Можно ли в Autoit получить id элемента по его hwnd



Код: #include <GuiConstantsEx.au3>

$GUI = GUICreate("_GUICtrlGetID - Example", 300, 200)

$Button = GUICtrlCreateButton("Button", 20, 40, 60, 20)
$hButton = GUICtrlGetHandle($Button)
$iCtrlID = _GUICtrlGetID($hButton)

GUICtrlCreateLabel("Some Label", 20, 80)
GUICtrlCreateCheckbox("Some CheckBox", 20, 120)

GUISetState(@SW_SHOW, $GUI)

MsgBox(64, "_GUICtrlGetID", StringFormat("Original ID = %i\nID by hWnd = %i", $Button, $iCtrlID))

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd

Func
_GUICtrlGetID($hWnd)
Local $aRet = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $hWnd)
Return $aRet[0]
EndFunc
Автор: gal7
Дата сообщения: 05.09.2008 09:51
Спасибо!
Автор: VladDao
Дата сообщения: 05.09.2008 14:15
Может кто нить знает возможно ли с помощью AutoIT
работать с ком портами из под винды. засылать данные и принимать их соответственно
Можно ли в AutoIT использовать WiniP функции?
что то вроде такого:
hComPort=CreateFile(cCString[7],
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
----------------------------------------
sDCB.BaudRate = CBR_57600;
sDCB.ByteSize = 8;
sDCB.Parity = NOPARITY;
sDCB.StopBits = ONESTOPBIT;
SetCommState(hComPort, &sDCB);
---------------------------------
WriteFile(hComPort, &cBufferWriting, 3, &dwCounter, &sOVERLAPPED) ;
-----------------------------
ReadFile(hComPort, &cBufferReading, 3, &dwCountReading, &sOVERLAPPED);
Автор: timsky
Дата сообщения: 05.09.2008 14:17
Всем првет

Вопрос возник, наверняка уже обсуждался, но версия для печати не пашет

Вобщем, есть текстовый файл, в котором нужно удалить дублирующиеся строки.
Гуй не нужно, загрузить в переменную (строковую например) сам смогу

Мне бы сам алгоритм сортировки и удаления, а то мозг скоро вскипит.
Автор: KChernov
Дата сообщения: 05.09.2008 15:59
timsky
Структура текста сохраниться должна?
А то можно просто отсортировать, а потом удалить повторы.

Вообще алгоритм простой - берешь первую строку и сравниваешь ее со всеми остальными, потом 2-ю и тд.
Можно ускорить это дело, используя хэши для строк и сравнивая сначала их.
Автор: timsky
Дата сообщения: 05.09.2008 16:35
Структура текста абсолютно не важна. Там будет не текст, а список чего угодно.


Цитата:
А то можно просто отсортировать, а потом удалить повторы.


Вот какой алгоритм у этой операции? Удалить повтоы ясно как, а как отсортировать?


Цитата:
Вообще алгоритм простой - берешь первую строку и сравниваешь ее со всеми остальными, потом 2-ю и тд.

Хм... на больших файлах наверное жутко задумается... надо попробовать. Спасибо
Пипл, если есть еще какие алгоритмы, скажите плиз.
Автор: KChernov
Дата сообщения: 05.09.2008 17:15
Только не Кэши, а Хэши


Цитата:
а как отсортировать?

Любой алгоритм - по ним книг немеряно.


Цитата:
Хм... на больших файлах наверное жутко задумается

Ну вот тогда и надо использовать хэши.
Проходишь по своему файлу и создаешь хэши всех строк (на самом деле выбрать хэш - тоже задача, но в принципе в книгах про это тоже есть).
А потом уже массивом этих хэшей и оперируешь.
А уж сортировать ты их там будешь или еще что - дело десятое.
Автор: ViSiToR
Дата сообщения: 05.09.2008 18:09
timsky
А сортировать зачем? или это ещё одна задача?

Если нужно и отсоритровать и удадить дубли, то думаю проще сделать это в массиве:


Код: #include <Array.au3>

$sFilePath = @ScriptDir & "\Test.txt"

$sFileArr = StringSplit(StringStripCR(FileRead($sFilePath)), @LF)

_ArrayDeleteClones($sFileArr)
_ArraySort($sFileArr, 0, 1)

$hFOpen = FileOpen($sFilePath, 2)

For $i = 1 To UBound($sFileArr)-1
If $sFileArr[$i] <> "" Then FileWrite($hFOpen, $sFileArr[$i] & @CRLF)
Next

FileClose($hFOpen)

Func _ArrayDeleteClones(ByRef $avArray)
If Not IsArray($avArray) Then Return SetError(1)
If UBound($avArray, 0) > 1 Then Return SetError(2)

Local $aTmpArr[1], $aClonesArr[1], $iIsFound = 0, $iExtended = 0

For $i = 1 To UBound($avArray) - 1
$iIsFound = 0

For $j = 1 To UBound($aTmpArr)-1
If $avArray[$i] = $aTmpArr[$j] Then
$iIsFound = 1
$iExtended += 1

$aClonesArr[0] += 1
ReDim $aClonesArr[$aClonesArr[0]+1]
$aClonesArr[$aClonesArr[0]] = $avArray[$i]

ExitLoop
EndIf
Next

If Not
$iIsFound Then
$aTmpArr[0] += 1
ReDim $aTmpArr[$aTmpArr[0]+1]
$aTmpArr[$aTmpArr[0]] = $avArray[$i]
EndIf
Next

If
$iExtended > 0 Then $avArray = $aTmpArr

Return SetError(0, $iExtended, $aClonesArr)
EndFunc
Автор: timsky
Дата сообщения: 05.09.2008 18:15
ViSiToR
Во, спасибо! Вот на таких скриптах просто кайф учиться
Сортировка мне не нужна, мне нужно просто удалить дубли любым способом, главное, не жутко тормозным на больших файлах. Есть несложный алгоримт простого удаления дублей, исключая выше предложеный, где сверяется каждая строка со всеми строками по очереди?
Автор: ViSiToR
Дата сообщения: 05.09.2008 18:59
timsky
Немного подправил пример, там была ошибка (если небыло дублей добавлялась лишняя цифра - число строк ).

timsky 19:15 05-09-2008
Цитата:
Есть несложный алгоримт простого удаления дублей, исключая выше предложеный, где сверяется каждая строка со всеми строками по очереди?

Ну в принципе оно там так и делается...
Можно ещё использовать Dictionary, оно полагаю побыстрее будет:


Код: #include <Array.au3>

$sFilePath = @ScriptDir & "\Test.txt"

$sFileArr = StringSplit(StringStripCR(FileRead($sFilePath)), @LF)

_ArrayDeleteDupes($sFileArr)

$hFOpen = FileOpen($sFilePath, 2)

For $i = 1 To UBound($sFileArr)-1
If $sFileArr[$i] <> "" Then FileWrite($hFOpen, $sFileArr[$i] & @CRLF)
Next

FileClose($hFOpen)

Func _ArrayDeleteDupes(ByRef $aItems)
If @OSTYPE = "WIN32_WINDOWS" Then Return 0

Local $objDictionary = ObjCreate("Scripting.Dictionary")
Local $i = 0

For $strItem In $aItems
If Not $objDictionary.Exists($strItem) Then $objDictionary.Add($strItem, $strItem)
Next

Local
$intItems = $objDictionary.Count - 1
ReDim $aItems[$intItems + 1]

For $strKey In $objDictionary.Keys
$aItems[$i] = $strKey
$i
+= 1
Next

Return
1
EndFunc

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192

Предыдущая тема: Quintura Search


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.