View previous topic :: View next topic |
Author |
Message |
Loopback
Joined: 07 Sep 2009 Posts: 1534
|
(Separately) Posted: Wed Oct 06, 2010 13:52 Post subject: |
|
|
Flasher
Тот же вариант, но заданием параметров интерфейса из командной строки. Также избавился от последней библиотеки, из которой использовалось всего 3 контанты. Теперь можно даже не компилировать.
Code: |
; Параметры:
; 1: %L
; 2: Количество полей поиска, минимум 1
; 3: Высота одного поля поиска
If $CmdLine[0] < 3 Then
MsgBox (0, "", "Недостаточно параметров, должно быть 3.")
Exit
EndIf
Global $gSrcCount = $CmdLine[2]
Global $gSrcHeight = $CmdLine[3]
Global $aList = _TCHLoadFileList($CmdLine[1])
Global $gReplaces = 0, $gMask
Global $gSrcEdit[$gSrcCount]
Global $nGUIHeight = $gSrcHeight * $gSrcCount + 109
Global Const $GUI_DISABLE = 128
Global Const $GUI_CHECKED = 1
$hGUI = GUICreate("Поиск и замена", 563, $nGUIHeight, -1, @DesktopHeight/2 - $nGUIHeight/2)
GUICtrlCreateLabel("Маска файлов", 8, 6, 78, 17)
$edMask = GUICtrlCreateInput("*.*", 8, 24, 265, 21)
GUICtrlCreateLabel("Текст для поиска", 8, 54, 94, 17)
GUICtrlCreateLabel("Текст для замены", 288, 54, 98, 17)
For $i = 0 To $gSrcCount - 1
$gSrcEdit[$i] = GUICtrlCreateEdit("", 8, 72 + $gSrcHeight * $i, 265, $gSrcHeight)
Next
$edTrg = GUICtrlCreateEdit("", 288, 72, 265, $gSrcHeight * $gSrcCount)
$cbCaseSence = GUICtrlCreateCheckbox("Учитывать регистр", 8, $gSrcHeight * $gSrcCount + 84, 137, 17)
$btnOK = GUICtrlCreateButton("OK", 400, $gSrcHeight * $gSrcCount + 79, 75, 25)
$btnCancel = GUICtrlCreateButton("Отмена", 480, $gSrcHeight * $gSrcCount + 79, 75, 25)
GUISetState(@SW_SHOW)
If $aList[0] = 0 Then GUICtrlSetState($btnOK, $GUI_DISABLE)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3, $btnCancel
Exit
Case $btnOK
$gMask = _MaskToRegexp(GUICtrlRead($edMask))
For $i = 1 To $aList[0]
If StringRight($aList[$i], 1) = "\" Then
_DoFolder($aList[$i])
Else
_DoFile($aList[$i])
EndIf
Next
MsgBox (0, "", "Выполнено замен: " & $gReplaces, 0, $hGUI)
Exit
EndSwitch
WEnd
Func _DoFolder($sFolder)
If $sFolder = "" Then Return
Local $sDirs = ""
Local $hSearch = FileFindFirstFile($sFolder & "*.*")
If @error Then Return
While 1
$sFile = FileFindNextFile($hSearch)
If @error Then ExitLoop
If @extended Then
$sDirs &= $sFolder & $sFile & "\" & @LF
ContinueLoop
EndIf
_DoFile($sFolder & $sFile)
Wend
FileClose($hSearch)
; Обработку каталогов приходится делать отдельно,
; чтобы не оставлять открытый поисковый хэндл,
; их максимально может быть 64
$aDirs = StringSplit($sDirs, @LF)
For $i = 1 To $aDirs[0]
_DoFolder($aDirs[$i])
Next
EndFunc
Func _DoFile($sFile)
If StringRegExp($sFile, $gMask) = 0 Then Return
Local $sText = FileRead($sFile)
Local $sSrc
Local $nReplaces = 0
For $i = 0 To $gSrcCount - 1
$sSrc = GUICtrlRead($gSrcEdit[$i])
If $sSrc = "" Then ContinueLoop
$sText = StringReplace($sText, $sSrc, GUICtrlRead($edTrg), 0, _
BitAND(GUICtrlRead($cbCaseSence), $GUI_CHECKED))
$nReplaces += @extended
Next
If $nReplaces = 0 Then Return
$gReplaces += $nReplaces
Local $hFile = FileOpen($sFile, 2)
FileWrite($hFile, $sText)
FileClose($hFile)
EndFunc
Func _MaskToRegexp($sMask)
$sMask = StringRegExpReplace($sMask, "(\\|\.|\+|\^|\(|\)|\[|\]|\{|\}|\$)", "\\\1")
$sMask = StringReplace($sMask, "?", ".")
$sMask = StringReplace($sMask, "*", ".+?")
Return("(?i)^" & $sMask & "$")
EndFunc
Func _TCHLoadFileList($sFileName)
Local $asList[1] = [0]
Local $hfList = FileOpen($sFileName, 0)
While 1
$sLine = FileReadLine($hfList)
If @error Then Exitloop
ReDim $asList[UBound($asList)+1]
$asList[UBound($asList)-1] = $sLine
Wend
FileClose($hfList)
$asList[0] = UBound($asList)-1
Return $asList
EndFunc
|
Last edited by Loopback on Wed Oct 06, 2010 19:55; edited 1 time in total |
|
Back to top |
|
 |
Flasher

Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Wed Oct 06, 2010 14:04 Post subject: |
|
|
Loopback
Ok, здорово! А с кнопками никак? Просто это позволило бы свести к минимуму кол-во кнопок в тулбаре и горячих клавиш для пользовательских команд. |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1534
|
(Separately) Posted: Wed Oct 06, 2010 14:35 Post subject: |
|
|
Flasher wrote: | А с кнопками никак? |
А, это я не заметил. Странный получается интерфейс, ну да ладно. Чтобы еще раз не постить простыню полного скрипта, добавь в начале скрипта после строк:
Code: |
Global $gSrcCount = $CmdLine[2]
Global $gSrcHeight = $CmdLine[3]
|
такую конструкцию:
Code: |
If $gSrcCount = 0 Then
$gBtnCount = 9 ; Количество кнопок
$nGUIHeight = 6 + $gBtnCount * 24 + $gBtnCount * 5
GUICreate("Окон поиска", 110, $nGUIHeight, -1, @DesktopHeight/2 - $nGUIHeight/2)
For $i = 0 To $gBtnCount - 1
GUICtrlCreateButton($i+1, 5, 5 + $i*24 + $i*5, 100, 24)
Next
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
Exit
Case 3 To $gBtnCount + 2
$gSrcCount = $nMsg - 2
GUIDelete()
ExitLoop
EndSwitch
Wend
EndIf
|
Теперь, если параметр количества окон, передаваемый скрипту будет = 0, будет появляться окно с кнопками. |
|
Back to top |
|
 |
Flasher

Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Wed Oct 06, 2010 14:46 Post subject: |
|
|
Ух ты. Просьба кнопки сделать квадратными(маленькими) в строку, а не в столб и сверху надпись "Выберите количество полей для поиска".
Добавлено: + ещё бы ограничение высоты окна по абсолютной высоте экрана сделать, при этом задать условие: если в сумме высота окна превышает абсолютную высоту экрана, то высота каждого левого поля ужимается по принципу x / y , где x - абсолютная высота экрана, а y - количество полей. И будет вообще великолепно.
+ Добавлено: да, конечно, нужно учесть и постоянные величины других элементов окна: строку заголовка, сепараторы(полосы прокрутки), области выше, ниже самих полей.
Думаю, это и без подсказки понятно, так, на всякий случай пишу.) |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1534
|
(Separately) Posted: Wed Oct 06, 2010 16:00 Post subject: |
|
|
Ох что вышло Жаль что на форуме нет "спойлера".
Заменяй всё начало скрипта:
Code: |
; Параметры:
; 1: %L
; 2: Количество полей поиска, минимум 1
; 3: Высота одного поля поиска
If $CmdLine[0] < 3 Then
MsgBox (0, "", "Недостаточно параметров, должно быть 3.")
Exit
EndIf
Global $gSrcCount = $CmdLine[2]
Global $gSrcHeight = $CmdLine[3]
If $gSrcCount = 0 Then
$gBtnCount = 9 ; Количество кнопок
$nGUIWidth = 6 + $gBtnCount * 24 + $gBtnCount * 5
GUICreate("Выберите количество полей для поиска", $nGUIWidth, 34, @DesktopWidth/2 - $nGUIWidth/2, -1)
For $i = 0 To $gBtnCount - 1
GUICtrlCreateButton($i+1, 5 + $i*24 + $i*5, 5, 24, 24)
Next
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
Exit
Case 3 To $gBtnCount + 2
$gSrcCount = $nMsg - 2
If @DesktopHeight - 50 < $gSrcHeight * $gSrcCount + 109 Then
$gSrcHeight = Int((@DesktopHeight-200) / $gSrcCount)
EndIf
GUIDelete()
ExitLoop
EndSwitch
Wend
EndIf
Global $aList = _TCHLoadFileList($CmdLine[1])
Global $gReplaces = 0, $gMask
Global $gSrcEdit[$gSrcCount]
Global Const $GUI_DISABLE = 128
Global Const $GUI_CHECKED = 1
$nGUIHeight = $gSrcHeight * $gSrcCount + 109
|
до строчки:
Code: |
$hGUI = GUICreate("Поиск и замена", 563, $nGUIHeight, -1, @DesktopHeight/2 - $nGUIHeight/2 - 20)
|
Конечно, считать через полную высоту экрана не совсем правильно, т.к. есть еще панель задач, а она может быть у некоторых более широкая. Но честно говоря, сейчас лень искать, как ее получать. |
|
Back to top |
|
 |
Flasher

Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Wed Oct 06, 2010 16:19 Post subject: |
|
|
Loopback wrote: | Code: | $hGUI = GUICreate("Поиск и замена", 563, $nGUIHeight, -1, @DesktopHeight/2 - $nGUIHeight/2 - 20) |
| " - 20)" не было в предыдущем скрипте. Ну не суть, строку нашёл, отсутствующее добавил. Мне уже нравится. Вот ещё что: можно, коли ты решил не раздвигать окно по высоте, хотя бы его центрировать? Loopback wrote: | т.к. есть еще панель задач, а она может быть у некоторых более широкая | Про панель задач и вправду забыл, она у меня скрывается автоматически, пиксель торчит.
Кстати, если кому надо: чтобы надпись в строке заголовка окна с кнопками влезла целиком, можно поменять "Выберите количество ..." на "Выбор числа ...". |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1534
|
(Separately) Posted: Wed Oct 06, 2010 16:43 Post subject: |
|
|
Flasher wrote: | Вот ещё что: можно, коли ты решил не раздвигать окно по высоте, хотя бы его центрировать? |
В смысле решил не раздвигать? Его высота устанавливается по количеству полей. Если полей с заданной высотой слишком много, они ужимаюся.
И оно центрируется, но немного выше, чтобы учесть таскбар. Убери как раз добавленный " - 20" и должно быть по центру. |
|
Back to top |
|
 |
Flasher

Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Wed Oct 06, 2010 16:49 Post subject: |
|
|
Loopback wrote: | В смысле решил не раздвигать? Его высота устанавливается по количеству полей. Если полей с заданной высотой слишком много, они ужимаюся. | В том смысле, что не относительно высоты экрана, а в ограниченной области.
Loopback wrote: | И оно центрируется, но немного выше, чтобы учесть таскбар. | Нет, это попытка завести в центр, только ты забыл, что у всех расширения разные и смещение, соответственно, будет у всех разное. А я хотел бы абсолютный центр( как в TCFS2 организовано с @ ). Если нужно, могу MVV попросить, он выложит код этого места с API-шками.  Loopback wrote: | Убери как раз добавленный " - 20" и должно быть по центру. | А у меня, наоборот, после добавления стало ближе к центру. |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1534
|
(Separately) Posted: Wed Oct 06, 2010 17:02 Post subject: |
|
|
Flasher wrote: | В том смысле, что не относительно высоты экрана, а в ограниченной области. |
Ограниченной чем? Таскбаром? Если так, то да, сейчас оно не вычисляется, я об этом и писал.
Flasher wrote: | расширения |
Может "разрешения"? Тогда это не играет роли, должно центрироваться на любом. А смещение сделано для коррекции высоты таскбара, но как опять же я писал выше, это неправильный путь, да.
Flasher wrote: | А у меня, наоборот, после добавления стало ближе к центру. |
Ладно, посмотрю. Я ведь правильно понимаю, что окно должно центрироваться по вертикали в свободной области, не занятой таскбаром? |
|
Back to top |
|
 |
Flasher

Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Wed Oct 06, 2010 17:15 Post subject: |
|
|
Loopback wrote: | Ограниченной чем? Таскбаром? | Нет, я имею в виду, что окно не распахнуто по высоте, а уменьшено.
Loopback wrote: | Может "разрешения"? | Конечно, пардон.
Loopback wrote: | Тогда это не играет роли, должно центрироваться на любом. А смещение сделано для коррекции высоты таскбара, но как опять же я писал выше, это неправильный путь, да. | Правильней сказать - несворачивающегося таскбара. (Странно, что MVV тогда на это не указал, когда делал команды r6 и т.п.)
Loopback wrote: | Я ведь правильно понимаю, что окно должно центрироваться по вертикали в свободной области, не занятой таскбаром? | Конечно. Даже если предположить, что таскбар постоянно присутствует, то всё равно он перекрывается окном снизу. К тому же таскбар у всех может очень сильно отличаться. Пытаться выискать высоту панели задач каждой шкурки, а также системных настроек, скажем, Win7 в зависимости от размера заданных иконок - дело не из лёгких. У меня классика '98, поэтому мне с этим проще.
Чего-то кнопка OK мёртвая. Поправь, пожалуйста. |
|
Back to top |
|
 |
Batya

Joined: 15 Dec 2004 Posts: 2224 Location: Москва, Россия
|
(Separately) Posted: Wed Oct 06, 2010 18:14 Post subject: |
|
|
[off]
Loopback
Loopback wrote: | Чтобы еще раз не постить простыню полного скрипта |
Ты же можешь исправлять свои старые посты - кнопка "правка". Так исправляй основной пост со скриптом и пользователям не придётся собирать скрипт по кускам.
Что-то я смотрю-смотрю на AutoIt и всё больше хочеться его изучить
[/off] _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
 |
Flasher

Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Wed Oct 06, 2010 18:56 Post subject: |
|
|
Batya wrote: | Так исправляй основной пост со скриптом и пользователям не придётся собирать скрипт по кускам. | Скорей, это объясняется предыдущим предложением: Loopback wrote: | Странный получается интерфейс | Т.е., возможно, автор посчитал дополнительное окно лишним или нецелесообразным, поэтому и дополнил кусками. Ну, когда будет окончательный вариант, я могу MIME/UUE прицепить из соображения ёмкости и полноты. |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1534
|
(Separately) Posted: Wed Oct 06, 2010 19:55 Post subject: |
|
|
Flasher wrote: | Чего-то кнопка OK мёртвая. Поправь, пожалуйста. |
В смысле? Неактивная? У меня вроде все работает.
Batya wrote: | Ты же можешь исправлять свои старые посты - кнопка "правка". Так исправляй основной пост со скриптом и пользователям не придётся собирать скрипт по кускам. |
Я знаю, но тогда им придется искать этот пост. Лучше бы, конечно, спойлер. Хотя, пожалуй, можно давать на него ссылку.
Batya wrote: | Что-то я смотрю-смотрю на AutoIt и всё больше хочеться его изучить |
Ну, лишним это уж точно не будет Тем более, что со знанием VBS это несложно.
Flasher wrote: | Т.е., возможно, автор посчитал дополнительное окно лишним или нецелесообразным, поэтому и дополнил кусками. |
В данном случае нет, оно же появляется только при заданных условиях и прочей работе не мешает. |
|
Back to top |
|
 |
Flasher

Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Wed Oct 06, 2010 20:22 Post subject: |
|
|
Loopback wrote: | В смысле? Неактивная? | Именно. Можешь Ctrl+Enter повесить на выполнение замены?
Что там с центрированием?
Loopback wrote: | В данном случае нет, оно же появляется только при заданных условиях и прочей работе не мешает. | Второй причиной мог быть лишний кусок кода. Ну раз сам опроверг, то.. |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1534
|
(Separately) Posted: Wed Oct 06, 2010 20:34 Post subject: |
|
|
Flasher
Вот. Центровка теперь должна работать правильно при любой высоте таскбара. Ctrl+Enter добавил.
В дальнейшем буду править этот пост.
Code: |
;; Параметры:
; 1: %L
; 2: Количество полей поиска, если = 0, открывается диалог выбора количества полей
; 3: Высота одного поля поиска
If $CmdLine[0] < 3 Then
MsgBox (0, "", "Недостаточно параметров, должно быть 3.")
Exit
EndIf
Global $gSrcCount = $CmdLine[2]
Global $gSrcHeight = $CmdLine[3]
Global $gClientHeight = @DesktopHeight - 30
$aTrayPos = WinGetPos("[CLASS:Shell_TrayWnd]")
If Not @error Then $gClientHeight = @DesktopHeight - $aTrayPos[3]
If $gSrcCount = 0 Then
$gBtnCount = 9 ; Количество кнопок
$nGUIWidth = 6 + $gBtnCount * 24 + $gBtnCount * 5
GUICreate("Выбор числа полей для поиска", $nGUIWidth, 34, @DesktopWidth/2 - $nGUIWidth/2, -1)
For $i = 0 To $gBtnCount - 1
GUICtrlCreateButton($i+1, 5 + $i*24 + $i*5, 5, 24, 24)
Next
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
Exit
Case 3 To $gBtnCount + 2
$gSrcCount = $nMsg - 2
If $gClientHeight < $gSrcHeight * $gSrcCount + 140 Then
$gSrcHeight = Int(($gClientHeight - 140) / $gSrcCount)
EndIf
GUIDelete()
ExitLoop
EndSwitch
Wend
EndIf
Global $aList = _TCHLoadFileList($CmdLine[1])
Global $gReplaces = 0, $gMask, $gBackups = False
Global $gSrcEdit[$gSrcCount]
Global Const $GUI_CHECKED = 1
$nGUIHeight = $gSrcHeight * $gSrcCount + 109
$hGUI = GUICreate("Поиск и замена", 563, $nGUIHeight, -1, -1)
GUICtrlCreateLabel("Маска файлов", 8, 6, 78, 17)
$edMask = GUICtrlCreateInput("*.*", 8, 24, 265, 21)
GUICtrlCreateLabel("Текст для поиска", 8, 54, 94, 17)
GUICtrlCreateLabel("Текст для замены", 288, 54, 98, 17)
For $i = 0 To $gSrcCount - 1
$gSrcEdit[$i] = GUICtrlCreateEdit("", 8, 72 + $gSrcHeight * $i, 265, $gSrcHeight)
Next
$edTrg = GUICtrlCreateEdit("", 288, 72, 265, $gSrcHeight * $gSrcCount)
$cbCaseSence = GUICtrlCreateCheckbox("Учитывать регистр", 8, $gSrcHeight * $gSrcCount + 84, 137, 17)
$cbBackups = GUICtrlCreateCheckbox("Создавать резервные копии", 150, $gSrcHeight * $gSrcCount + 84, 170, 17)
$btnOK = GUICtrlCreateButton("OK", 400, $gSrcHeight * $gSrcCount + 79, 75, 25)
$btnCancel = GUICtrlCreateButton("Отмена", 480, $gSrcHeight * $gSrcCount + 79, 75, 25)
Global $AccelTable[1][2] = [["^{ENTER}", $btnOK]]
GUISetAccelerators($AccelTable)
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3, $btnCancel
Exit
Case $btnOK
$gMask = _MaskToRegexp(GUICtrlRead($edMask))
$gBackups = BitAND(GUICtrlRead($cbBackups), $GUI_CHECKED)
For $i = 1 To $aList[0]
If StringRight($aList[$i], 1) = "\" Then
_DoFolder($aList[$i])
Else
_DoFile($aList[$i])
EndIf
Next
MsgBox (0, "", "Выполнено замен: " & $gReplaces, 0, $hGUI)
Exit
EndSwitch
WEnd
Func _DoFolder($sFolder)
If $sFolder = "" Then Return
Local $sDirs = ""
Local $hSearch = FileFindFirstFile($sFolder & "*.*")
If @error Then Return
While 1
$sFile = FileFindNextFile($hSearch)
If @error Then ExitLoop
If @extended Then
$sDirs &= $sFolder & $sFile & "\" & @LF
ContinueLoop
EndIf
_DoFile($sFolder & $sFile)
Wend
FileClose($hSearch)
; Обработку каталогов приходится делать отдельно,
; чтобы не оставлять открытый поисковый хэндл,
; их максимально может быть 64
$aDirs = StringSplit($sDirs, @LF)
For $i = 1 To $aDirs[0]
_DoFolder($aDirs[$i])
Next
EndFunc
Func _DoFile($sFile)
If StringRegExp(StringLower($sFile), $gMask) = 0 Then Return
Local $sText = FileRead($sFile)
Local $sSrc
Local $nReplaces = 0
For $i = 0 To $gSrcCount - 1
$sSrc = GUICtrlRead($gSrcEdit[$i])
If $sSrc = "" Then ContinueLoop
$sText = StringReplace($sText, $sSrc, GUICtrlRead($edTrg), 0, _
BitAND(GUICtrlRead($cbCaseSence), $GUI_CHECKED))
$nReplaces += @extended
Next
If $nReplaces = 0 Then Return
$gReplaces += $nReplaces
If $gBackups Then FileCopy($sFile, $sFile & ".bak", 1) ; бэкап
Local $hFile = FileOpen($sFile, 2)
FileWrite($hFile, $sText)
FileClose($hFile)
EndFunc
Func _MaskToRegexp($sMask)
$sMask = StringRegExpReplace($sMask, "(\\|\.|\+|\^|\(|\)|\[|\]|\{|\}|\$)", "\\\1")
$sMask = StringReplace($sMask, "?", ".")
$sMask = StringReplace($sMask, "*", ".+?")
Return StringLower("(?i)" & $sMask & "$")
EndFunc
Func _TCHLoadFileList($sFileName)
Local $asList[1] = [0]
Local $hfList = FileOpen($sFileName, 0)
While 1
$sLine = FileReadLine($hfList)
If @error Then Exitloop
ReDim $asList[UBound($asList)+1]
$asList[UBound($asList)-1] = $sLine
Wend
FileClose($hfList)
$asList[0] = UBound($asList)-1
Return $asList
EndFunc
|
Last edited by Loopback on Fri Oct 22, 2010 15:53; edited 5 times in total |
|
Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|