Advertisement
AZJIO

Формула

Jan 14th, 2014
705
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 18.92 KB | None | 0 0
  1. ; Пример конфига, сохранить в ini и открыть программу
  2. ; [Set]
  3. ; Max=5
  4. ; 1="U, В  220         Напряжение"
  5. ; 2="I, А  4.3         Ток"
  6. ; 3="P, Вт        $1 * $2     P=U*I, Мощность"
  7. ; 4="R, Ом        $1 / $2 2   R=U/I, Сопротивление"
  8. $sPath = @ScriptDir & '\Sample.ini'
  9. If Not FileExists($sPath) Then
  10. $sText= _
  11. '[Set]' & @CRLF & _
  12. 'Max=5' & @CRLF & _
  13. '1="U, В   220         Напряжение"' & @CRLF & _
  14. '2="I, А   4.3         Ток"' & @CRLF & _
  15. '3="P, Вт     $1 * $2     P=U*I, Мощность"' & @CRLF & _
  16. '4="R, Ом     $1 / $2 2   R=U/I, Сопротивление"'
  17.  
  18.     $hFile = FileOpen($sPath, 2)
  19.     FileWrite($hFile, $sText)
  20.     FileClose($hFile)
  21. EndIf
  22.  
  23. #include <EditConstants.au3>
  24. #include <GUIConstantsEx.au3>
  25. #include <WindowsConstants.au3>
  26. #include <GuiListView.au3>
  27. #include <GuiImageList.au3>
  28. #include <Array.au3>
  29.  
  30. Opt("GUIOnEventMode", 1)
  31. $sep = @Tab
  32. ; Opt('GUIDataSeparatorChar', $sep)
  33. $TrAuWh = 0
  34. Global $aElement[2], $hActive, $iInput
  35. Global $iListView, $hListView, $dummy1, $dummy2
  36. Global $iMaxILV = 0
  37.  
  38. $hGUI = GUICreate('Формула', 530, 390, -1, -1, $WS_OVERLAPPEDWINDOW + $WS_POPUP)
  39. GUISetOnEvent(-3, '_Exit')
  40. $iInput = GUICtrlCreateInput("", 0, 0, 0, 0)
  41. GUICtrlSetState(-1, $GUI_HIDE)
  42. $iListView = GUICtrlCreateListView('№|Имя параметра|Число|Формула|Округление|Описание', 5, 5, 520, 330, BitOR($GUI_SS_DEFAULT_LISTVIEW, $LVS_REPORT, $LVS_SHOWSELALWAYS))
  43. GUICtrlSetResizing(-1, 2 + 4 + 32 + 64)
  44. $hListView = GUICtrlGetHandle(-1)
  45. ; _GUICtrlListView_SetExtendedListViewStyle ($hListView, $LVS_EX_CHECKBOXES)
  46. ; _GUICtrlListView_SetExtendedListViewStyle ($hListView, $LVS_EX_GRIDLINES)
  47. ; Загружает изображения
  48. $hImage = _GUIImageList_Create()
  49. _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x00FF00, 16, 16)) ; Зелёный
  50. _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0xFFFF00, 16, 16)) ; Жёлтый
  51. _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0xFF0000, 16, 16)) ; Красный
  52. _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0xDDDD00, 16, 16)) ; Тёмно жёлтый
  53. _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0xF0F0F0, 16, 16)) ; Белый
  54. _GUICtrlListView_SetImageList($hListView, $hImage, 1)
  55.  
  56. ; _GUICtrlListView_SetSelectedColumn($iListView, 1)
  57. ; Local $odd = False
  58. ; For $i = 1 To $iMaxILV
  59. ; $item1 = ''
  60. ; $item2 = '0'
  61. ; $cItem = GUICtrlCreateListViewItem($i & '|' & $item1 & '|' & $item2, $iListView) ; создаём пункты
  62. ; If $odd Then GUICtrlSetBkColor($cItem, 0xEEEEEE)
  63. ; $odd = Not $odd
  64. ; Next
  65.  
  66. ; For $i = 1 To $iMaxILV
  67. ; $item1 = 'Парам ' & $i
  68. ; $item2 = '0'
  69. ; _GUICtrlListView_AddItem($hListView, $i, 0)
  70. ; _GUICtrlListView_AddSubItem($hListView, $i-1, $item1, 1)
  71. ; _GUICtrlListView_AddSubItem($hListView, $i-1, $item2, 2)
  72. ; Next
  73.  
  74. ; Выравнивание колонок по ширине
  75. If $TrAuWh Then
  76.     For $i = 0 To 5
  77.         _GUICtrlListView_SetColumnWidth($hListView, $i, -2) ;$LVSCW_AUTOSIZE_USEHEADER
  78.     Next
  79. EndIf
  80.  
  81. GUICtrlCreateButton('Новый', 210, 340, 70, 28)
  82. GUICtrlSetOnEvent(-1, "_New")
  83. GUICtrlSetResizing(-1, 4 + 64 + 256 + 512)
  84.  
  85. GUICtrlCreateButton('Открыть', 290, 340, 70, 28)
  86. GUICtrlSetOnEvent(-1, "_Open")
  87. GUICtrlSetResizing(-1, 4 + 64 + 256 + 512)
  88.  
  89. GUICtrlCreateButton('Сохранить', 370, 340, 70, 28)
  90. GUICtrlSetOnEvent(-1, "_Save")
  91. GUICtrlSetResizing(-1, 4 + 64 + 256 + 512)
  92.  
  93. GUICtrlCreateButton('Вычислить', 450, 340, 70, 28)
  94. GUICtrlSetOnEvent(-1, "_Execute")
  95. GUICtrlSetResizing(-1, 4 + 64 + 256 + 512)
  96.  
  97. $iStatusBar = GUICtrlCreateLabel('Строка состояния', 3, 390 - 20, 520, 17)
  98. GUICtrlSetResizing(-1, 2 + 4 + 64 + 512)
  99.  
  100. ; Устанавливает выравнивание по правому краю для колонок 0 и 2 (числа)
  101. Local $tColumn = DllStructCreate("uint Mask;int Fmt;int CX;ptr Text;int TextMax;int SubItem;int Image;int Order;int cxMin;int cxDefault;int cxIdeal")
  102. DllStructSetData($tColumn, "Mask", 0x01)
  103. DllStructSetData($tColumn, "Fmt", 1) ; Left = 0; Right = 1; Center = 2
  104. Local $pColumn = DllStructGetPtr($tColumn)
  105. GUICtrlSendMsg($iListView, 0x1000 + 96, 0, $pColumn)
  106. GUICtrlSendMsg($iListView, 0x1000 + 96, 2, $pColumn)
  107.  
  108. $dummy1 = GUICtrlCreateDummy()
  109. GUICtrlSetOnEvent(-1, "_Exit")
  110. $dummy2 = GUICtrlCreateDummy()
  111. GUICtrlSetOnEvent(-1, "_SaveChange")
  112. Global $AccelKeys[2][2] = [["{ESC}", $dummy1],["{ENTER}", $dummy2]]
  113. GUISetAccelerators($AccelKeys)
  114. GUISetState()
  115. GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")
  116. GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") ; для скрытия поля ввода при потере фокуса.
  117.  
  118. While 1
  119.     Sleep(100000)
  120. WEnd
  121.  
  122. Func _New()
  123.     ; Local $sErr
  124.     Do
  125.         $sNum = InputBox("Новый", "Укажите число ячеек", "10", " M4", -1, -1)
  126.         If @error Then Return
  127.         $ifValidate = True
  128.         If Not StringIsDigit($sNum) Or $sNum == '0' Then $ifValidate = False
  129.     Until $ifValidate
  130.     $sNum = Number($sNum)
  131.     ; If Not _GUICtrlListView_GetItemCount($hListView) And MsgBox(4, 'Сообщение', 'На основе текущего?') = 7 Then
  132.     If _GUICtrlListView_GetItemCount($hListView) And MsgBox(4, 'Сообщение', 'На основе текущего?') = 6 Then
  133.         ; MsgBox(0, 'Отладчик - ' & @ScriptLineNumber  & '-' & @error & '-' & @extended, '$sNum = ' & $sNum & @CRLF & _
  134.         ; '$iMaxILV = ' & $iMaxILV)
  135.         If $sNum > $iMaxILV Then
  136.            
  137.             For $i = $iMaxILV + 1 To $sNum
  138.                 ; Добавляет пункты
  139.                 _GUICtrlListView_AddItem($hListView, $i, 4) ; Добавляем индексы
  140.             Next
  141.  
  142.             ; Выравнивание колонок по ширине
  143.             If $TrAuWh Then
  144.                 For $i = 0 To 5
  145.                     _GUICtrlListView_SetColumnWidth($hListView, $i, -1) ;$LVSCW_AUTOSIZE
  146.                     _GUICtrlListView_SetColumnWidth($hListView, $i, -2) ;$LVSCW_AUTOSIZE_USEHEADER
  147.                 Next
  148.             EndIf
  149.         ElseIf $sNum < $iMaxILV Then
  150.             For $i = $iMaxILV - 1 To $sNum Step -1 ; Удаляем лишние пункты
  151.                 _GUICtrlListView_DeleteItem($hListView, $i)
  152.             Next
  153.         EndIf
  154.         $iMaxILV = $sNum
  155.     Else
  156.         _GUICtrlListView_DeleteAllItems($hListView) ; Удаляем все пункты
  157.  
  158.         $iMaxILV = $sNum
  159.         For $i = 1 To $iMaxILV
  160.             ; Добавляет пункты
  161.             _GUICtrlListView_AddItem($hListView, $i, 4)
  162.         Next
  163.  
  164.         ; Выравнивание колонок по ширине
  165.         If $TrAuWh Then
  166.             For $i = 0 To 5
  167.                 _GUICtrlListView_SetColumnWidth($hListView, $i, -1) ;$LVSCW_AUTOSIZE
  168.                 _GUICtrlListView_SetColumnWidth($hListView, $i, -2) ;$LVSCW_AUTOSIZE_USEHEADER
  169.             Next
  170.         EndIf
  171.     EndIf
  172. EndFunc   ;==>_New
  173.  
  174. Func _Open()
  175.     $Ini = FileOpenDialog('Открыть', @ScriptDir, 'Формула (*.ini)', '', '', $hGUI)
  176.     If @error Then Return
  177.     If StringRight($Ini, 4) <> '.ini' Then $Ini &= '.ini'
  178.     $aSection = IniReadSectionNames($Ini)
  179.     If @error Then Return
  180.     ; If $aSection > 1 Then
  181.     $asKeyVal = IniReadSection($Ini, "Set")
  182.     Local $iMax = Number(IniRead($Ini, "Set", "Max", "0"))
  183.     If $iMax < 1 Then Return
  184.     Local $aMain[$iMax + 1][6] = [[$iMax]] ; Создаём вставочный массив
  185.     For $i = 1 To $asKeyVal[0][0]
  186.         If StringIsDigit($asKeyVal[$i][0]) Then
  187.             $idx = Number($asKeyVal[$i][0])
  188.             If $idx <= $iMax Then
  189.                 $asKeyVal[$i][1]=StringRegExpReplace($asKeyVal[$i][1], '^"(.+)"$', '\1') ; Так как используется пробел в качестве разделителя
  190.                 $aValue = StringSplit($asKeyVal[$i][1], $sep)
  191.                 If $aValue[0] > 6 Then $aValue[0] = 6
  192.                 For $j = 1 To $aValue[0]
  193.                     $aMain[$idx][$j] = $aValue[$j]
  194.                 Next
  195.             EndIf
  196.         EndIf
  197.     Next
  198.     _ImportArr($aMain)
  199.     $iMaxILV = $iMax
  200. EndFunc   ;==>_Open
  201.  
  202. Func _Save()
  203.     $Ini = FileSaveDialog('Сохранить как ...', @ScriptDir, 'Формула (*.ini)', 24, 'conf', $hGUI)
  204.     If @error Then Return
  205.     If StringRight($Ini, 4) <> '.ini' Then $Ini &= '.ini'
  206.     ; Получить пункты ListView
  207.     Local $aMain = _GUICtrlListView_GetAllTextArray($hListView)
  208.     If @error Then Return MsgBox(0, 'Сообщение', 'Ошибка')
  209.     ; GUICtrlSetData($iStatusBar, '...')
  210.     $sep4 = $sep & $sep & $sep & $sep
  211.     $str = 'Max=' & $aMain[0][0]
  212.     For $i = 1 To $aMain[0][0]
  213.         $tmp = $aMain[$i][1] & $sep & $aMain[$i][2] & $sep & $aMain[$i][3] & $sep & $aMain[$i][4] & $sep & $aMain[$i][5]
  214.         If $tmp <> $sep4 Then $str &= @LF & $i & '="' & $tmp & '"'
  215.     Next
  216.     $str = StringRegExpReplace($str, '\t+(?=\v)', '') ; Удаляем завершающие разделители
  217.     IniWriteSection($Ini, "Set", $str)
  218. EndFunc   ;==>_Save
  219.  
  220. Func _ImportArr($aMain)
  221.     Local $ind
  222.     _GUICtrlListView_DeleteAllItems($hListView) ; Удаляем все пункты
  223.     For $i = 1 To $aMain[0][0]
  224.         $ind = 4
  225.         If $aMain[$i][2] Then $ind = 0
  226.         If $aMain[$i][3] Then $ind = 1
  227.         ; Добавляет пункты
  228.         _GUICtrlListView_AddItem($hListView, $i, $ind) ; Добавляем индексы
  229.         For $j = 1 To 5
  230.             If $aMain[$i][$j] Then _GUICtrlListView_AddSubItem($hListView, $i - 1, $aMain[$i][$j], $j) ; Добавляем подпункты если они чему то равны
  231.         Next
  232.     Next
  233.  
  234.     ; Выравнивание колонок по ширине
  235.     If $TrAuWh Then
  236.         For $i = 0 To 5
  237.             _GUICtrlListView_SetColumnWidth($hListView, $i, -1) ;$LVSCW_AUTOSIZE
  238.             _GUICtrlListView_SetColumnWidth($hListView, $i, -2) ;$LVSCW_AUTOSIZE_USEHEADER
  239.         Next
  240.     EndIf
  241. EndFunc   ;==>_ImportArr
  242.  
  243. Func _Execute()
  244.     Local $aMain = _GUICtrlListView_GetAllTextArray($hListView)
  245.     If @error Then Return MsgBox(0, 'Сообщение', 'Ошибка')
  246.     Local $timer = TimerInit()
  247.     GUICtrlSetData($iStatusBar, '...')
  248.     Local $aMainCopy = $aMain ; Делаем копию, чтобы сравнить изменение в колонке 3 (число, результат)
  249.     ; _ArrayDisplay($aMain)
  250.     $iMaxILV = $aMain[0][0]
  251.     For $i = 1 To $aMain[0][0]
  252.         ; If $aMain[$i][3] And StringInStr($aMain[$i][3], '$') Then
  253.         If $aMain[$i][3] Then ; Если формула существует, то вычисляем её
  254.             ; If StringInStr($aMain[$i][3], '$') Then ; Если формула содержит переменные, то заменяем их на реальные числа.
  255.             $aVar = StringRegExp($aMain[$i][3], '\$([1-9]\d*)', 3) ; Извлекаем массив переменных, чтобы проверить их существование
  256.             If Not @error Then
  257.                 ; _ArrayDisplay($aVar)
  258.                 _VarValidate($aVar)
  259.                 If @error Then
  260.                     _GUICtrlListView_SetItemImage($hListView, $i - 1, 2) ; Если валидация массива не успешна, то пока вылет, а потом может вывод красной метки
  261.                     GUICtrlSetData($iStatusBar, 'Ошибка превышения индекса ячейки')
  262.                     Return
  263.                 EndIf
  264.                 For $j = 0 To UBound($aVar) - 1
  265.                     $aMain[$i][3] = StringReplace($aMain[$i][3], '$' & $aVar[$j], $aMain[$aVar[$j]][2])
  266.                     ; MsgBox(0, 'Сообщение',  '$' & $aVar[$j] & @LF & $aMain[$aVar[$j]][2])
  267.                 Next
  268.             EndIf
  269.             $aMain[$i][2] = _Execute2($aMain[$i][3])
  270.             If @error Then
  271.                 _GUICtrlListView_SetItemImage($hListView, $i - 1, 2) ; Если вычисление не успешно, то пока вылет, а потом может вывод красной метки
  272.                 GUICtrlSetData($iStatusBar, 'Ошибка вычисления')
  273.                 Return
  274.             EndIf
  275.             _GUICtrlListView_SetItemImage($hListView, $i - 1, 3)
  276.         If $aMain[$i][4] Then $aMain[$i][2] = Round($aMain[$i][2], $aMain[$i][4])
  277.         EndIf
  278.     Next
  279.     ; _ArrayDisplay($aMain)
  280.     For $i = 1 To $aMain[0][0]
  281.         If Not ($aMainCopy[$i][2] == $aMain[$i][2]) Then
  282. ; MsgBox(0, VarGetType(Number($aMainCopy[$i][2])) & '-' & VarGetType($aMain[$i][2]), $aMainCopy[$i][2] & @LF & $aMain[$i][2])
  283.             _GUICtrlListView_SetItemText($hListView, $i - 1, $aMain[$i][2], 2)
  284.             _GUICtrlListView_SetItemImage($hListView, $i - 1, 1)
  285.         EndIf
  286.     Next
  287.     GUICtrlSetData($iStatusBar, 'Готово! (за ' & Round(TimerDiff($timer) / 1000, 2) & ' сек)')
  288. EndFunc   ;==>_Execute
  289.  
  290. Func _Execute2($i) ; Отдельная функция чтобы уменьшить конфликт с локальными переменными и самим выражением
  291.     $i = Execute($i)
  292.     If @error Then Return SetError(1)
  293.     Return $i
  294. EndFunc   ;==>_Execute2
  295.  
  296. Func _VarValidate(ByRef $aVar)
  297.     _ArrayRemoveDuplicates($aVar) ; Удаляем дубликаты
  298.     For $i = 0 To UBound($aVar) - 1 ; Если число больше чем максимальное количество ячеек
  299.         $aVar[$i] = Number($aVar[$i])
  300.         If $aVar[$i] > $iMaxILV Then Return SetError(1, 0, 0)
  301.     Next
  302.     _ArraySort($aVar, 1) ; Сортировка, чтобы начинать замену с больших чисел
  303. EndFunc   ;==>_VarValidate
  304.  
  305. Func _ArrayRemoveDuplicates(Const ByRef $aArray)
  306.     If Not IsArray($aArray) Then Return SetError(1, 0, 0)
  307.     Local $oDict = ObjCreate("Scripting.Dictionary")
  308.     $oDict.CompareMode = 0 ; учитывать регистр букв, бинарное сравнение
  309.     For $i In $aArray
  310.         $oDict.Item($i) ; shown by wraithdu
  311.     Next
  312.     Return $oDict.Keys()
  313. EndFunc   ;==>_ArrayRemoveDuplicates
  314.  
  315. ; Выводит элемент Input на передний план
  316. Func _GUICtrlListView_EditItem($hWnd, $iIndex, $iSubItem)
  317.     ;funkey 19.02.2010
  318.     If $iIndex < 0 Then Return
  319.     Local $aPos, $aRect, $iSum = 0
  320.     Local $x, $y, $w, $h
  321.     For $i = 0 To $iSubItem - 1
  322.         $iSum += _GUICtrlListView_GetColumnWidth($hWnd, $i)
  323.     Next
  324.     $aRect = _GUICtrlListView_GetItemRect($hWnd, $iIndex)
  325.     $aPos = ControlGetPos($hGUI, "", $hWnd)
  326.     $x = $iSum + $aPos[0] + $aRect[0]
  327.     $y = $aPos[1] + $aRect[1]
  328.     $w = _GUICtrlListView_GetColumnWidth($hWnd, $iSubItem)
  329.     $h = $aRect[3] - $aRect[1]
  330.     GUICtrlSetPos($iInput, $x - 1, $y + 1, $w + 1, $h + 1)
  331.     GUICtrlSetData($iInput, _GUICtrlListView_GetItemText($hWnd, $iIndex, $iSubItem))
  332.     GUICtrlSetState($iInput, $GUI_SHOW)
  333.     GUICtrlSetState($iInput, $GUI_FOCUS)
  334.     $aElement[0] = $iIndex
  335.     $aElement[1] = $iSubItem
  336. EndFunc   ;==>_GUICtrlListView_EditItem
  337.  
  338. ; Сохранить изменения редактирования пункта
  339. Func _SaveChange()
  340.     Local $sText = GUICtrlRead($iInput)
  341.     If StringInStr($sText, @CR) Or StringInStr($sText, @LF) Then
  342.         If StringLeft($sText, 1) <> '"' And StringInStr(StringMid($sText, 2, StringLen($sText) - 2), '"') Then $sText = StringReplace($sText, '"', "'")
  343.         $sText = '"' & StringReplace($sText, '"', '') & '"'
  344.     EndIf
  345.     _GUICtrlListView_BeginUpdate($hActive)
  346.     _GUICtrlListView_SetItemText($hActive, $aElement[0], $sText, $aElement[1])
  347.     GUICtrlSetState($iInput, $GUI_HIDE)
  348.     If $TrAuWh Then _GUICtrlListView_SetColumnWidth($hListView, $aElement[1], -2) ;$LVSCW_AUTOSIZE_USEHEADER
  349.     _GUICtrlListView_EndUpdate($hActive)
  350.     Return $sText ; возвращаем текст, если требуется его использовать после применения
  351. EndFunc   ;==>_SaveChange
  352.  
  353. Func _WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
  354.     Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR
  355.     $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
  356.     $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
  357.     $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
  358.     $iCode = DllStructGetData($tNMHDR, "Code")
  359.     Switch $hWndFrom
  360.         Case $hListView
  361.             Switch $iCode
  362.                 Case $NM_DBLCLK ; двойной клик - редактируем пункт ListView
  363.                     Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
  364.                     _GUICtrlListView_EditItem($hListView, DllStructGetData($tInfo, "Index"), DllStructGetData($tInfo, "SubItem"))
  365.                     $hActive = $hListView
  366.             EndSwitch
  367.     EndSwitch
  368.     Return $GUI_RUNDEFMSG
  369. EndFunc   ;==>_WM_NOTIFY
  370.  
  371. Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
  372.     #forceref $hWnd, $iMsg
  373.     Local $iIDFrom, $iCode
  374.     $iIDFrom = BitAND($iwParam, 0xFFFF) ; младшее слово
  375.     $iCode = BitShift($iwParam, 16) ; старшее слово
  376.     Switch $iIDFrom
  377.         Case $iInput
  378.             Switch $iCode
  379.                 Case $EN_KILLFOCUS
  380.                     GUICtrlSetState($iInput, $GUI_HIDE)
  381.             EndSwitch
  382.     EndSwitch
  383.     Return $GUI_RUNDEFMSG
  384. EndFunc   ;==>WM_COMMAND
  385.  
  386. Func _Exit()
  387.     Exit
  388. EndFunc   ;==>_Exit
  389.  
  390. #cs
  391.     $h_ListView - Дескриптор ListView
  392.     $i_ItemStart - Пункт от которого начинать считывание
  393.     $i_ItemEnd - Пункт в котором закончить считывание (-1 означает до конца)
  394.     $s_RowString = '0|2|5' - формат колонок если тредуется задать конкретные
  395.     $s_Separator - разделитель по умолчанию для $s_RowString
  396.     Последняя модификации:
  397.     1. Только для внутреннего окна, принадлежащего текущему процессу.
  398.     2. Только в юникоде. Не переключайте ListView в ANSI
  399. #ce
  400. Func _GUICtrlListView_GetAllTextArray($h_ListView, $i_ItemStart = 0, $i_ItemEnd = -1, $s_RowString = -1, $s_Separator = '|')
  401.     Local $i_CountItem, $i_CountRow, $a_Row, $t_Buffer, $t_Item, $p_Item, $a_Return[1], $i_Item, $t_MemMap, _
  402.             $p_Memory, $p_Text
  403.  
  404.     If Not IsHWnd($h_ListView) Then Return SetError(-1, 0, 0)
  405.  
  406.     $i_CountRow = _GUICtrlListView_GetColumnCount($h_ListView)
  407.     $i_CountItem = _GUICtrlListView_GetItemCount($h_ListView)
  408.     If $i_CountItem = 0 Then Return SetError(-1, 0, 0)
  409.  
  410.     If $i_ItemEnd = -1 Or $i_ItemEnd = Default Then
  411.         $i_ItemEnd = $i_CountItem - 1
  412.     Else
  413.         $i_ItemEnd = Abs(Int($i_ItemEnd))
  414.         If $i_ItemEnd > $i_CountItem - 1 Then $i_ItemEnd = $i_CountItem - 1
  415.     EndIf
  416.     $i_ItemStart = Abs(Int($i_ItemStart))
  417.     If $i_ItemStart > $i_CountItem - 1 Then $i_ItemStart = 0
  418.     If $i_ItemEnd <= $i_ItemStart Then $i_ItemEnd = $i_ItemStart + 1
  419.  
  420.     If $s_RowString = -1 Or $s_RowString = Default Then
  421.         $s_RowString = ''
  422.         For $i = 0 To $i_CountRow - 1
  423.             $s_RowString &= $i & $s_Separator
  424.         Next
  425.     EndIf
  426.     $s_RowString = StringRegExpReplace($s_RowString, '^[^\d]+|[^\d]+$', '')
  427.     $s_RowString = StringRegExpReplace($s_RowString, '[^\d]', $s_Separator)
  428.     $s_RowString = StringRegExpReplace($s_RowString, '\Q' & $s_Separator & '\E{2,}', $s_Separator)
  429.  
  430.     $a_Row = StringSplit($s_RowString, $s_Separator)
  431.     For $i = 1 To $a_Row[0]
  432.         $a_Row[$i] = Int($a_Row[$i])
  433.         If $a_Row[$i] > $i_CountRow - 1 Then Return SetError(-1, 0, 0)
  434.     Next
  435.     $a_Row = _ArrayUnique($a_Row, 1, 1)
  436.     _ArraySort($a_Row, 0, 1)
  437.  
  438.     $t_Buffer = DllStructCreate('wchar Text[4096]')
  439.     $t_Item = DllStructCreate($tagLVITEM)
  440.     $p_Item = DllStructGetPtr($t_Item)
  441.     DllStructSetData($t_Item, 'TextMax', 4096)
  442.  
  443.     DllStructSetData($t_Item, 'Text', DllStructGetPtr($t_Buffer))
  444.  
  445.     ReDim $a_Return[$i_CountItem + 1][$a_Row[0]]
  446.  
  447.     For $i = $i_ItemStart To $i_ItemEnd
  448.         $a_Return[0][0] += 1
  449.         For $j = 1 To $a_Row[0]
  450.             DllStructSetData($t_Item, 'SubItem', $a_Row[$j])
  451.             _SendMessage($h_ListView, $LVM_GETITEMTEXTW, $i, $p_Item, 0, 'wparam', 'ptr')
  452.             $a_Return[$a_Return[0][0]][$j - 1] = DllStructGetData($t_Buffer, 'Text')
  453.         Next
  454.     Next
  455.  
  456.     ReDim $a_Return[$a_Return[0][0] + 1][$a_Row[0]]
  457.     Return $a_Return
  458. EndFunc   ;==>_GUICtrlListView_GetAllTextArray
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement