Что нового

Добавление нового Item'a в НАЧАЛО списка

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Всем привет :smile:

Короче каждые новые Item'ы появляются в конце, нужно чтоб они появлялись в переди...

Коротко:
Код:
$List2 = GUICtrlCreateListView("Имя                       |Pr|PID", 0, 105, 227, 345)


Что надо сделать чтобы каждые новые:
Код:
$TempPR[$iZ] = GUICtrlCreateListViewItem($PRList[$iZ][0]&'|'&$PRIOLET&'|'&$PRList[$iZ][1],$List2)

Появлялись не в конце, а в переди!??
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Ganibal95
Посмотрите функцию _GUICtrlListView_InsertItem().
 
Автор
Ganibal95

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Код:
GUICreate("ListView Insert Item", 400, 300)
    $hListView = GUICtrlCreateListView("sssss|ddd", 2, 2, 394, 268)
    GUISetState()

    ; Add items
    _GUICtrlListView_InsertItem($hListView, "Item 2|ddd", 0)

Способ не подходит, так-как я использую разделители... "Item 2|ddd"
 
Автор
Ganibal95

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Код:
$TempPR[$iZ] = GUICtrlCreateListViewItem($PRList[$iZ][0]&'|'&$PRIOLET&'|'&$PRList[$iZ][1],$List2)


Мне нужна функция который бы указать: $TempPR[$iZ], и номер ячейки(0) и все!!! Такое возможно?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Ganibal95,
Попробуйте, например, так:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ListviewConstants.au3>
#include <GuiListView.au3>

Dim $aItem[6][2] = [[5]]
For $i = 1 To $aItem[0][0]
	$aItem[$i][1] = $i & '_'
	For $j = 1 To 3
		$aItem[$i][1] &= Chr(Random(97, 122, 1)) ;a-z
	Next
	$aItem[$i][1] &= '|'
	For $j = 1 To 3
		$aItem[$i][1] &= Chr(Random(65, 90, 1)) ;A-Z
	Next
	$aItem[$i][1] &= '|'
	For $j = 1 To 3
		$aItem[$i][1] &= Chr(Random(48, 57, 1)) ;0-9
	Next
Next

GUICreate('Test', 220, 250)
$nListview = GUICtrlCreateListView('    col1    |    col2    |    col3    ', 10, 10, 200, 200, -1, $LVS_EX_GRIDLINES)
$hListview = GUICtrlGetHandle($nListview)
$nButton = GUICtrlCreateButton('Click', 75, 220, 70, 20)
For $i = 1 To $aItem[0][0]
	$aItem[$i][0] = GUICtrlCreateListViewItem($aItem[$i][1], $nListview)
	If Mod($i, 2) Then
		GUICtrlSetBkColor(-1, 0xDCDCDC)
	Else
		GUICtrlSetColor(-1, 0x0000FF)
	EndIf
Next
GUISetState()


While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nButton
			GUICtrlSetState($nButton, $GUI_DISABLE)
			_GUICtrlListView_DeleteAllItems($hListview)
			$aTempArray = $aItem
			Dim $aItem[$aTempArray[0][0] + 2][2] = [[$aTempArray[0][0] + 1]]
			$aItem[1][1] = $aItem[0][0] & '_'
			For $i = 1 To 3
				$aItem[1][1] &= Chr(Random(97, 122, 1)) ;a-z
			Next
			$aItem[1][1] &= '|'
			For $i = 1 To 3
				$aItem[1][1] &= Chr(Random(65, 90, 1)) ;A-Z
			Next
			$aItem[1][1] &= '|'
			For $i = 1 To 3
				$aItem[1][1] &= Chr(Random(48, 57, 1)) ;0-9
			Next
			For $i = 1 To $aTempArray[0][0]
				$aItem[$i + 1][1] = $aTempArray[$i][1]
			Next
			For $i = 1 To $aItem[0][0]
				$aItem[$i][0] = GUICtrlCreateListViewItem($aItem[$i][1], $nListview)
				If Mod($i, 2) Then
					GUICtrlSetBkColor(-1, 0xDCDCDC)
				Else
					GUICtrlSetColor(-1, 0x0000FF)
				EndIf
			Next
			GUICtrlSetState($nButton, $GUI_ENABLE)
			$aTempArray = 0
	EndSwitch
WEnd
 
Автор
Ganibal95

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
madmasles
Моргает, а эту фишку я в первый раз сделал, но список большой, и пока он перерисовывается моргает!!!

Если сделать чтоб не моргал, то было бы отлично! :smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Ganibal95
А если так:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ListviewConstants.au3>
#include <GuiListView.au3>

Dim $aItem[6] = [5]

For $i = 1 To $aItem[0]
	$aItem[$i] = $i & '_'
	For $j = 1 To 3
		$aItem[$i] &= Chr(Random(97, 122, 1)) ;a-z
	Next
	$aItem[$i] &= '|'
	For $j = 1 To 3
		$aItem[$i] &= Chr(Random(65, 90, 1)) ;A-Z
	Next
	$aItem[$i] &= '|'
	For $j = 1 To 3
		$aItem[$i] &= Chr(Random(48, 57, 1)) ;0-9
	Next
Next

GUICreate('Test', 220, 250)
$nListview = GUICtrlCreateListView('    col1    |    col2    |    col3    ', 10, 10, 200, 200, -1, $LVS_EX_GRIDLINES)
$hListview = GUICtrlGetHandle($nListview)
$nButton = GUICtrlCreateButton('Click', 75, 220, 70, 20)
For $i = 1 To $aItem[0]
	GUICtrlCreateListViewItem($aItem[$i], $nListview)
Next
$aItem = 0
GUISetState()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nButton
			GUICtrlSetState($nButton, $GUI_DISABLE)
			$iItemCount = _GUICtrlListView_GetItemCount($hListview)
			$iColumnCount = _GUICtrlListView_GetColumnCount($hListview)
			Dim $aItemTemp[$iItemCount + 1][$iColumnCount]
			$aItemTemp[0][0] = $iItemCount + 1 & '_'
			For $i = 0 To $iColumnCount - 1
				For $j = 1 To 3
					$aItemTemp[0][$i] &= Chr(Random(97, 122, 1)) ;a-z
				Next
			Next
			For $i = 1 To $iItemCount
				For $j = 0 To $iColumnCount - 1
					$aItemTemp[$i][$j] = _GUICtrlListView_GetItemText($hListview, $i - 1, $j)
				Next
			Next
			_GUICtrlListView_DeleteAllItems($hListview)
			_GUICtrlListView_AddArray($hListview, $aItemTemp)
			GUICtrlSetState($nButton, $GUI_ENABLE)
			$aItemTemp = 0
	EndSwitch
WEnd
 
Автор
Ganibal95

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Re: Добавление нового Item\\\'a в НАЧАЛО списка

_GUICtrlListView_AddArray($hListview, $aItemTemp), то что надо :smile:


Добавлено:
Сообщение автоматически объединено:

Только мне нужно для каждого элемента привезать картинку(Для каждого элементы картинка разная):
Код:
GUICtrlSetImage(-1,@ScriptDir&'\Image.dll',7)

И разные цвета... Как с этим быть?)


Добавлено:
Сообщение автоматически объединено:

все, я придумал =)

GUICtrlSetState($List2, $GUI_HIDE)

я просто скрываю на время перерисовки! :smile:
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Ganibal95 [?]
Мне нужна функция который бы указать: $TempPR[$iZ], и номер ячейки(0) и все!!! Такое возможно?

[?]
все, я придумал =)
GUICtrlSetState($List2, $GUI_HIDE)
я просто скрываю на время перерисовки!

Не думаю,что это хорошее решение.
Вообще создавать элементы с помощью GUICtrlCreateListViewItem
на мой взгляд не есть хорошо.
Тем более если элементов много.
Неизбежны мелькания при перерисовке.

Если уж так очень нужно заносить полной строкой,то лучше так :

Вот простое решение :
Код:
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#Include <GuiListView.au3>
;#include <Array.au3>

$hForm = GUICreate('Test ListView', 500, 200, 10, 10)
GUISetBkColor(0xECE9D8)

$hListView  = GUICtrlCreateListView('Имя                       |Pr|PID      ', 10,10, 480, 150,   -1, BitOR($LVS_EX_GRIDLINES,$LVS_EX_FULLROWSELECT))

$ButAdd=GUICtrlCreateButton('Add',400, 170, 40, 25)

$ButInsert=GUICtrlCreateButton('Insert',450, 170, 40, 25)

$sString="FIO|PR|PID "
$i=0
GUISetState()

While 1
	$nMsg = GUIGetMsg()
	
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $ButAdd
			$i+=1
			$sItemString =$sString & $i
			LV_AddItemString($hListView, $sItemString)
		Case $ButInsert
			$i+=1
			$sItemString =$sString & $i
			LV_InsertItemString($hListView, $sItemString)
	EndSwitch
WEnd

Func LV_AddItemString($hLV, $sString)
	$aSubItem=StringSplit($sItemString,"|",2)
	$iItem=_GUICtrlListView_AddItem($hLV,'')
	For $i=0 To UBound($aSubItem)-1
		_GUICtrlListView_AddSubItem($hLV, $iItem,  $aSubItem[$i], $i)
	Next
	_GUICtrlListView_SetItemSelected($hLV, $iItem)
	_GUICtrlListView_EnsureVisible($hLV, $iItem)
EndFunc
Func LV_InsertItemString($hLV, $sString, $iIndex=0)
	$aSubItem=StringSplit($sItemString,"|",2)
	$iItem=_GUICtrlListView_InsertItem($hLV,"", $iIndex)
	For $i=0 To UBound($aSubItem)-1
		_GUICtrlListView_AddSubItem($hLV, $iItem,  $aSubItem[$i], $i)
	Next
	_GUICtrlListView_SetItemSelected( $hLV, $iItem)
	_GUICtrlListView_EnsureVisible($hLV, $iItem)
EndFunc


Хочешь-добавляй, хочешь - вставляй в начало
А хочешь - вставляй в указанное место
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
gregaz,
ИМХО, проверку на кол-во колонок надо бы делать.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
madmasles [?]
ИМХО, проверку на кол-во колонок надо бы делать.

Конечно нужно и не только .
Я ведь показал только тривиальный принцип построения.

А так можно и картинки привязать и Строить по массиву или строке :
Код:
;...............
;$sItemString =$sString & $i
;LV_InsertItemString($hListView, $sItemString, 0,2)
Dim $aData[3]=["FIO", "PR", "PID "]
$iItemLV= LV_InsertItemString($hListView,  $aData, 0,2)

;......................
Func LV_InsertItemString($hLV, $aSubItem, $iIndex=0, $iImage='')
	If Not IsArray($aSubItem) Then
		$aSubItem=StringSplit($aSubItem,"|",2)
		If @error Then Return SetError(1, 0, MsgBox(4096+16,"Ошибка", "Разделитель строки не найден"))
	EndIf
	If UBound($aSubItem ) <> _GUICtrlListView_GetColumnCount($hLV)  _ 
		Then Return SetError(2, 0, MsgBox(4096+16,"Ошибка", "Формат строки не соответствует формату ListView"))
	$iItem=_GUICtrlListView_InsertItem($hLV,"", $iIndex, $iImage)
	For $i=0 To UBound($aSubItem)-1
		_GUICtrlListView_AddSubItem($hLV, $iItem,  $aSubItem[$i], $i)
	Next
	_GUICtrlListView_SetItemSelected( $hLV, $iItem)
	_GUICtrlListView_EnsureVisible($hLV, $iItem)
	Return  $iItem
EndFunc

Можно даже просто объединить обе ф-ии в одну. На вкус...
 
Верх