Что нового

[Элементы GUI] GUICtrlCreateListViewItem редактировать второй столбец

GUIMish

Знающий
Сообщения
122
Репутация
12
Здравствуйте, я бы хотел редактировать второй столбец, а первый заморожен. а то у меня редактируется только первый.
Код:
$Window = GUICreate("Окно", 200, 250, -1, -1)

$View = GUICtrlCreateListView("Значение|Настройка", 0, 0, 200, 250, 0x0200, 0x00000420)
GUICtrlSetResizing(-1, 4 + 64 + 32 + 256)
GUICtrlSetBkColor(-1, 0xFFFFFF)
	$vTitle = GUICtrlCreateListViewItem("Заголовок окна|Окно", $View)
	$vWidth = GUICtrlCreateListViewItem("Ширина окна|200", $View)
	$vHeight = GUICtrlCreateListViewItem("Высота окна|250", $View)

GUICtrlSendMsg($View, 4126, 0, 110)

GUISetState()
While 1
	Switch GUIGetMsg()
		Case -3
			Exit
   EndSwitch
WEnd

Помогите разобраться, заранее благодарен.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
GUIMish,
Если Вы хотите получить помощь, то используйте соответствующие константы в коде. Я (и, думаю, не только я) не понимаю, что означает
Код:
$View = GUICtrlCreateListView("Значение|Настройка", 0, 0, 200, 250, 0x0200, 0x00000420)
или
Код:
GUICtrlSendMsg($View, 4126, 0, 110)
 
Автор
G

GUIMish

Знающий
Сообщения
122
Репутация
12
madmasles:

название колонок позиция размер $LVS_EDITLABELS $LVS_EX_INFOTIP и $LVS_EX_FULLROWSELECT
$View = GUICtrlCreateListView("Значение|Настройка", 0, 0, 200,250, 0x0200, 0x00000420)


А это, GUICtrlSendMsg устанавливает ширину первому столбцу
Код:
GUICtrlSendMsg($View, 4126, 0, 110)
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
GUIMish
Если речь идет о заголовках ListView - то используйте GUICtrlSetData ( не такая уж и проблема продублировать остальные имена ).

В случае с пунктами лучше использовать библиотеку GuiListView.au3

Код:
_GUICtrlListView_SetItemText

Запустите пример из справки, там именно то что вам нужно.

P.S. Если не хотите разбираться с библиотекой - стройте костыли плана:
-Читаем текст нужного пункта
Код:
GUICtrlRead

-Зная делитель ( умолчание - "|" ) достаем второй столбец
-Заменяем данные
-Собираем и записываем через
Код:
GUICtrlSetData
 
Автор
G

GUIMish

Знающий
Сообщения
122
Репутация
12
Я имел в виду, сделать таблицу, как здесь:
5c644e73c071.png
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
ENTER - сохранить изменения.
Если поле ввода теряет фокус - отмена редактирования.

Код:
#include <GUIListView.au3>
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>

Global $hGui, $iDummy, $iInput, $iListView, $hListView, $aActive[2]
; ======

$hGui = GUICreate( "Окно", 200, 250, -1, -1 )

$iListView = GUICtrlCreateListView( "Значение|Настройка", 0, 0, 200, 250, Default, BitOr( $LVS_EX_INFOTIP, $LVS_EX_FULLROWSELECT ) )
$hListView = GUICtrlGetHandle( $iListView )
    GUICtrlCreateListViewItem( "Заголовок окна|Окно", $iListView )
    GUICtrlCreateListViewItem( "Ширина окна|200", $iListView )
    GUICtrlCreateListViewItem( "Высота окна|250", $iListView )

$iInput = GUICtrlCreateInput( '', 0, 0, 0, 0 )
	GUICtrlSetState( -1, $GUI_HIDE )

$iDummy = GUICtrlCreateDummy()
	Local $AccelKeys[1][2] = [["{ENTER}", $iDummy]]
	GUISetAccelerators($AccelKeys)


GUIRegisterMsg( $WM_NOTIFY, "WM_NOTIFY" )
GUIRegisterMsg( $WM_COMMAND, "WM_COMMAND" )
GUISetState()
; =====

While Sleep( 50 )
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			ExitLoop
		Case $iDummy
			If ControlGetFocus($hGui) = 'Edit1' Then _
				_GUICtrlListView_SaveChanges()
	EndSwitch
WEnd


Func _GUICtrlListView_EditItem($hWnd, $iIndex, $iSubItem)
	If $iIndex < 0 Then _
		Return SetError( 1, 0, 0 )

	If $iSubItem <> 1 Then _
		Return SetError( 1, 0, 0 ) ;Разрешается редактировать только второй столбец

	Local $X, $Y, $W, $H, $aPos, $aRect, $Idx, $iSum = 0
	For $Idx = 0 To $iSubItem - 1
		$iSum += _GUICtrlListView_GetColumnWidth($hWnd, $Idx)
	Next

	$aRect = _GUICtrlListView_GetItemRect($hWnd, $iIndex)
	$aPos = ControlGetPos($hGui, "", $hWnd)

	$X = $iSum + $aPos[0] + $aRect[0]
	$Y = $aPos[1] + $aRect[1]
	$W = _GUICtrlListView_GetColumnWidth($hWnd, $iSubItem)
	$H = $aRect[3] - $aRect[1]

	GUICtrlSetPos($iInput, $X, $Y, $W, $H)
	GUICtrlSetData($iInput, _GUICtrlListView_GetItemText($hWnd, $iIndex, $iSubItem))
	GUICtrlSetState($iListView, $GUI_DISABLE)

	GUICtrlSetState($iInput, $GUI_SHOW)
	GUICtrlSetState($iInput, $GUI_FOCUS)
	; ---
	$aActive[0] = $iIndex
	$aActive[1] = $iSubItem
	Return True
EndFunc

Func _GUICtrlListView_SaveChanges()
	Local $sText = GUICtrlRead($iInput)
	; ---
	If $sText = '' Then
		MsgBox( 64, '', 'Invalid value!' )
	Else
		_GUICtrlListView_BeginUpdate( $hListView )
		_GUICtrlListView_SetItemText( $hListView, $aActive[0], $sText, $aActive[1] )
		_GUICtrlListView_EndUpdate($hListView)
	EndIf
	GUICtrlSetState($iInput, $GUI_HIDE)
	GUICtrlSetState($iListView, $GUI_ENABLE)

	Return True
EndFunc

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
	Local $hWndFrom, $iCode, $tNMHDR, $tInfo
	; ---
	$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
	$hWndFrom = HWnd( DllStructGetData($tNMHDR, "hWndFrom") )
	$iCode = DllStructGetData($tNMHDR, "Code")
	$tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
	Switch $hWndFrom
		Case $hListView
			Switch $iCode
				Case $NM_DBLCLK
					_GUICtrlListView_EditItem($hWndFrom, DllStructGetData($tInfo, "Index"), DllStructGetData($tInfo, "SubItem"))
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
	Local $iIDFrom, $iCode
	; ---
	$iCode = BitShift($wParam, 16)
	$iIDFrom = BitAND($wParam, 0xFFFF)
	Switch $iIDFrom
		Case $iInput
			Switch $iCode
				Case $EN_KILLFOCUS
					GUICtrlSetState($iInput, $GUI_HIDE)
					GUICtrlSetState($iListView, $GUI_ENABLE)
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
GUIMish,
[info border=#0000ff float=left]На форуме принято помечать тему решенной после получения ответа на свой вопрос!
Вверху или внизу темы нажмите на ссылку такого вида:
package_old.gif
Тема не решена
[/info]
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Параллельная тема (давно решено):
http://autoit-script.ru/index.php?topic=11394.0
 
Верх