Привет. Собственно, вопрос в названии.
Имеем код (взят с рабочего скрипта):
Видно, что в обоих случаях две одинаковые длинные обработки, меняются только строки до и после этих обработок. Вот и вопрос - как эти строки прописать раз, и потом к ним обращаться? Только вынос в отдельную функцию? Или есть другой алгоритм? Функция же должна что то вернуть, нельзя просто кинуть в нее десяток левых строк
Имеем код (взят с рабочего скрипта):
Код:
Switch $VisibleAppCheck
Case 0 To 1
If MsgBox (4132, 'Вопрос системы', 'Выключить комп после завершения закачки выбранных программ?') = 6 Then _pitanie()
GUICtrlSetState ($Label4, $GUI_SHOW)
For $i=1 To $cntnmb3[0]
GUICtrlSetData ($Label4, 'Получение ссылок... '&$i&' из '&$cntnmb3[0])
$Pr = _GUICtrlListView_GetItemText($hFilelist2, $cntnmb3[$i]-1, 1) ;; название программы (как отображается в списке)
$id = _ArraySearch($aAppsCh, $Pr, 0, 0, 0, 1, 1, 1)
$sAppsCh = StringSplit($aAppsCh[$id][1], '|')
$Pr = $sAppsCh[3];; название программы (как отображается на сайте)
If $Pr = 'Machete' Then
$PrVUpd = StringRegExpReplace(_GUICtrlListView_GetItemText($hFilelist2, $cntnmb3[$i]-1, 3), '(\d\.)(\d)(\.)(\d+)', '\1\2 Build \4')
Else
$PrVUpd = _GUICtrlListView_GetItemText($hFilelist2, $cntnmb3[$i]-1, 3) ;; версия программы на сайте
EndIf
$PrV = _GUICtrlListView_GetItemText($hFilelist2, $cntnmb3[$i]-1, 2) ;; версия программы
$Source = _InetGetSource ($acnturl[$i], True)
$Source = _Encoding_CyrillicTo1251($Source)
If StringInStr ($Source, 'uploadrar.com') Then
$Fshare=StringRegExp($Source,'(?si)entry-content(.+?)entry-footer', 1) ;; границы поиска ссылки
$Fshare = _ArrayToString($Fshare)
$Fshare = StringRegExpReplace($Fshare,'(?is).+('&$Pr&'.+'&$PrVUpd&'.+(?:Зеркало|Uploadrar)\<\/a\>).+','\1') ;; кусок кода с программой и ссылкой
$Fshare = StringRegExpReplace($Fshare,'(?is).+href=\h*"(.+?)".+','\1') ;; непосредственно ссылка на файлообменник
$oIE = _IECreate($Fshare,0,0)
$aLink = _IEGetObjByName($oIE, 'method_free')
$aLink.Click()
_IELoadWait($oIE, 1000, 5000)
Sleep(15000)
$oLink = _IEGetObjById($oIE, 'downloadbtn')
$oLink.Click()
_IELoadWait($oIE, 1000, 5000)
$oDirect_Link = _IEGetObjById($oIE, 'direct_link')
$sDirect_Link = $oDirect_Link.ChildNodes.Item(0).href
$sFinLink &= $sDirect_Link&'|'
$sFinName &= $cnttxt[$i]&'|'
_IEQuit($oIE)
Else
ContinueLoop
EndIf
Next
GUISetState (@SW_MINIMIZE, $Form8)
$aFinLink = StringSplit(StringTrimRight($sFinLink, 1), '|')
$aFinName = StringSplit(StringTrimRight($sFinName, 1), '|')
For $i=1 To $aFinLink[0]
$PrVUpd = _GUICtrlListView_GetItemText($hFilelist2, $cntnmb3[$i]-1, 3) ;; версия программы на сайте
$PrV = _GUICtrlListView_GetItemText($hFilelist2, $cntnmb3[$i]-1, 2) ;; версия программы
ProgressOn('Скачивание файла', $aFinName[$i], '0 %', -1, -1, 16)
$hDownload = InetGet($aFinLink[$i], $sPathApps&'\'&StringRegExpReplace($aFinLink[$i],'(^.*)\/(.*)$','\2'), 3, 1)
Do
If InetGetInfo($hDownload, 1) Then
$iPersent = Round((InetGetInfo($hDownload, 0) / InetGetInfo($hDownload, 1)) * 100)
ProgressSet($iPersent, $PrV&' --> ' &$PrVUpd&@CRLF&$iPersent & ' %, ' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownload, 0)) & ' (' & _WinAPI_StrFormatByteSize(InetGetInfo($hDownload, 1)) & ')')
EndIf
Sleep(500)
Until InetGetInfo($hDownload, 2)
InetClose($hDownload)
ProgressOff()
Sleep(5000)
Next
If $DelOldVers = '1' Then _deldub_arch()
Case 3
If MsgBox (4132, 'Вопрос системы', 'Выключить комп после завершения закачки и установки выбранных программ?') = 6 Then _pitanie()
GUISetState (@SW_HIDE, $Form8)
Opt("TrayMenuMode", 1 + 2)
TraySetState(4)
TraySetIcon($Icons, 14)
TraySetToolTip ("")
TraySetToolTip ("Получение ссылок на программы... ")
For $i=1 To $cntnmb3[0]
$Pr = _GUICtrlListView_GetItemText($hFilelist2, $cntnmb3[$i]-1, 1) ;; название программы (как отображается в списке)
$id = _ArraySearch($aAppsCh, $Pr, 0, 0, 0, 1, 1, 1)
$sAppsCh = StringSplit($aAppsCh[$id][1], '|')
$Pr = $sAppsCh[3];; название программы (как отображается на сайте)
If $Pr = 'Machete' Then
$PrVUpd = StringRegExpReplace(_GUICtrlListView_GetItemText($hFilelist2, $cntnmb3[$i]-1, 3), '(\d\.)(\d)(\.)(\d+)', '\1\2 Build \4')
Else
$PrVUpd = _GUICtrlListView_GetItemText($hFilelist2, $cntnmb3[$i]-1, 3) ;; версия программы на сайте
EndIf
$PrV = _GUICtrlListView_GetItemText($hFilelist2, $cntnmb3[$i]-1, 2) ;; версия программы
$Source = _InetGetSource ($acnturl[$i], True)
$Source = _Encoding_CyrillicTo1251($Source)
If StringInStr ($Source, 'uploadrar.com') Then
$Fshare=StringRegExp($Source,'(?si)entry-content(.+?)entry-footer', 1) ;; границы поиска ссылки
$Fshare = _ArrayToString($Fshare)
$Fshare = StringRegExpReplace($Fshare,'(?is).+('&$Pr&'.+'&$PrVUpd&'.+(?:Зеркало|Uploadrar)\<\/a\>).+','\1') ;; кусок кода с программой и ссылкой
$Fshare = StringRegExpReplace($Fshare,'(?is).+href=\h*"(.+?)".+','\1') ;; непосредственно ссылка на файлообменник
$oIE = _IECreate($Fshare,0,0)
$aLink = _IEGetObjByName($oIE, 'method_free')
$aLink.Click()
_IELoadWait($oIE, 1000, 5000)
Sleep(15000)
$oLink = _IEGetObjById($oIE, 'downloadbtn')
$oLink.Click()
_IELoadWait($oIE, 1000, 5000)
$oDirect_Link = _IEGetObjById($oIE, 'direct_link')
$sDirect_Link = $oDirect_Link.ChildNodes.Item(0).href
$sFinLink &= $sDirect_Link&'|'
$sFinName &= $cnttxt[$i]&'|'
_IEQuit($oIE)
Else
ContinueLoop
EndIf
Next
Видно, что в обоих случаях две одинаковые длинные обработки, меняются только строки до и после этих обработок. Вот и вопрос - как эти строки прописать раз, и потом к ним обращаться? Только вынос в отдельную функцию? Или есть другой алгоритм? Функция же должна что то вернуть, нельзя просто кинуть в нее десяток левых строк