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

» AutoIT

Автор: ynbIpb
Дата сообщения: 27.02.2008 18:32
как много вариантов, болльшое всем спаибо!
Я уже реализовал, чтоб при нажатии на кнопку вылазил диалог открытия файла, выбиаем файл и программа сразу же читает из него текущие цвета, подставляет их значения в поля ввода и также отображает сам цвет рядом в лейбле командой GuiCtrlSetBkColor.
Возникла задача как сделать чтоб при ручном вводе в таком лейбле тоже появлялся нужный цвет, соответствующий введённым данным.
нужно чтоб программа выждала пока не будут введены все данные (6 символов) и только тогда выставляла цвет на основе введённых данных.
я смог сделать только так:

Код: ;---------ручной ввод цвета шрифта----------
Case $Msg = $Input1
$InputRead
= GUICtrlRead ($Input1)
$Lengthline = StringLen ($InputRead)
If $Lengthline = 6 Then
GuiCtrlSetBkColor($Label4, $InputRead)
Else
MsgBox(0,"","No Valid data")
EndIf
;------------------------конец--------------------
Автор: ViSiToR
Дата сообщения: 27.02.2008 20:46
ynbIpb

Цитата:
нужно чтоб программа выждала пока не будут введены все данные (6 символов) и только тогда выставляла цвет на основе введённых данных.

Вместо стандартного обработчика (Case $Msg = $Input1..), нужно в таком случае использовать сообщения посылаемые в наш GUI в момент того или инного действия..

Maza Faka чуть выше привёл пример такого обработчика:



Код: #include <GuiConstants.au3>

$hGui = GUICreate("Test GUI", 300, 200)

$Input1 = GUICtrlCreateInput("", 20, 50, 200, 20, $ES_UPPERCASE)

$Label = GUICtrlCreateLabel("", 240, 50, 20, 20, $SS_SUNKEN)
GUICtrlSetBkColor($Label, 0xFFFFFF)

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUISetState()

While GUIGetMsg() <> -3
WEnd

Func
WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
Local $IdFrom, $iCode
$IdFrom
= BitAnd($wParam, 0x0000FFFF)
$iCode = BitShift($wParam, 16)

Switch $IdFrom
Case $Input1
Switch $iCode
Case $EN_UPDATE ;Это сообщение срабатывает когда в $Input1 изменяются данные
$sInputData = GUICtrlRead($Input1) ;Читаем данные с $Input1
$iInputLenght = StringLen($sInputData) ;Узнаём длину нашей строки в $Input1

;Если длина ровняется 6, устанавливаем цвет для $Label
If $iInputLenght = 6 Then
GUICtrlSetBkColor($Label, "0x" & $sInputData)
ElseIf $iInputLenght > 6 Then
GUICtrlSetData($Input1, StringTrimRight($sInputData, 1))
EndIf
EndSwitch
EndSwitch

Return $GUI_RUNDEFMSG
EndFunc
Автор: ynbIpb
Дата сообщения: 27.02.2008 21:09
Спасибо!
мой мозг щас взарвётся )))
буду втыкать в код...
з.ы.
вот ещё что мне непонятно:
делал чтение файла так (режим MessageLoop):

Код: Case $Msg = $Button1;проверяем нажата ли кнопка "Select"
;Если нажата кнопка "Select" выводим диалог открытия файла

$FileOpen = FileOpenDialog("Open", @ScriptDir & "\", "Executable (*.exe)", 1);открываем только исполняемые файлы EXE
If @error Then
;Если не выбрали файл выводим окно с уведомлением
MsgBox(0,"","No File selected")
Else
;Если файл выбран отделяем от его пути только имя файла
$FileName = StringMid($FileOpen, StringInStr($FileOpen, "\", 0, -1) + 1)
; и помещаем на лейбл имя файла
GUICtrlSetData ( $Label1, $FileName)
$FileOpened = FileOpen ( $FileOpen, 16 );открываем файл в бинарном режиме
$FileReaded = FileRead($FileOpened);читаем файл
$hexcolor1 = BinaryMid($FileReaded, 0x00000610+1, 3);смещение шрифта
$hexcolor2 = BinaryMid($FileReaded, 0x0000061D+1, 3);смещение фона
$color1=StringMid($hexcolor1, StringInStr($hexcolor1, "x", 0, -1) + 1);отделяем байты от 0x
$color2=StringMid($hexcolor2, StringInStr($hexcolor2, "x", 0, -1) + 1);отделяем байты от 0x
GuiCtrlSetBkColor($Label4, "0x"& $color1);устанавливем полученый цвет шрифта для просмотра
GuiCtrlSetBkColor($Label5, "0x"& $color2);устанавливем полученый цвет фона для просмотра
GUICtrlSetData ( $Input1, $color1);устанавливаем полученый код цвета шрифта в поле ввода
GUICtrlSetData ( $Input2, $color2);устанавливаем полученый код цвета фона в поле ввода
FileClose ($FileOpened);закрываем открытый файл
MsgBox(0, "Chars read:", $hexcolor1 & @CR & $hexcolor2)
EndIf
Автор: Loopback
Дата сообщения: 27.02.2008 22:41

Цитата:
Так оно захватывало предыдущий байт и два нужных. пришлось ставить +1 тогда всё выполняет правильно. вот мучает меня почему так?

Просто смещения, судя по всему, были взяты из HEX-редактора, где отсчет идет начиная с 0, а строки в Autoit отсчитываюся с 1. Так что всё правильно.

Цитата:
И ещё если не трудно проанализируйте код может какие недоработки найдёте или упращения можно сделать.

Да вроде все нормально, ну может быть только $color1 и $color2 можно получить чуть проще:


Код: $color1=StringTrimLeft($hexcolor1, 2)
$color2=StringTrimLeft($hexcolor2, 2)
Автор: ynbIpb
Дата сообщения: 28.02.2008 07:40
Понятно, буду вникать дальше.
за поправку спасибо, внесу изменения.
Автор: XpycTMD
Дата сообщения: 28.02.2008 07:49
ViSiToR
Есть маленькая просьба. Можеш в своей Скрипт-Программе Desktop Icons Restorator сделать чтобы при нажатии кнопки Restore Session также востановливалось и ражрешение экрана.

Зарание благодарю.


Добавлено:
И еще вопрос как в твое скрипте _GuiCreateGrid() сдлеать толщену линии потоньше
Автор: ViSiToR
Дата сообщения: 28.02.2008 08:08
XpycTMD

Цитата:
чтобы при нажатии кнопки Restore Session также востановливалось и ражрешение экрана.

Не уверен что понял, как связано разрешение экрана с восстановлением позиции иконок? и программа кажется не трогает разрешение экрана, с чего конкретно нужно восстанавливать?

Добавлено:

Цитата:
сдлеать толщену линии потоньше

Самое тонкое это 1 пиксель - Задаётся в третьем параметре функции.
Автор: XpycTMD
Дата сообщения: 28.02.2008 08:22
ViSiToR

Хотелось бы чтобы при сохранении сеанса она также запоминал и разрешение экрана и востанавливола его при востановлении иконок. Или подскажи как менять разрешение экрана с помощью AutoIt я сам допишу (если ты не против )

Автор: ViSiToR
Дата сообщения: 28.02.2008 08:32
XpycTMD

Цитата:
Хотелось бы чтобы при сохранении сеанса она также запоминал и разрешение экрана и востанавливола его при востановлении иконок.

Возможно сделаю опционально. Но не в ближайшее время.


Цитата:
подскажи как менять разрешение экрана с помощью AutoIt

В шапке есть решение.


Цитата:
если ты не против

Нет конечно, иначе не выкладывал бы исходники
Автор: XpycTMD
Дата сообщения: 28.02.2008 08:39
ViSiToR


Цитата:
Возможно сделаю опционально. Но не в ближайшее время.

Понятно значит подождем. А пока сам попробую сделать


Цитата:
В шапке есть решение

Спасибо незаметил
Автор: gregaz
Дата сообщения: 28.02.2008 16:13
Подскажите , пожалуйста
Как можно читать (редактировать) теги МР3-файлов ?
Автор: vladimir oz
Дата сообщения: 28.02.2008 17:26
Нужно сделать программу отключения флешки от компьютера, помогите пожалуйста
Автор: Leony8
Дата сообщения: 28.02.2008 21:31
deveject.exe тебе поможет.
Автор: Maza Faka
Дата сообщения: 29.02.2008 06:48
gregaz
Поищи здесь
Автор: gregaz
Дата сообщения: 29.02.2008 15:21
Maza Faka,Спасибо
Видать это непростой вопрос . Попробую найти там - вроде есть кое-какие наработки
Автор: Leony8
Дата сообщения: 29.02.2008 15:26
Бросаем deveject.exe в папку с этим скриптом:

local $var = DriveGetDrive( "REMOVABLE" ), $exe = @scriptDir&"\deveject.exe"
If NOT @error Then
For $i = 2 to $var[0]
        RunWait($exe & " -EjectDrive:" & $var[$i],'',@SW_HIDE)
Next
EndIf

всё!
Автор: ViSiToR
Дата сообщения: 29.02.2008 20:13
Не обязательно внешнюю утилиту подключать (хотя утилита более эффективна в этом случае )...

Вариант первый:


Код: Run("rundll32.exe shell32.dll,Control_RunDLL hotplug.dll", @SystemDir)
Автор: NIKZZZZ
Дата сообщения: 29.02.2008 20:55
vladimir oz

Цитата:
Нужно сделать программу отключения флешки от компьютера

Пожалуй, для корректного извлечения здесь не обойдешься внешней утилитой.
RemoveDrive

ViSiToR

AutoIt_Path_Switcher.au3 - ну всем хороша, но при переходе ей-же на бетку перестает работать. Шумит, что GUI - константы не определены . Может их просто указать вручную, чтобы не зависеть от библиотек?

Автор: ViSiToR
Дата сообщения: 29.02.2008 22:55
NIKZZZZ

Цитата:
Шумит, что GUI - константы не определены

Там если я верно помню, нужно не GuiConstants.au3, а GuiConstantsEx.au3.

А заменить не сложно. Там немного констант...


Код: ;~ #include <GuiConstants.au3>
;~ #include <Constants.au3>
;


Global Const $GUI_CHECKED = 1
Global Const $GUI_EVENT_CLOSE = -3
Global Const $GUI_EVENT_MINIMIZE = -4

Global Const $TRAY_DEFAULT = 512
Global Const $TRAY_EVENT_PRIMARYDOWN = -7

Global Const $CB_GETCOUNT = 0x146
Global Const $CB_GETLBTEXT = 0x148
Global Const $CB_GETLBTEXTLEN = 0x149
Автор: NIKZZZZ
Дата сообщения: 01.03.2008 00:04
ViSiToR

Цитата:
А заменить не сложно

Я не это имел ввиду. Константы , определенные в библиотеках заменять не надо. Иначе при их подключении (#include <Constants.au3> и.т.п.) естественно возникнет ошибка. Их надо просто прописать вручную, тоесть их не использовать .
К стати, вопрос - можно ли переопределить глобальную константу ?
Автор: ViSiToR
Дата сообщения: 01.03.2008 00:36
NIKZZZZ

Цитата:
Иначе при их подключении (#include <Constants.au3> и.т.п.) естественно возникнет ошибка.

А зачем их подключать? обычно в таких случаях именно так и делают, определяют их в самом скрипте, подключать библиотеки больше не нужно. Если ставить настоящие значения, то можно потеряться в коде (возможно не в этом, но обычно этого избегают).


Цитата:
можно ли переопределить глобальную константу ?

Afaik нет, этот тест доказывает это:


Код:
Global Const $MYCONST = 1

Assign("MYCONST", 2, 2)
ConsoleWrite(@error)

MsgBox(0, "", $MYCONST)
Автор: NIKZZZZ
Дата сообщения: 01.03.2008 04:21
ViSiToR

Цитата:
А зачем переопределять константу?

Так проблема в том, что константу определил не сам, а при подключении библиотеки от нее никуда не уйдешь. Нет гарантии. И самое неприятное - библиотеку нельзя править, иначе забудь об обновлениях.

К стати, про обновления - в последней бетке при компиляции добавилась прекрасная опция -
"Create CUI instead of GUI EXE" , теперь ConsoleWrite() и есть ConsoleWrite() !
Автор: ViSiToR
Дата сообщения: 01.03.2008 09:11
NIKZZZZ

Цитата:
при подключении библиотеки от нее никуда не уйдешь.

Так а в чём именно проблема? укажи новую константу


Цитата:
библиотеку нельзя править, иначе забудь об обновлениях

Я на такой случай сделал себе патч, при обновлении пропатчиваются нужные библиотеки, правда не для констант, а для функции.


Цитата:
в последней бетке при компиляции добавилась прекрасная опция

Да, пора уже такую возможность иметь, это заняло довольно долго довести до ума.

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


Код: ;CalcIt Program by G.Sandler.
;Before using in command line prompt, must be executed (after compiling) at least once.


#include ".\CUI_App_UDF.au3"

$sCopyRight_Str = StringFormat("=================================================\n" & _
"CalcIt Program.\n\n" & _
"Copyright (C) 2008 G.Sandler. All rights reserved.\n" & _
"=================================================\n\n" & _
"Usage Example:\n" & _
"CalcIt 2 + 3 -> Will output 5 \n\n")

If $CmdLine[0] = 0 Or $CmdLineRaw = "?" Then
ConsoleWrite($sCopyRight_Str)
Sleep(5000)
Exit
EndIf

$sCalculate = Execute($CmdLineRaw)
ConsoleWrite($CmdLineRaw & " = " & $sCalculate & @CRLF)
Автор: NIKZZZZ
Дата сообщения: 01.03.2008 15:36
ViSiToR

Цитата:
укажи новую константу

Так проблема в том, что константа используется где-то в библиотеках. Пропатчивание, конечно, выход, но как-то криво.
Было-бы неплохо, если-бы и библиотеки, и константы можно было-бы переопределить ...

Цитата:
Кстати это было возможно пропатчиванием экзешника ещё до внедрения этой фичи.

Красиво . Я пытался сделать нечто подобное, но так и не получилось.
К стати,

Код: Run(@ComSpec & ' /c ping -n 2 localhost > nul & attrib -H "' & @ScriptFullPath & _
'" & del /f /q "' & @ScriptFullPath & '"', '', @SW_HIDE)
Автор: ViSiToR
Дата сообщения: 02.03.2008 03:59
NIKZZZZ

Цитата:
почему-то не всегда подобная фича срабатывает.

Возможно пути к скрипту содержат не только латинские символы?


Цитата:
правда, это будет работать только в скомпилированном файле.

Можно использовать @AutoItExe, в не откомпилированном скрипте это будет путь к AutoIt3.exe, в откомпилированном полный путь к скрипту .


Цитата:
неплохо было-бы добавить пару функций

Подобные функции добавлять не будут, даже если сильно попросить. Это специфичные задачи, далеко не всем нужны. Это я из опыта пишу, я просил добавить функции посерьёзнее, функции сокращающие время обработки, которые многим сгодились бы как нативные, но в ответ лишь типа «It's trivial, you can implement this in few lines of simple code»
Автор: NIKZZZZ
Дата сообщения: 02.03.2008 19:02
ViSiToR

Цитата:
Возможно пути к скрипту содержат не только латинские символы?

Да нет, проверял. Иногда почему-то не срабатывает. Возможно задержка ping -n 2 localhost не всегда отрабатывается правильно. Я встречался с подобной проблемой, но не разбирался.

Цитата:
Подобные функции добавлять не будут, даже если сильно попросить. Это специфичные задачи, далеко не всем нужны. Это я из опыта пишу, я просил добавить функции посерьёзнее, функции сокращающие время обработки, которые многим сгодились бы как нативные, но в ответ лишь типа «It's trivial, you can implement this in few lines of simple code»

Так может создать мусорную корзинку для этого где-нибудь в шапке самостоятельно? Много времени отнимает конструирование велосипедов.

Автор: zero1632
Дата сообщения: 03.03.2008 21:25
а можно ли как-то в скомпилированный скрипт добавить ресурсы, вроде разных файлов, разных exeшников, которые можно было бы запускать из скрипта вызовом?
Автор: Loopback
Дата сообщения: 03.03.2008 22:13

Цитата:
а можно ли как-то в скомпилированный скрипт добавить ресурсы, вроде разных файлов, разных exeшников, которые можно было бы запускать из скрипта вызовом?


Ну, во-первых, есть FileInstall. Разумеется, требуется распаковать файл куда-нибудь во временный каталог и потом запускать.

Также можно добавить любые бинарные данные в ресурсы:

http://www.autoitscript.com/forum/index.php?showtopic=51103

Но на мой взгляд, это имеет смысл только для ресурсов, которые можно использовать, не выгружая на диск (иконки, битмапы и т.д.). Экзешник напрямую запустить нельзя. Вернее, теоретически можно, но не уверен, что возможно в Autoit, хотя задача интересная.
Автор: arr1val
Дата сообщения: 06.03.2008 14:00
Подскажите пример скрипта, который мог бы "отлавливать" файлы по маске и мувить в определенное место? И вообще возможно ли это с помощью аутоита. Допустим все файлы *.док с диска цэ переместить в опр папку.
Автор: Maza Faka
Дата сообщения: 06.03.2008 15:00
arr1val
Это можно сделать из командной строки:

Код:
move c:\*.doc d:\folder

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192

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


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