Что нового

Пропадет цвет заднего фона в GuiListView

vovsla

Осваивающий
Сообщения
607
Репутация
36
Периодически после выполнения части нижеуказанного кода пропадет подсветка. Как правило пропадает если выполнить функцию несколько раз подряд.
Код:
_GUICtrlListView_DeleteAllItems($ListView1)
			_GUICtrlListView_BeginUpdate($ListView1)
			For $Num=1 To UBound($TasksResult)-1
				GUICtrlCreateListViewItem($TasksResult[$Num][0]&'|'&StringTrimLeft(StringRegExpReplace($TasksResult[$Num][1], '(\d{2})-(\d{2})-(\d{2})', '$3.$2.$1'), 2)&'|'&$TasksResult[$Num][2], $ListView1)
				If $TaskColor=1 Then GUICtrlSetBkColor(-1, $PriorityColor[$TasksResult[$Num][3]-1])
			Next
			_GUICtrlListView_EndUpdate($ListView1)
			GUICtrlSendMsg($ListView1, $LVM_SETCOLUMNWIDTH, 0, 40)
			GUICtrlSendMsg($ListView1, $LVM_SETCOLUMNWIDTH, 1, 60)
			GUICtrlSendMsg($ListView1, $LVM_SETCOLUMNWIDTH, 2, 100)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Нужен полный рабочий пример.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Этот пример показывает что всё нормально:

Код:
#include <GUIConstantsEx.au3>

$hGUI = GUICreate("")

$iListView = GUICtrlCreateListView('Data', 20, 20)

For $i = 1 To 10
	GUICtrlCreateListViewItem('Item ' & $i, $iListView)
	GUICtrlSetBkColor(-1, 0xFF0000)
Next

GUISetState(@SW_SHOW, $hGUI)

While 1
	$nMsg = GUIGetMsg()

	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Vovsla,
Пару лет назад сталкивался с примерно такой же проблемой. В результате пришел к выводу, что надо использовать в скрипте или только нативные функции, или только из GuiListView.au3.
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
Начал переделывать программу заменяя нативные функции на функции из GuiListView.au3 и столкнулся с новой проблемой.
ListView создается на элементе TabItem, при использовании функции _GUICtrlListView_Create заголовки колонок отображаются на всех вкладках.
Может будет проще заменить все на нативные функции, только не знаю чем менять _GUICtrlListView_DeleteAllItems, _GUICtrlListView_BeginUpdate, _GUICtrlListView_EndUpdate, _GUICtrlListView_GetNextItem, _GUICtrlListView_GetItemTextArray.

Может ли решить проблему с пропаданием цвета простое копирование нужных функций из библиотеки GuiListView.au3 ?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Vovsla
Проблема с пропаданием цвета решилась?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Vovsla,
Написал пример, гонял его почти час. Все отображается как надо, удаляется, создается, никакие цвета не пропадают.
Код:
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <File.au3>
#include <StaticConstants.au3>

Opt('MustDeclareVars', 1)

Global $hGui, $iLbl, $iTab, $aiTabItem[5], $ahLV[5], $aColumn[7] = ['Num ', 'Name ', 'Attrib ', 'Size ', 'Modified ', 'Created ', _
		'Accessed '], $aiBtn[5], $aiLbl[5][2], $aWindowsDir, $iCurrentTab, $aColor[5][2] = [[0xF0F8FF, 0x0000FF], [0xFAEBD7, 0x00008B], _
		[0xFFE4B5, 0x006400], [0x7FFFD4, 0xDC143C], [0xB0C4DE, 0x4B0082]], $aTmp, $sDir, $aDir[1], $aTime, $iDirs = 0, $iFiles = 0

$aWindowsDir = _FileListToArray(@WindowsDir, '*', 2)
If @error Then Exit 13
$hGui = GUICreate('Test', 400, 400)
$iLbl = GUICtrlCreateLabel('', 10, 10, 380, 20, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetBkColor(-1, 0xB4E1D3)
$iTab = GUICtrlCreateTab(10, 40, 380, 340)
For $i = 0 To UBound($aiTabItem) - 1
	$aiTabItem[$i] = GUICtrlCreateTabItem('TabItem_' & $i)
	$aiBtn[$i] = GUICtrlCreateButton('Click ' & $i, 40, 70, 80, 30)
	$aiLbl[$i][0] = GUICtrlCreateLabel('Dirs: 0', 160, 75, 80, 20, BitOR($SS_CENTER, $SS_CENTERIMAGE))
	GUICtrlSetBkColor(-1, 0xB4E1D3)
	$aiLbl[$i][1] = GUICtrlCreateLabel('Files: 0', 280, 75, 80, 20, BitOR($SS_CENTER, $SS_CENTERIMAGE))
	GUICtrlSetBkColor(-1, 0xB4E1D3)
	$ahLV[$i] = GUICtrlCreateListView('', 20, 110, 360, 260, -1, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER))
	$ahLV[$i] = GUICtrlGetHandle($ahLV[$i])
	_GUICtrlListView_SetBkColor($ahLV[$i], 0x00FFFF)
	_GUICtrlListView_SetTextBkColor($ahLV[$i], $aColor[$i][0])
	_GUICtrlListView_SetTextColor($ahLV[$i], $aColor[$i][1])
	For $j = 0 To UBound($aColumn) - 1
		_GUICtrlListView_AddColumn($ahLV[$i], $aColumn[$j] & $i)
	Next
	For $j = 0 To UBound($aColumn) - 1
		_GUICtrlListView_SetColumnWidth($ahLV[$i], $j, $LVSCW_AUTOSIZE_USEHEADER)
	Next
Next
GUICtrlCreateTabItem('')
GUISetState()
$iCurrentTab = Random(0, 4, 1)
GUICtrlSetState($aiTabItem[$iCurrentTab], $GUI_SHOW)
GUICtrlSetData($iLbl, 'Current TabItem: TabItem_' & $iCurrentTab)
While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $iTab
			$iCurrentTab = GUICtrlRead($iTab)
			GUICtrlSetData($iLbl, 'Current TabItem: TabItem_' & $iCurrentTab)
		Case $aiBtn[$iCurrentTab]
			GUISetState(@SW_DISABLE)
			_GUICtrlListView_DeleteAllItems($ahLV[$iCurrentTab])
			GUICtrlSetData($aiLbl[$iCurrentTab][0], 'Dirs: 0')
			GUICtrlSetData($aiLbl[$iCurrentTab][1], 'Files: 0')
			GUICtrlSetData($iLbl, 'Please wait...')
			$sDir = @WindowsDir & '\' & $aWindowsDir[Random(1, $aWindowsDir[0], 1)] & '\'
			$aTmp = _FileListToArray($sDir)
			If @error Then
				GUISetState(@SW_ENABLE)
				GUICtrlSetData($iLbl, 'Error _FileListToArray')
				ContinueLoop
			EndIf
			ReDim $aDir[$aTmp[0]][7]
			For $i = 1 To $aTmp[0]
				$aDir[$i - 1][0] = $i
				$aDir[$i - 1][1] = $aTmp[$i]
				$aDir[$i - 1][2] = FileGetAttrib($sDir & $aTmp[$i])
				If StringInStr($aDir[$i - 1][2], 'D') Then
					$iDirs += 1
					$aDir[$i - 1][3] = DirGetSize($sDir & $aTmp[$i])
				Else
					$iFiles += 1
					$aDir[$i - 1][3] = FileGetSize($sDir & $aTmp[$i])
				EndIf
				For $j = 0 To 2
					$aDir[$i - 1][$j + 4] = StringRegExpReplace(FileGetTime($sDir & $aTmp[$i], $j, 1), '^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$', _
							'$3\.$2\.$1 $4:$5:$6')
				Next
			Next
			_GUICtrlListView_BeginUpdate($ahLV[$iCurrentTab])
			_GUICtrlListView_AddArray($ahLV[$iCurrentTab], $aDir)
			For $j = 0 To UBound($aColumn) - 1
				_GUICtrlListView_SetColumnWidth($ahLV[$iCurrentTab], $j, $LVSCW_AUTOSIZE_USEHEADER)
			Next
			_GUICtrlListView_EndUpdate($ahLV[$iCurrentTab])
			GUICtrlSetData($iLbl, $sDir)
			GUICtrlSetData($aiLbl[$iCurrentTab][0], 'Dirs: ' & $iDirs)
			GUICtrlSetData($aiLbl[$iCurrentTab][1], 'Files: ' & $iFiles)
			ReDim $aDir[1]
			$sDir = ''
			$aTmp = 0
			$iDirs = 0
			$iFiles = 0
			GUISetState(@SW_ENABLE)
	EndSwitch
WEnd
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
Простое копирование нужных функций из библиотеки GuiListView.au3 не помогло.

madmasles,
Спасибо за пример, но это не совсем то что мне нужно.
Мне нужно окрашивать разные строчки в разные цвета, а функции "_GUICtrlListView_SetBkColor" и "_GUICtrlListView_SetTextColor" закрашивают весь GuiListView одним цветом. Разные строчки в разные цвета у меня получается покрасить только функцией "GUICtrlSetBkColor"
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
Похоже что проблема решена т.к. не проявлялась очень долгое время.
При одновременном использовании нативных функций и функций из GuiListView.au3 проблема пропала после блокировки GUI на время редактирования элемента ListView.

Т.е. вот такая концепция
Код:
$Form1 = GUICreate()
$ListView2 = GUICtrlCreateListView()
GUISetState(@SW_SHOW)

GUISetState(@SW_DISABLE, $Form1)
; вносим изменения в ListView2 
GUISetState(@SW_ENABLE, $Form1)
 
Верх