Что нового

Проблемы с _GUICtrlListView_Create

kodges

Новичок
Сообщения
42
Репутация
0
Здравствуйте. Мне нужно каждой строке ListView задать параметр свой. Насколько я понял это возможно только при использовании _GUICtrlListView_Create, но возникает проблема в том что с _GUICtrlListView_Create не работает GUICtrlSetResizing, то есть при изменении размера окна, размер таблицы не меняется. Можно это как то решить ?
И еще, при использовании GUICtrlCreateListView, я применяю цвет через GUICtrlSetBkColor(-1, 0xFFFEEE). Но при использовании _GUICtrlListView_Create я устанавливаю тот же цвет через _GUICtrlListView_SetBkColor(-1, 0xFFFEEE) и вижу совершенно другой цвет таблицы.. Как это исправить?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
с _GUICtrlListView_Create не работает GUICtrlSetResizing, то есть при изменении размера окна, размер таблицы не меняется. Можно это как то решить ?
Да, используя библиотеку GUICtrlSetResizingEx:
Код:
#include <GUIListView.au3>
#include 'GUICtrlSetResizingEx.au3'

$hForm = GUICreate('GUICtrlSetResizingEx Example 1', 380, 330, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX))

$hLV = _GUICtrlListView_Create($hForm, 'Col1', 5, 5, 250, 250, -1, $WS_EX_CLIENTEDGE)
_GUICtrlSetResizingEx($hLV, BitOR($GUI_DOCKLEFT, $GUI_DOCKRIGHT, $GUI_DOCKTOP))

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            GUIDelete($hForm)
            Exit
    EndSwitch
WEnd


вижу совершенно другой цвет таблицы
Потому что в нативных функциях используется RGB, а в UDF используется BGR.
Нужно просто перевернуть цвет:
Код:
_GUICtrlListView_SetBkColor($hLV, _RGB2BGR(0xFFFEEE))

...

Func _RGB2BGR($iColor)
    Local $iMask = BitXOR(BitAND($iColor, 0xFF), ($iColor / 0x10000))
    Return '0x' & Hex(BitXOR($iColor, ($iMask * 0x10001)), 6)
EndFunc
 
Автор
kodges

kodges

Новичок
Сообщения
42
Репутация
0
Вы как всегда великолепны, Грац!
Ну и еще возникла проблема по ListView... Сразу спрошу тут...
Почему при создании ListView при помощи GUICtrlCreateListView и потом при наделении строк таблицы параметром через любую функцию способную это делать, как при создании пунктов _GUICtrlListView_AddItem так и при установке значения параметра через _GUICtrlListView_SetItemParam, и в дальнейшем кликании по таблице, приложение начинает вести себя неадекватно. Начинает срабатывать самый разный уже реализованный функционал. Например открытие других окон, переключение вкладок, открытие меню и т.д...? Этот глюк возникает именно если начать устанавливать в строки таблицы свой параметр $iParam. Почему такое происходит/может происходить, и как от этого избавиться все-таки имея установленный свой параметр?
 
Автор
kodges

kodges

Новичок
Сообщения
42
Репутация
0
На данный момент выяснил следующее...
Если таблицу заполняю просто данным в цикле, то все работает нормально. Пример:
Код:
For $i = 0 To 100
   $Item = _GUICtrlListView_AddItem($SdelkiList, $i+1, -1, $i*100)
   _GUICtrlListView_AddSubItem($SdelkiList, $Item, "Строка " & $i+1, 1)
   _GUICtrlListView_AddSubItem($SdelkiList, $Item, "Строка " & $i+1, 2)
   _GUICtrlListView_AddSubItem($SdelkiList, $Item, "Строка " & $i+1, 3)
   _GUICtrlListView_AddSubItem($SdelkiList, $Item, "Строка " & $i+1, 4)
   _GUICtrlListView_AddSubItem($SdelkiList, $Item, "Строка " & $i+1, 5)
   _GUICtrlListView_AddSubItem($SdelkiList, $Item, "Строка " & $i+1, 6)
   _GUICtrlListView_AddSubItem($SdelkiList, $Item, "Строка " & $i+1, 7)
   _GUICtrlListView_AddSubItem($SdelkiList, $Item, "Строка " & $i+1, 8)
   _GUICtrlListView_AddSubItem($SdelkiList, $Item, "Строка " & $i+1, 9)
   _GUICtrlListView_AddSubItem($SdelkiList, $Item, "Строка " & $i+1, 10)
   _GUICtrlListView_AddSubItem($SdelkiList, $Item, "Строка " & $i+1, 11)
   _GUICtrlListView_AddSubItem($SdelkiList, $Item, "Строка " & $i+1, 12)
   _GUICtrlListView_AddSubItem($SdelkiList, $Item, "Строка " & $i+1, 13)
Next


Если же таблицу заполняю данными из базы данных SQLite, то возникают описанные выше проблемы. Пример:
Код:
_SQLite_Query(-1, "SELECT * FROM main ORDER BY datetime;", $sql_result)
While _SQLite_FetchData($sql_result, $sql_row) = $SQLITE_OK
   $Item = _GUICtrlListView_AddItem($SdelkiList, $sql_row[0], -1, $sql_row[0])
   _GUICtrlListView_AddSubItem($SdelkiList, $Item, $sql_row[1], 1)
   _GUICtrlListView_AddSubItem($SdelkiList, $Item, $sql_row[2], 2)
   _GUICtrlListView_AddSubItem($SdelkiList, $Item, $sql_row[3], 3)
   _GUICtrlListView_AddSubItem($SdelkiList, $Item, $sql_row[4], 4)
   _GUICtrlListView_AddSubItem($SdelkiList, $Item, $sql_row[5], 5)
   _GUICtrlListView_AddSubItem($SdelkiList, $Item, $sql_row[6], 6)
   _GUICtrlListView_AddSubItem($SdelkiList, $Item, $sql_row[7], 7)
   _GUICtrlListView_AddSubItem($SdelkiList, $Item, $sql_row[8], 8)
   _GUICtrlListView_AddSubItem($SdelkiList, $Item, $sql_row[9], 9)
   _GUICtrlListView_AddSubItem($SdelkiList, $Item, $sql_row[10], 10)
   _GUICtrlListView_AddSubItem($SdelkiList, $Item, $sql_row[11], 11)
   _GUICtrlListView_AddSubItem($SdelkiList, $Item, $sql_row[12], 12)
   _GUICtrlListView_AddSubItem($SdelkiList, $Item, $sql_row[13], 13)
   ExitLoop
WEnd


К сожалению весь код программы выложить не могу, возможно этого будет достаточно?
 

CreatoR

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

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
$SQLITE_OK = 0 - успех
в этом случае будет выход из цикла без выполнения последующих действий. в случае ошибки будет возвращаться значение отличное от нуля и соответственно, цикл не будет прекращаться. а что добавлять, если _SQLite_FetchData вернул ошибку?
второй момент. в цикле после добавления пунктов происходит выход из цикла, зачем тогда цикл?
мне непонятна логика
 
Автор
kodges

kodges

Новичок
Сообщения
42
Репутация
0
$SQLITE_OK = 0 - успех
в этом случае будет выход из цикла без выполнения последующих действий. в случае ошибки будет возвращаться значение отличное от нуля и соответственно, цикл не будет прекращаться. а что добавлять, если _SQLite_FetchData вернул ошибку?
второй момент. в цикле после добавления пунктов происходит выход из цикла, зачем тогда цикл?
мне непонятна логика
При $SQLITE_OK = 0 как раз таки будет выполнено тело цикла и оно выполняется, а если _SQLite_FetchData вернет ошибку то цикл прервется. А что до ExitLoop в конце первой итерации, так это я просто забыл его убрать, ставил для отладки.
Сообщение автоматически объединено:

разве?
у меня не выполняется
Код:
While 0
    ConsoleWrite(1 & @LF)
WEnd

ошибка _SQLite_FetchData это значение не равное нулю.
как ведет себя цикл while при значении не равном нулю смотри в справке.

Вот пример прямо из справки
https://autoit-script.ru/docs/libfunctions/_sqlite_query.htm
И он таки работает, и в нем также _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
 
Последнее редактирование:

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Почему при создании ListView при помощи GUICtrlCreateListView и потом при наделении строк таблицы параметром через любую функцию способную это делать, как при создании пунктов _GUICtrlListView_AddItem так и при установке значения параметра через _GUICtrlListView_SetItemParam, и в дальнейшем кликании по таблице, приложение начинает вести себя неадекватно. Начинает срабатывать самый разный уже реализованный функционал.
Я думаю автор просто не знает что внутренний обработчик GUICtrlCreateListView использует Param как ControlID для элементов списка. И установленные им Param совпадают с ControlID других элементов управления которые отвечают за другой функционал в его коде.
Код:
#include <GUIConstants.au3>
#include <GuiListView.au3>

Example()

Func Example()
    Local $hGui = GUICreate(@ScriptName, 400, 200)
    Local $idListView = GUICtrlCreateListView('Column', 0, 0, 400, 150, -1, 0)
    Local $idButton = GUICtrlCreateButton('Button', 10, 160, 380, 30)
    _GUICtrlListView_AddItem($idListView, 'Click Me', -1, $idButton)
    GUISetState()

    While True
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
            Case $idButton
                MsgBox(0, Default, 'Button', 0, $hGui)
        EndSwitch
    WEnd
EndFunc   ;==>Example

Если бы он конечно попытался изолировать проблему и сделать урезанный пример для форума, все бы и сам понял.
 
Автор
kodges

kodges

Новичок
Сообщения
42
Репутация
0
Я думаю автор просто не знает что внутренний обработчик GUICtrlCreateListView использует Param как ControlID для событий GUICtrlCreateListViewItem. И установленные им Param совпадают с ControlID других элементов управления которые отвечают за другой функционал в его коде.
Код:
#include <GUIConstants.au3>
#include <GuiListView.au3>

Example()

Func Example()
    Local $hGui = GUICreate(@ScriptName, 400, 200)
    Local $idListView = GUICtrlCreateListView('Column', 0, 0, 400, 150, -1, 0)
    Local $idButton = GUICtrlCreateButton('Button', 10, 160, 380, 30)
    _GUICtrlListView_AddItem($idListView, 'Click Me', -1, $idButton)
    GUISetState()

    While True
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
            Case $idButton
                MsgBox(0, Default, 'Button', 0, $hGui)
        EndSwitch
    WEnd
EndFunc   ;==>Example

За информацию спасибо, но я думал это относится только к GUICtrlCreateListViewItem а не к GUICtrlCreateListView в целом. Так как в тех же примерах полно вариантов когда таблица создается с GUICtrlCreateListView а потом показывают как в нее добавляются параметры. Вот например https://autoit-script.ru/docs/libfunctions/_guictrllistview_setitemparam.htm, и там в каменте инфа даже есть тока об GuiCtrlCreateListViewItem
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Это не запрещено, но вы просто должны учитывать этот момент. И хотя бы запустить пример что я приложил.
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
я думал это относится только к GUICtrlCreateListViewItem а не к GUICtrlCreateListView в целом
Элемент управления списка имеет один обработчик. Он обрабатывает NM_CLICK и генерирует событие для GUIGetMsg с ControlID в качестве которого выступает Param.

Одно из решений самому обработать NM_CLICK. Если все остальное вас устраивает.
 
Автор
kodges

kodges

Новичок
Сообщения
42
Репутация
0
Элемент управления списка имеет один обработчик. Он обрабатывает NM_CLICK и генерирует событие для GUIGetMsg с ControlID в качестве которого выступает Param.

Одно из решений самому обработать NM_CLICK. Если все остальное вас устраивает.
На данный момент я вышел из положения вставляя свои параметры в дополнительную колонку которую делаю скрытой. А потом по нужным событиям забираю из них данные... Слишком долго возился с Param и в итоге сделал вот как написал. Но вам спасибо за то что внесли ясность в мою проблему.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
вышел из положения вставляя свои параметры в дополнительную колонку которую делаю скрытой
Я раньше так делал (я про данные из скрытой колонки, кстати она не совсем скрытая её при желаний могут открыть), но самый надёжный и верный способ это работа с массивами.
 
Автор
kodges

kodges

Новичок
Сообщения
42
Репутация
0
Всех с Новым Годом!
Подскажите еще по теме в догонку, какие стили надо применить к _GUICtrlListView_Create() чтобы ListView отображалось в точности как при создании через GUICtrlCreateListView() ?
А то у меня почему-то при _GUICtrlListView_Create таблица ListView видна на всех вкладках Tab, а не только на той на которой она расположена. А Вот с GUICtrlCreateListView в этом плане все в порядке, отображается строго на своей вкладке.
Я уже какие только стили не пробовал не могу разобраться никак ((
Код:
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <TabConstants.au3>

$hGUI = GUICreate("Example 1", 700, 430)

GUICtrlCreateTab(1, 1, 690, 330, BitOR($TCS_FIXEDWIDTH, $TCS_BUTTONS, $TCS_FLATBUTTONS))

GUICtrlCreateTabItem("Tab1")
GUICtrlCreateTabItem("Tab2")
$ListView = _GUICtrlListView_Create($hGUI, "", 10, 20, 480, 400, BitOR($LVS_DEFAULT, $WS_BORDER))
_GUICtrlListView_SetExtendedListViewStyle($ListView, $LVS_EX_FULLROWSELECT)

_GUICtrlListView_AddColumn($ListView, "Peter", 83)
_GUICtrlListView_AddColumn($ListView, "Paul", 83)
_GUICtrlListView_AddColumn($ListView, "Mary", 83)

For $i = 1 To 10
    _GUICtrlListView_AddItem($ListView, "Peter " & $i - 1)
    If Mod($i, 4) Then
        _GUICtrlListView_AddSubItem($ListView, $i - 1, "Paul " & $i - 1, 1)
    EndIf
    _GUICtrlListView_AddSubItem($ListView, $i - 1, "Mary " & $i - 1, 2)
Next

GUICtrlCreateTabItem("Tab3")
GUICtrlCreateTabItem("Tab4")

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
    Sleep(100)
WEnd

Ну и еще спрошу для общего развития, есть ли какой-то порядок подключения библиотек #include <> ? Не может быть конфликтов если не в том порядке их подключить?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
у меня почему-то при _GUICtrlListView_Create таблица ListView видна на всех вкладках Tab
Интересно почему? ))
UDF функции не обрабатываются нативными, для этого нужно либо строить свой собственный обработчик вкладок, либо делать костыль:
Код:
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <TabConstants.au3>

$hGUI = GUICreate("Example 1", 700, 430)

$iTab = GUICtrlCreateTab(1, 1, 690, 330, BitOR($TCS_FIXEDWIDTH, $TCS_BUTTONS, $TCS_FLATBUTTONS))

$iTabItem1 = GUICtrlCreateTabItem("Tab1")
$iTabItem2 = GUICtrlCreateTabItem("Tab2")

$ListView = _GUICtrlListView_Create($hGUI, "", 10, 20, 480, 400, BitOR($LVS_DEFAULT, $WS_BORDER))
_GUICtrlListView_SetExtendedListViewStyle($ListView, $LVS_EX_FULLROWSELECT)

_GUICtrlListView_AddColumn($ListView, "Peter", 83)
_GUICtrlListView_AddColumn($ListView, "Paul", 83)
_GUICtrlListView_AddColumn($ListView, "Mary", 83)

For $i = 1 To 10
    _GUICtrlListView_AddItem($ListView, "Peter " & $i - 1)
    
    If Mod($i, 4) Then
        _GUICtrlListView_AddSubItem($ListView, $i - 1, "Paul " & $i - 1, 1)
    EndIf
    _GUICtrlListView_AddSubItem($ListView, $i - 1, "Mary " & $i - 1, 2)
Next

WinSetState($ListView, '', @SW_HIDE)

GUICtrlCreateTabItem("Tab3")
GUICtrlCreateTabItem("Tab4")

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $iTab
            If GUICtrlRead($iTab, 1) = $iTabItem2 Then
                WinSetState($ListView, '', @SW_SHOW)
            Else
                WinSetState($ListView, '', @SW_HIDE)
            EndIf
    EndSwitch
WEnd


есть ли какой-то порядок подключения библиотек #include
Нет, это не имеет значения если они все в шапке.
 
Автор
kodges

kodges

Новичок
Сообщения
42
Репутация
0
UDF функции не обрабатываются нативными, для этого нужно либо строить свой собственный обработчик вкладок, либо делать костыль:
Судя по скорости отображения ListView после переключения на вкладку 2, можно сделать вывод что костыль работает весьма медленно. То есть использование нативных функций предпочтительно? Они всегда работают быстрее?
 

CreatoR

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

ControlHide($hGUI, '', $ListView)

...

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $iTab
            If GUICtrlRead($iTab, 1) = $iTabItem2 Then
                ControlShow($hGUI, '', $ListView)
            Else
                ControlHide($hGUI, '', $ListView)
            EndIf
    EndSwitch
WEnd


использование нативных функций предпочтительно?
Не всегда, просто не желательно мешать нативные и UDF.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Ещё так можно:

Код:
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <TabConstants.au3>

$hGUI = GUICreate("Example 1", 700, 430)

$iTab = GUICtrlCreateTab(1, 1, 690, 330, BitOR($TCS_FIXEDWIDTH, $TCS_BUTTONS, $TCS_FLATBUTTONS))

$iTabItem1 = GUICtrlCreateTabItem("Tab1")
$iTabItem2 = GUICtrlCreateTabItem("Tab2")

$ListView = GUICtrlCreateListView("", 10, 20, 480, 400, BitOR($LVS_DEFAULT, $WS_BORDER), $LVS_EX_FULLROWSELECT)

$iTabItem3 = GUICtrlCreateTabItem("Tab3")
$iTabItem4 = GUICtrlCreateTabItem("Tab4")

_GUICtrlListView_AddColumn($ListView, "Peter", 83)
_GUICtrlListView_AddColumn($ListView, "Paul", 83)
_GUICtrlListView_AddColumn($ListView, "Mary", 83)

For $i = 1 To 10
    _GUICtrlListView_AddItem($ListView, "Peter " & $i - 1)
    
    If Mod($i, 4) Then
        _GUICtrlListView_AddSubItem($ListView, $i - 1, "Paul " & $i - 1, 1)
    EndIf
    _GUICtrlListView_AddSubItem($ListView, $i - 1, "Mary " & $i - 1, 2)
Next

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd


В чём принципиальная потребность использовать именно _GUICtrlListView_Create?
 
Верх