Здравствуйте любители AUTOITа. Нужна Ваша помощь. Советы, уточнения, примеры, в общем все что может помочь написать приблизительно такой пример.
Есть многомерный массив.
Хотелось вывести его в ListView и (подобно Excel-я) в нем выделять ячейки, с возможностью редактирования текста, подстановкой данных с ComboBox-а.
Вот написал что-то примерное. Сразу же объясню: при изменении размера колонок, элемент EDIT не корректно отображается и устанавливает соответственную ширину (особенно после редактирования). Отредактированные данные еще не переписываются в ListView.
В общем буду очень рад и благодарен тем кто поможет в этом вопросе.
P.S. Я только учусь. За не правильное мышление не судите
Есть многомерный массив.
Хотелось вывести его в ListView и (подобно Excel-я) в нем выделять ячейки, с возможностью редактирования текста, подстановкой данных с ComboBox-а.
Вот написал что-то примерное. Сразу же объясню: при изменении размера колонок, элемент EDIT не корректно отображается и устанавливает соответственную ширину (особенно после редактирования). Отредактированные данные еще не переписываются в ListView.
В общем буду очень рад и благодарен тем кто поможет в этом вопросе.
P.S. Я только учусь. За не правильное мышление не судите
Код:
#include <GuiConstantsEx.au3>
#include <WinAPI.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <WindowsConstants.au3>
#include <GuiEdit.au3>
#include <GuiComboBox.au3>
#include <array.au3>
Global $hImage, $hEdit, $iLastItemIndex = 0, $iLastSubItemIndex = 0, $ColumnWidth = 100, $aArrColumnWidth[1]
Global $GUI = GUICreate("(UDF Created) ListView Create", 400, 300)
Global $hListView = _GUICtrlListView_Create($GUI, "", 2, 2, 394, 268)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_SUBITEMIMAGES, $LVS_EX_FULLROWSELECT))
; Load images
$hImage = _GUIImageList_Create()
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0xFF0000, 16, 16))
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x00FF00, 16, 16))
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x0000FF, 16, 16))
_GUICtrlListView_SetImageList($hListView, $hImage, 1)
; Add columns
_GUICtrlListView_InsertColumn($hListView, 0, "Column 1", 100)
_GUICtrlListView_InsertColumn($hListView, 1, "Column 2", 150)
_GUICtrlListView_InsertColumn($hListView, 2, "Column 3", 100)
_GUICtrlListView_JustifyColumn($hListView, 1, 2)
; Add items
_GUICtrlListView_AddItem($hListView, "Row 1: Col 1", 0)
_GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 2", 1)
_GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 3", 2)
_GUICtrlListView_AddItem($hListView, "Row 2: Col 1", 1)
_GUICtrlListView_AddSubItem($hListView, 1, "Row 2: Col 2", 1)
_GUICtrlListView_AddItem($hListView, "Row 3: Col 1", 2)
_GUICtrlListView_SetColumnWidth($hListView, 2, -1)
ReDim $aArrColumnWidth[_GUICtrlListView_GetColumnCount($hListView)]
For $i = 0 To _GUICtrlListView_GetColumnCount($hListView) - 1
$aArrColumnWidth[$i] = _GUICtrlListView_GetColumnWidth($hListView, $i)
Next
GUISetState()
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
While 1
Switch GUIGetMsg()
Case -3
Exit
EndSwitch
WEnd
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
Local $hWndFrom, $iCode, $tNMHDR, $iIDFrom
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hListView
Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
Local $iIndex = DllStructGetData($tInfo, "Index")
Local $iSubItem = DllStructGetData($tInfo, "SubItem")
Local $sTextItem = _GUICtrlListView_GetItemText($hListView, $iIndex, $iSubItem)
Switch $iCode
Case $NM_CLICK, $NM_DBLCLK ;
If $iIndex >= 0 And $iSubItem >= 0 Then
$iLastItemIndex = $iIndex
$iLastSubItemIndex = $iSubItem
_GUICtrlEdit_Destroy($hEdit)
_GUICtrlListView_SetItemSelected($hListView, $iIndex, False, True)
_GUICtrlListView_SetItemFocused($hListView, $iIndex, False)
_GUICtrlListView_BeginUpdate($hListView)
Local $aRect = _GUICtrlListView_GetSubItemRect($hListView, $iIndex, $iSubItem)
$hEdit = _GUICtrlEdit_Create($hListView, $sTextItem, $aRect[0], $aRect[1], _GUICtrlListView_GetColumnWidth($hListView, $iSubItem), $aRect[3] - $aRect[1], $ES_LEFT)
_GUICtrlListView_EndUpdate($hListView)
_GUICtrlListView_RedrawItems($hListView, $iIndex, $iIndex)
EndIf
Case -12
If $iSubItem >= 0 Then
For $i = 0 To _GUICtrlListView_GetColumnCount($hListView) - 1
If $aArrColumnWidth[$i] <> _GUICtrlListView_GetColumnWidth($hListView, $i) Then
$aArrColumnWidth[$i] = _GUICtrlListView_GetColumnWidth($hListView, $i)
_GUICtrlListView_BeginUpdate($hListView)
$sTmp_Text = _GUICtrlEdit_GetText($hEdit)
_GUICtrlEdit_Destroy($hEdit)
$aRect = _GUICtrlListView_GetSubItemRect($hListView, $iLastItemIndex, $iLastSubItemIndex)
$hEdit = _GUICtrlEdit_Create($hListView, $sTmp_Text, $aRect[0], $aRect[1], _GUICtrlListView_GetColumnWidth($hListView, $iLastItemIndex), $aRect[3] - $aRect[1], $ES_LEFT)
_GUICtrlListView_EndUpdate($hListView)
_GUICtrlListView_RedrawItems($hListView, $iLastItemIndex, $iLastItemIndex)
EndIf
Next
EndIf
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY