Войти

Показать полную графическую версию : Вопрос по GUI - GUICtrlSetData


Страниц : [1] 2

Space-06
22-06-2009, 13:49
Вообщем собственно сам вопрос: есть код по созданию 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
вариант, во вложении.
Обновил...

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

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

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

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

proxy
25-06-2009, 15:40
Обновил (http://forum.oszone.net/post-1149051-2.html), осталось только сформировать запрос в базу на вывод данных по выбранным позициям - в коде помеченно комментарием.

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

одна ошибка 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
псоле:

$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
$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
Массив там точно одномерный?

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

Space-06
07-07-2009, 10:28
массив там точно одномерный, в ArrayDisplay показывает только две колонки Row и Col0
в колонке наш массив,

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

proxy
07-07-2009, 15:07
проще уже базу или только одну таблицу из нее экспартировать и я потестю .. )

попробуй мож так, посмотрим на каком 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
Ошибка на выводе в 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
вроде какая то ошибка в $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
:)
вообщем вышло сообщение: в массиве всего элементов 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
вообщем вышло сообщение: в массиве всего элементов 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
Знаю что грамоздко может получится, я вот что еще пытаюсь надумать, а если
$clientIDs и $rcvrAccs - сформировать в xml из MySQL и с ними уже эксперементировать.

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

SyDr
03-08-2009, 10:21
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
Сообщение 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
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
Вывел _ArrayDisplay($gg) и
MsgBox:
0 2
0

SyDr
03-08-2009, 23:24
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?




© OSzone.net 2001-2012