shiz пишет:alexii
Спасибо, придумал сам, по-моему ничего такого в нём нет.
Очень лаконичное решение прохода по массиву!
Я когда аналогичное решение делал, то получилось очень громоздко - держал дополнительные признаки для обслуживания такого массива, а так как содержимое массива получается из двух "хронологических последовательностей", то и вывод содержимого массива делал за два раза.
Вот, пример моей функции, которая формирует из последних строк опции выбора для HTA-приложения.
' --- формирование списка протокола - gsFileLogPing'
i_aLOG_max = gi_tSetPC_LogLimitMax - 1
ReDim a_LOG( i_aLOG_max )
If fso.FileExists( gsFileLogPing ) Then
Dim fspi, sLine, i, iCnt, i_aLOG_cyrcle, i_aLOG_last, i_aLOG_prev
Set fspi=fso.OpenTextFile(gsFileLogPing, 1)
iCnt = 0 'общее кол-во считанных с файла строк'
i_aLOG_cyrcle = 0 'признак кругового заполнения массива ga_LOG'
i_aLOG_last = -1 'индекс последнего задействованного элемента ga_LOG'
i_aLOG_prev = -1 'индекс предпоследнего залействованного элемента ga_LOG'
Do While not fspi.AtEndOfStream
sLine = Trim( fspi.ReadLine )
iCnt = iCnt + 1
If iCnt>1 Then i_aLOG_prev = i_aLOG_last
If i_aLOG_last + 1 <= i_aLOG_max Then
i_aLOG_last = i_aLOG_last + 1
else 'закручиваем массив по кругу'
i_aLOG_cyrcle = 1
i_aLOG_last = 0
End If
a_LOG (i_aLOG_last) = sLine
Loop
fspi.Close
Set fspi = Nothing
If iCnt > 0 Then
'формирование таблицы протокола'
sLog = "<SELECT >"
sOpt = ""
For i=i_aLOG_last To 0 Step -1
sLine = Trim( a_LOG (i) )
'Формируем из sLine новую позицию'
sOpt = sOpt & "<OPTION>" & sLine & "</OPTION>"
NEXT
If i_aLOG_cyrcle Then
For i=i_aLOG_max-1 To i_aLOG_last+1 Step -1
sLine = a_LOG (i)
'Формируем из sLine новую позицию'
sOpt = sOpt & "<OPTION>" & sLine & "</OPTION>"
NEXT
End If
sLog = sLog & sOpt & "</SELECT>"
End If 'iCnt > 0'
End IF 'fso.FileExists( gsFileLogPing )
А Ваша идея красивая! Браво. Мне понравилось.
WBR. Roman