Что нового

Сокрытие строк в ListView

Core2Duo76

Новичок
Сообщения
58
Репутация
1
Столкнулся с такой проблемой: приходится по событию переписывать содержимое порядка 500 items в ListView, если из БД вернулся лишь один результат то 499 надо переписать на пустые. Скрыть через guictrlsetstate(*, $ GUI_HIDE) не получается. в справке написано, что для этого Listview должен быть создан с определенным стилем, но не помогло. Что я делаю не так? как скрыть элемент item ? А то обработка всех items занимает время, да и экран моргает( еще и цвета иногда не белые используются).
 
Автор
C

Core2Duo76

Новичок
Сообщения
58
Репутация
1
удалить нельзя. Например, при следующем запросе (программа sqlite фильтр по базе) результатов будет 300, тогда надо будет создавать еще 299 item-ов, окно программы жутко часто моргает при добавлении множества items или при удалении. точнее моргает сам listview.

Не предоставил кода так как там просто

Код:
for $i=$SQLITE_ROWS+1  to 500 а внутри
 guictrlsetstate($Items[$i], $GUI_HIDE) (это )


SQLITE_ROWS из функции _sqlite_getTable2D()

скрываться не хочет ну никак :(
 

Prog

Продвинутый
Сообщения
600
Репутация
77
Есть так называемый виртуальный режим работы ListView. В нем можно быстро добавлять миллионы строк.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
alex33 [?]
наверное имеется ввиду функция
Не поможет она быстро добавить миллионы элементов, просто процесс добавления будет скрыт. Будет чуть быстрее обычного, но это ещё зависит от свойств элементов (checkbox, изображение и т.д.).
 

Prog

Продвинутый
Сообщения
600
Репутация
77

Вложения

  • ListView.zip
    19.8 КБ · Просмотры: 15
Автор
C

Core2Duo76

Новичок
Сообщения
58
Репутация
1
Вот насчет BeginUpdate - стильно, молодежно, да. Но как решить вопрос со скрытием? Вот локальный пример:

Есть Items[201], использую номера от 1 до 200. В SQL пишу "SELECT * FROM * LIMIT 200".

Затем по полученному $SQLITE_ROWS пишу GuictrlSetData($items[$i], <строка $i из базы>).
Далее от $SQLITE_ROWS+1 до 200 скрываю как $GUI_HIDE. Если бы сокрытие происходило нормально, то я бы увидел свои строки из базы, а я вижу все 200. И самая проблема - они все нажимаемы! Поэтому и хочу их скрыть. По нажатию происходит OnEvent- процедура, но блин, контекст поиска изменился и процедура отработает то, что не должна, если текст в Item будет не пустой.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Core2Duo76
Скрыть никак.
Проще пересоздавать элементы (_GUICtrlListView_DeleteAllItems и далее создание).
 

Prog

Продвинутый
Сообщения
600
Репутация
77
Скрыть можно, но в виртуальном режиме. Нужно передать команду ListView'у функцией SendMessage с параметром LVM_SETITEMCOUNT, который задает число строк в таблице.
 
Автор
C

Core2Duo76

Новичок
Сообщения
58
Репутация
1
А удаление через delete all будет заметно пользователю? если items много
 

Prog

Продвинутый
Сообщения
600
Репутация
77
Если речь идет про виртуальный режим, то добавлять и удалять элементы нужно из массива а не таблицы. Таблице требуется лишь сообщить сколько элементов в массиве. Поэтому визуально это не будет заметно.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Автор
C

Core2Duo76

Новичок
Сообщения
58
Репутация
1
Попробовал - тут странные вещи стали происходить.

Итак, начал я с
Код:
$TAB_3 = GUICtrlCreateTabItem('Логи')
	
$Log_List=_GUICtrlListView_Create($GUI,'Заказ|Дата|Комментарий', 30, 80, $GUI_W - 80, 500, $LVS_OWNERDATA )
_GUICtrlListView_BeginUpdate($Log_List)
_GUICtrlListView_DeleteAllItems($Log_List)
_GUICtrlListView_EndUpdate($Log_List)



В итоге List отображается на первой вкладке Tab из трех!!! почему так?
Если не наполнять список, он тоже создается на первой вкладке

Обновление списка убирал из кода - все равно не на той вкладке создается список
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
Core2Duo76,
Весь код покажите.
 
Автор
C

Core2Duo76

Новичок
Сообщения
58
Репутация
1
я уже сам ошибку нашел :smile: хотя было бы интересно узнать - почему список надо создавать обычной функцией Create со стилем OWNERDATA, а не функцией из UDF (в справке которая) ? Все как надо. Теперь новый вопрос. Вот есть процедура

Код:
Func ReReadLogFile()
	
	Local $T, $R, $C
	
	Select
		Case GUICtrlRead($SystemEventsOnly) = $GUI_CHECKED And GUICtrlRead($UserEventsOnly) = $GUI_CHECKED
			_SQLite_GetTable2d($DB, 'SELECT id,order_id,date,log,type,is_admin FROM log WHERE type in (1,2) ORDER BY order_id DESC, date DESC LIMIT 300', $T, $R, $C)
		Case GUICtrlRead($SystemEventsOnly) = $GUI_UNCHECKED And GUICtrlRead($UserEventsOnly) = $GUI_CHECKED
			_SQLite_GetTable2d($DB, 'SELECT id,order_id,date,log,type,is_admin FROM log WHERE type = 2 ORDER BY order_id DESC, date DESC LIMIT 300', $T, $R, $C)
		Case GUICtrlRead($SystemEventsOnly) = $GUI_CHECKED And GUICtrlRead($UserEventsOnly) = $GUI_UNCHECKED
			_SQLite_GetTable2d($DB, 'SELECT id,order_id,date,log,type,is_admin FROM log WHERE type = 1 ORDER BY order_id DESC, date DESC LIMIT 300', $T, $R, $C)
		Case GUICtrlRead($SystemEventsOnly) = $GUI_UNCHECKED And GUICtrlRead($UserEventsOnly) = $GUI_UNCHECKED
			_SQLite_GetTable2d($DB, 'SELECT id,order_id,date,log,type,is_admin FROM log WHERE type IN () ORDER BY order_id DESC, date DESC LIMIT 300', $T, $R, $C)
	EndSelect
	_ArrayDisplay($T)
	_GUICtrlListView_BeginUpdate($Log_List)
	_GUICtrlListView_DeleteAllItems($Log_List)
	
	$color = '0xdddddd'
	For $i = 1 To $R
		$temp = StringFormat('%06i', $T[$i][1]) & '|' & $T[$i][2] & '|'
		If $T[$i][5] = 1 Then
			$temp &= 'Администратор|'
		Else
			$temp &= 'Пользователь|'
		EndIf
		$temp &= $T[$i][3]
		
		_GUICtrlListView_AddItem($Log_List, $temp)
		
		;GUICtrlCreateListViewItem($temp, $Log_List)
		
		If $T[$i][1] <> $T[$i - 1][1] Then
			Switch $color
				Case '0xdddddd'
					$color = '0xffffff'
				Case '0xffffff'
					$color = '0xdddddd'
			EndSwitch
		EndIf
		GUICtrlSetBkColor(-1, $color)
	Next
	;_GUICtrlListView_endUpdate($Log_List) ; закоментил для отладки. все равно падает
	
	
EndFunc


При ее выполнении по F5 интерпретатор падает. Собстна, из-за этой процедуры и начал тему.
 
Верх