Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   Вопрос по GUI - GUICtrlSetData (http://forum.oszone.net/showthread.php?t=143230)

Space-06 22-06-2009 13:49 1148921

Вопрос по GUI - GUICtrlSetData
 
Вообщем собственно сам вопрос: есть код по созданию GUI,
Код:

#include "array.au3"
#include "mysql.au3"
#include <GUIConstants.au3>

; Create GUI
GUICreate("History Show",800,500)
$clientIDs=GUICtrlCreateList ("",10,30,100,200 )
$rcvrAccs=GUICtrlCreateList ("",120,30,100,200)
$results=GUICtrlCreateEdit ("", 230,30,570,460)

_MySQL_InitLibrary()
$MysqlConn = _MySQL_Init()
$connected = _MySQL_Real_Connect($MysqlConn, "127.0.0.1", "root","", "chat")
If $connected = 0 Then
    $errno = _MySQL_errno($MysqlConn)
    MsgBox(0,"Error:",$errno & @LF & _MySQL_error($MysqlConn))
    If $errno = $CR_UNKNOWN_HOST Then MsgBox(0,"Error:","$CR_UNKNOWN_HOST" & @LF & $CR_UNKNOWN_HOST)
Endif
$query = "/*!40101 SET NAMES 'cp1251' */"
_MySQL_Real_Query($MysqlConn, $query)
$query = "SELECT DISTINCT ClientID FROM hist"
_MySQL_Real_Query($MysqlConn, $query)

$res = _MySQL_Store_Result($MysqlConn)
$gg = _MySQL_Fetch_Result_StringArray($res)
;_ArrayDelete($gg,0)
;_ArrayDisplay($gg)


GUISetState ()      ; will display an empty dialog box
; Run the GUI until the dialog is closed

Do
    $msg = GUIGetMsg()
    Select
    case
$msg=$results
        GUICtrlSetData($results,$gg, "")

    EndSelect

Until
$msg = $GUI_EVENT_CLOSE

_MySQL_Free_Result($res)
_MySQL_Close($MysqlConn)
_MySQL_EndLibrary()

Собственно основная часть кода обрабатывает Базу и выдает в итоге массив с значениями который необходимо в результате выполнения вставить в GUICtrlSetData, первый запрос создает первый массив значания строк кторого необходимо вставить в $clientIDs, второй ( в коде не отображен) будет в $rcvrAccs, и в последствии выбрав значения из этих контров - будет выполнен результирующий запрос к базе - результат которого будет в $results.

Прошу вашей помощи в подсказках решения, строго не судите.

proxy 22-06-2009 16:14 1149051

Вложений: 1
вариант, во вложении.
Обновил...

Space-06 25-06-2009 08:29 1151177

Доброго здравия !
Спасибо за пример он как нельзя кстати подходит к моему примеру но у меня маленький вопрос по функции вызова моих результатов, в вашем примере вы так и пишите в Case - вызов функции по запросу.

Switch $iwParam
Case $clientIDs
MsgBox(64, 'Внимание', 'Клик по Clients ListView' & @CRLF & _
'Индикс: ' & $iIndex & @CRLF & _
'Текст: ' & $sText & @CRLF & _
соответсвующих функций')

здесь все понятно - что нужное нам значение находится в $sText - так вот собственно сам то и вопрос - как из моего кода сделать эту самую функцию. Прошу не пинать сильно и бить ногами, с функциями чуток слабоват. :(

И еще в коде мы объявили сразу $gg - а нам бы его вернуть из при первой инициализации интерфейса - выполнением запроса к базе, чтоб массив заполнился нужными нам значениями - а их то уже представить в ClientIDs

proxy 25-06-2009 15:40 1151503

Обновил, осталось только сформировать запрос в базу на вывод данных по выбранным позициям - в коде помеченно комментарием.

Space-06 07-07-2009 07:34 1160759

Вложений: 1
Доброго времени суток еще раз, стал чуток по коду разбираться.
Да я согласен немного сложноватый для меня вопрос, но стал запускать чуток правленный собой код, ( поправил читание параметров из файла) - и все равно выходит с ошибкой.

одна ошибка Error in my_thread_global_end(): 1 threads didn't exit ( она и не критичная)
другая:
(90) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
_GUICtrlListView_AddItem($hList, $aArray[$i])
_GUICtrlListView_AddItem($hList, ^ ERROR
>Exit code: 1 Time: 9.133

если закоментировать получения массива из запроса - то скрипт доробатывает до построения GUI, но мне бы все таки разобраться бы с далнейшим решением...

proxy 07-07-2009 09:26 1160824

псоле:

$gg = _SQL_GetData($sHost,$sUser,$sPass,$sDbName, 'SELECT DISTINCT ClientID FROM hist')

Массив выводится? Показывается?:
_ArrayDisplay($gg)

А еслудующая функция: Обработка только одномерного массива!
_ArrayToList($clientIDs, $gg, 1)

Space-06 07-07-2009 09:55 1160846

Цитата:

Цитата proxy
$gg = _SQL_GetData($sHost,$sUser,$sPass,$sDbName, 'SELECT DISTINCT ClientID FROM hist') »

да массив выводится, а вот при обращении к функции ошибка выходит:
Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
_GUICtrlListView_AddItem($hList, $aArray[$i])
_GUICtrlListView_AddItem($hList, ^ ERROR
>Exit code: 1 Time: 7.866

proxy 07-07-2009 10:01 1160849

Массив там точно одномерный?

В сообщение ошибки - в массиве используется не верный индекс...

Space-06 07-07-2009 10:28 1160863

массив там точно одномерный, в ArrayDisplay показывает только две колонки Row и Col0
в колонке наш массив,

Может нам проще попытаться поступить, у нас проблема с выводом данных в GUICtrlListView_AddItem
может попробовать как то по другому все сделать?
к примеру массив вывести в временный файл - считать от туда и вставить,
или на совсем худший вариант - мускульную базу перегнать в dbf а с помощью AutoIt работать с dbf базой по нашему алгоритму...
просто уверен куча ошибок еще в самом мускуле. Как бы только с dbf можно было бы все организовать?

proxy 07-07-2009 15:07 1161083

проще уже базу или только одну таблицу из нее экспартировать и я потестю .. )

попробуй мож так, посмотрим на каком i будет error:
читать дальше »


Код:

#include 'array.au3'
#include 'mysql.au3'
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>

Global $sHost = FileReadLine ("set.ini",1)
Global $sUser = FileReadLine ("set.ini",2)
Global $sPass = FileReadLine ("set.ini",3)
Global $sDbName = FileReadLine ("set.ini",4)

Global $hMainWin    = GUICreate('History Show', 800, 500)
    GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')

Global $clientIDs  = GUICtrlCreateListView('', 10,  30, 100, 200)
    _GUICtrlListView_SetExtendedListViewStyle($clientIDs, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
    _GUICtrlListView_AddColumn($clientIDs, 'CLients', 96)

Global $rcvrAccs    = GUICtrlCreateListView('', 120, 30, 100, 200)
    _GUICtrlListView_SetExtendedListViewStyle($rcvrAccs, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
    _GUICtrlListView_AddColumn($rcvrAccs, 'Access', 96)

Global $results = GUICtrlCreateEdit('', 230, 30, 570, 460)

$gg = _SQL_GetData($sHost,$sUser,$sPass,$sDbName, 'SELECT DISTINCT ClientID FROM hist')
_ArrayDisplay($gg)
_ArrayToList($clientIDs, $gg, 1)

;$gg = _SQL_GetData('127.0.0.1', 'root', 'GsM2562r', 'chat', 'SELECT DISTINCT rcvrAccs FROM hist')
;_ArrayDisplay($gg)
;_ArrayToList($rcvrAccs, $qq, 1)


Func _SQL_GetData($sHost, $sUser, $sPass, $sDbName, $sQuery)
    Local $MysqlConn, $connected, $errno, $res, $gg

    _MySQL_InitLibrary()
    $MysqlConn = _MySQL_Init()
    $connected = _MySQL_Real_Connect($MysqlConn, $sHost, $sUser, $sPass, $sDbName)
    If $connected = 0 Then
        $errno = _MySQL_errno($MysqlConn)
        MsgBox(0,'Error:',$errno & @LF & _MySQL_error($MysqlConn))
        If $errno = $CR_UNKNOWN_HOST Then MsgBox(0, 'Error:', '$CR_UNKNOWN_HOST' & @LF & $CR_UNKNOWN_HOST)
    Endif

    $query = "/*!40101 SET NAMES 'cp1251' */"
    _MySQL_Real_Query($MysqlConn, $query)
    $query = $sQuery
    _MySQL_Real_Query($MysqlConn, $query)

    $res = _MySQL_Store_Result($MysqlConn)
    $gg = _MySQL_Fetch_Result_StringArray($res)

    Return $gg
EndFunc

GUISetState()
Do
    $msg = GUIGetMsg()
;~  Select
;~      Case
;~  EndSelect

Until $msg = $GUI_EVENT_CLOSE

_MySQL_Free_Result($res)
_MySQL_Close($MysqlConn)
_MySQL_EndLibrary()

Func _ArrayToList($hList, $aArray, $iStart=0, $iEnd=0)
    If NOT $iEnd Then $iEnd = UBound($aArray)-1
    Local $i
    For $i=$iStart To $iEnd
        MsgBox(0, 'Ввод данных', 'i: ' & $i & @CRLF & 'Строка: ' & $aArray[$i])
        _GUICtrlListView_AddItem($hList, $aArray[$i])
    Next
EndFunc

Func
WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
;~  Local $tBuffer
    $hWndListView = $iwParam
    If Not IsHWnd($hWndListView) Then $hWndListView = GUICtrlGetHandle($hWndListView)

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
        Case $hWndListView
            Switch $iCode
                Case $NM_CLICK
                    Local $iIndex = _GUICtrlListView_GetSelectedIndices($hWndListView)
                    Local $sText = _GUICtrlListView_GetItemText($hWndListView, $iIndex)
                    Switch $iwParam
                        Case $clientIDs
                            _GetClientData($sText)
                        Case $rcvrAccs
                            _GetAccessData($sText)
                    EndSwitch
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc  ;==>WM_NOTIFY

Func _GetClientData($sText)
    MsgBox(0, 'Client выбранно:', $sText)
;~  Сформировать нужный SELECT запрос для базы:
    Local $aResult = _SQL_GetData('127.0.0.1', 'root', 'GsM2562r', 'chat', 'SELECT DISTINCT ClientID FROM hist')
    GUICtrlSetData($results, _ArrayToString($aResult, 1, UBound($aResult), @CRLF))
EndFunc

Func _GetAccessData($sText)
    MsgBox(0, 'Access выбранно:', $sText)
;~  Сформировать нужный SELECT запрос для базы:
    Local $aResult = _SQL_GetData('127.0.0.1', 'root', 'GsM2562r', 'chat', 'SELECT DISTINCT rcvrAccs FROM hist')
    GUICtrlSetData($results, _ArrayToString($aResult, 1, UBound($aResult), @CRLF))
EndFunc


Space-06 08-07-2009 08:25 1161729

Ошибка на выводе в MsgBox, ругается на
Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
MsgBox(0, "???? ??????", "i: " & $i & @CRLF & "??????: " & $aArray[$i])
MsgBox(0, "???? ??????", "i: " & $i & @CRLF & "??????: " & ^ ERROR
>Exit code: 1

вроде какая то ошибка в $aArray

proxy 08-07-2009 09:48 1161781

Цитата:

Цитата Space-06
вроде какая то ошибка в $aArray »

........) она была и есть в массиве.
Какой последний $i был в сообщение?
И сколько строк в массиве?

и вот так еще можно потестить
читать дальше »


Код:

#include 'array.au3'
#include 'mysql.au3'
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>

Global $sHost = FileReadLine ("set.ini",1)
Global $sUser = FileReadLine ("set.ini",2)
Global $sPass = FileReadLine ("set.ini",3)
Global $sDbName = FileReadLine ("set.ini",4)

Global $hMainWin    = GUICreate('History Show', 800, 500)
    GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')

Global $clientIDs  = GUICtrlCreateListView('', 10,  30, 100, 200)
    _GUICtrlListView_SetExtendedListViewStyle($clientIDs, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
    _GUICtrlListView_AddColumn($clientIDs, 'CLients', 96)

Global $rcvrAccs    = GUICtrlCreateListView('', 120, 30, 100, 200)
    _GUICtrlListView_SetExtendedListViewStyle($rcvrAccs, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
    _GUICtrlListView_AddColumn($rcvrAccs, 'Access', 96)

Global $results = GUICtrlCreateEdit('', 230, 30, 570, 460)

$gg = _SQL_GetData($sHost,$sUser,$sPass,$sDbName, 'SELECT DISTINCT ClientID FROM hist')
_ArrayDisplay($gg)
_ArrayToList($clientIDs, $gg, 1)

;$gg = _SQL_GetData('127.0.0.1', 'root', 'GsM2562r', 'chat', 'SELECT DISTINCT rcvrAccs FROM hist')
;_ArrayDisplay($gg)
;_ArrayToList($rcvrAccs, $qq, 1)


Func _SQL_GetData($sHost, $sUser, $sPass, $sDbName, $sQuery)
    Local $MysqlConn, $connected, $errno, $res, $gg

    _MySQL_InitLibrary()
    $MysqlConn = _MySQL_Init()
    $connected = _MySQL_Real_Connect($MysqlConn, $sHost, $sUser, $sPass, $sDbName)
    If $connected = 0 Then
        $errno = _MySQL_errno($MysqlConn)
        MsgBox(0,'Error:',$errno & @LF & _MySQL_error($MysqlConn))
        If $errno = $CR_UNKNOWN_HOST Then MsgBox(0, 'Error:', '$CR_UNKNOWN_HOST' & @LF & $CR_UNKNOWN_HOST)
    Endif

    $query = "/*!40101 SET NAMES 'cp1251' */"
    _MySQL_Real_Query($MysqlConn, $query)
    $query = $sQuery
    _MySQL_Real_Query($MysqlConn, $query)

    $res = _MySQL_Store_Result($MysqlConn)
    $gg = _MySQL_Fetch_Result_StringArray($res)

    Return $gg
EndFunc

GUISetState()
Do
    $msg = GUIGetMsg()
;~  Select
;~      Case
;~  EndSelect

Until $msg = $GUI_EVENT_CLOSE

_MySQL_Free_Result($res)
_MySQL_Close($MysqlConn)
_MySQL_EndLibrary()

Func _ArrayToList($hList, $aArray, $iStart=0, $iEnd=0)
    If NOT IsArray($aArray) Then Exit MsgBox(48, 'Внимание', 'Ошибка: $aArray не является маасивом')
    If NOT $iEnd Then $iEnd = UBound($aArray)-1
    MsgBox(48, 'Инфо', 'В массиве всего элементов: ' & (UBound($aArray)-1) & @CRLF & 'Перебор массива с: ' & $iStart & ' по: ' & $iEnd)
    Local $i
    For $i=$iStart To $iEnd
        MsgBox(0, 'Ввод данных', 'i: ' & $i)
        _GUICtrlListView_AddItem($hList, $aArray[$i])
    Next
EndFunc

Func
WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
;~  Local $tBuffer
    $hWndListView = $iwParam
    If Not IsHWnd($hWndListView) Then $hWndListView = GUICtrlGetHandle($hWndListView)

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
        Case $hWndListView
            Switch $iCode
                Case $NM_CLICK
                    Local $iIndex = _GUICtrlListView_GetSelectedIndices($hWndListView)
                    Local $sText = _GUICtrlListView_GetItemText($hWndListView, $iIndex)
                    Switch $iwParam
                        Case $clientIDs
                            _GetClientData($sText)
                        Case $rcvrAccs
                            _GetAccessData($sText)
                    EndSwitch
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc  ;==>WM_NOTIFY

Func _GetClientData($sText)
    MsgBox(0, 'Client выбранно:', $sText)
;~  Сформировать нужный SELECT запрос для базы:
    Local $aResult = _SQL_GetData('127.0.0.1', 'root', 'GsM2562r', 'chat', 'SELECT DISTINCT ClientID FROM hist')
    GUICtrlSetData($results, _ArrayToString($aResult, 1, UBound($aResult), @CRLF))
EndFunc

Func _GetAccessData($sText)
    MsgBox(0, 'Access выбранно:', $sText)
;~  Сформировать нужный SELECT запрос для базы:
    Local $aResult = _SQL_GetData('127.0.0.1', 'root', 'GsM2562r', 'chat', 'SELECT DISTINCT rcvrAccs FROM hist')
    GUICtrlSetData($results, _ArrayToString($aResult, 1, UBound($aResult), @CRLF))
EndFunc


Space-06 08-07-2009 11:04 1161844

:)
вообщем вышло сообщение: в массиве всего элементов 4, перебор элементов с 1 по 4
следующее сообщение: ввод данных i=1 и после него ошибка:
Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
_GUICtrlListView_AddItem($hList, $aArray[$i])
_GUICtrlListView_AddItem($hList, ^ ERROR
>Exit code: 1

proxy 08-07-2009 13:30 1161983

Цитата:

Цитата Space-06
вообщем вышло сообщение: в массиве всего элементов 4, перебор элементов с 1 по 4
следующее сообщение: ввод данных i=1 и после него ошибка:
Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
_GUICtrlListView_AddItem($hList, $aArray[$i])
_GUICtrlListView_AddItem($hList, ^ ERROR
>Exit code: 1 »

очень . очень . странный . тут . массив...который передается
хз, хз. поэксперементирую на своих базах, чуть позже

Странно, что ошибка в функции, а не результат её выполнения.

Space-06 03-08-2009 09:11 1184059

Знаю что грамоздко может получится, я вот что еще пытаюсь надумать, а если
$clientIDs и $rcvrAccs - сформировать в xml из MySQL и с ними уже эксперементировать.

может что и выйдет ...

SyDr 03-08-2009 10:21 1184106

Код:

Func _ArrayToList($hList, $aArray, $iStart=0, $iEnd=0)
        If NOT $iEnd Then $iEnd = UBound($aArray)-1
        Local $i
        For $i=$iStart To $iEnd
                MsgBox(4096, "", $iStart & " " & $iEnd & @CRLF & $i & " " & $aArray[$i])
                _GUICtrlListView_AddItem($hList, $aArray[$i])
        Next
EndFunc

Сообщение можно скопировать с помощью Ctrl+C
И покажи заодно что выводит _ArrayDisplay($gg)

Space-06 03-08-2009 21:30 1184691

Сообщение
Цитата:

Цитата SyDr
MsgBox(4096, "", $iStart & " " & $iEnd & @CRLF & $i & " " & $aArray[$i]) »

не вывелось ошибка:
Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
MsgBox(4096, "", $iStart & " " & $iEnd & @CRLF & $i & " " & $aArray[$i])
MsgBox(4096, "", $iStart & " " & $iEnd & @CRLF & $i & " " & ^ ERROR
>Exit code: 1 Time: 2.142

_ArrayDisplay($gg) выводит все как надо:
Row Col0
[0] ClientID
[1] Elpanov
[2] Debb

SyDr 03-08-2009 22:53 1184756

Код:

Func _ArrayToList($hList, $aArray, $iStart=0, $iEnd=0)
        If NOT $iEnd Then $iEnd = UBound($aArray)-1
        Local $i
        For $i=$iStart To $iEnd
                MsgBox(4096, "", $iStart & " " & $iEnd & @CRLF & $i)
                _GUICtrlListView_AddItem($hList, $aArray[$i])
        Next
EndFunc

А теперь что выводит прямо перед ошибкой?

Space-06 03-08-2009 23:04 1184767

Вывел _ArrayDisplay($gg) и
MsgBox:
0 2
0

SyDr 03-08-2009 23:24 1184782

Код:

Func _ArrayToList($hList, $aArray, $iStart=0, $iEnd=0)
        If NOT $iEnd Then $iEnd = UBound($aArray)-1
        Local $i
        For $i=$iStart+1 To $iEnd
                _GUICtrlListView_AddItem($hList, $aArray[$i])
        Next
EndFunc

Чем является $gg[0]?
Я не могу понять, почему он ругается на нулевой элемент массива.
Это... ClientID должно добавлятся в ListView?

Space-06 03-08-2009 23:37 1184796

Вложений: 2
$gg[0] - "ClientID" - это название поля

Цитата:

Цитата SyDr
Это... ClientID должно добавлятся в ListView? »

да это ClientID ...

приложил файлы к сообщению...


Время: 23:55.

Время: 23:55.
© OSzone.net 2001-