Sign in to follow this  
Followers 0
Shinies

Trouble creating a child window

7 posts in this topic

Hey,

I have recently returned to AutoIt after a few years, and am re-learning a lot of things. I have run into a problem that has me stumped.

The main window in my program works great. What im trying to do is open up a child window that takes focus from the main window where the user can view/edit some info gathered from a UDF listview control. The user will then be able to either save or cancel once done editing the values in the controls. Gathering the data from the listview and displaying it in the child window works fine, however once the new GUI gets to the loop stage checking GUIGetMsg() it seems to be becoming unresponsive (need to force close the window).

I have a few msgbox's in my script just for pinpointing where the script is hanging, so dont worry about those, and its pretty commented so shouldnt be too hard to follow. Ill include the function which contains child GUI window as well as the full script minus functions.

Function calling creation of new GUI:

Func _EditMember($mem)

Local $f, $lc, $i, $line


;Create Edit Member Window
$WinEditMem = GUICreate($mem, 595, 227, 384, 145, Default, Default, $WinMain)
$LabEditMemName = GUICtrlCreateLabel($mem, 112, 32, 32, 17)
$LabEditMemScore = GUICtrlCreateLabel("Score:", 16, 80, 35, 17)
$LabEditMemTc = GUICtrlCreateLabel("Troop Count:", 16, 112, 66, 17)
$LabEditMemCoord = GUICtrlCreateLabel("Coords", 16, 144, 37, 17)
$InputEditMemScore = GUICtrlCreateInput("-", 88, 80, 201, 21)
$InputEditMemTc = GUICtrlCreateInput("-", 88, 112, 201, 21)
$InputEditMemCoord = GUICtrlCreateInput("-", 88, 144, 201, 21)
$EditEditMemNote = GUICtrlCreateEdit("Notes...", 296, 8, 289, 161)
$ButtonEditMemSave = GUICtrlCreateButton("Save", 200, 184, 83, 25)
$ButtonEditMemCancel = GUICtrlCreateButton("Cancel", 296, 184, 83, 25)
GUISetState(@SW_SHOW, $WinEditMem)

;Get member data and display
$f = FileOpen($ResDir & "\" & $allypointer & $MemDatatxt)
$lc = _FileCountLines($ResDir & "\" & $allypointer & $MemDatatxt)

;Cycle through memdat.txt
For $i = 1 to $lc
$line = FileReadLine($f, $i)
$line = StringSplit($line, "|")
If $line[1] = $mem Then ;If the name of the member = name passed to function
;Update controls with member data
GUICtrlSetData($InputEditMemTc, $line[2])
GUICtrlSetData($InputEditMemScore, $line[3])
GUICtrlSetData($InputEditMemCoord, $line[4])
;GUICtrlSetData($InputEditMemCoord, NOTES placeholder)
ExitLoop
EndIf

Next

MsgBox(0, "", "1")
;Window events
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
MsgBox(0, "", "3")
ExitLoop

Case $ButtonEditMemCancel
MsgBox(0, "", "4")
ExitLoop

EndSwitch
WEnd

;Delete window on way out of function
MsgBox(0, "", "7")
FileClose($f)
GUIDelete($WinEditMem)

EndFunc

Main program:

;==========================================================================================
;Includes
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <File.au3>
#include <Array.au3>
#include <String.au3>
#include <Date.au3>
#include <IE.au3>
#include <GuiStatusBar.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GuiTab.au3>
;==========================================================================================

;==========================================================================================

;Constant variables
Global $WinMainTitle = "King's Empire Alliance Manager"
Global $ProgVersion = "v1.00"
Global $LastUpdate = "2012/05/02"
Global $IsConnect = "Searching..."
Global $IsUpToDate = "Searching..."
;Directory paths
Global $ResDir = @ScriptDir & "\Resources"
;File names
Global $SavedBoardtxt = "\SavedBoard.txt"
Global $MsgBoardtxt = "\MsgBoard.html"
Global $PrevMemDatatxt = "\PrevMemData.txt"
Global $MemDatatxt = "\MemData.txt"
Global $Indextxt = "\Index.txt"
Global $AllyLogojpg = "\logo.jpg"
;Global varliables
Global $totstr = "0"
Global $totscore = "0"
Global $prevtotscore = "0"
Global $prevtotstr = "0"
;Initial allaince to load
$f = FileOpen($ResDir & $Indextxt)
Global $allypointer = FileReadLine($f, 1)
FileClose($f)
;Tab globals
Global $tabcur
Global $tabprev = "0"
;==========================================================================================


;Declare onexit function
OnAutoItExitRegister( "_OnExit")

$WinMain = GUICreate($WinMainTitle, 750, 675)

;Tabs
$TabMain = _GUICtrlTab_Create($WinMain, 16, 95, 721, 20)

;Status bar
Local $vPartEdge[2] = [500, 600]
Local $vPartText[2] = [@Tab & _NowDate(), @TAB & $IsConnect]
$StatusBarMain = _GUICtrlStatusBar_Create($WinMain, $vPartEdge, $vPartText)

Global $AllyPic = GUICtrlCreatePic($ResDir & "\" & $allypointer & $AllyLogojpg, 16, 15, 400, 100)
$LabelMainLastUpdate = GUICtrlCreateLabel("Last Updated:", 428, 25, 70, 17)
$LabLastUpdate = GUICtrlCreateLabel($LastUpdate, 503, 25, 80, 17)
$LabIsUpToDate = GUICtrlCreateLabel($IsUpToDate, 473, 45, 80, 17)
$LabMainProgVersion = GUICtrlCreateLabel($ProgVersion, 712, 5, 31, 17)

$ButtonMainConnect = GUICtrlCreateButton("Connect", 430, 85, 147, 17)
$ButtonMainSync = GUICtrlCreateButton("Sync", 592, 24, 147, 17)
$ButtonMainWiki = GUICtrlCreateButton("WiKi", 592, 48, 147, 17)
$ButtonMainMaps = GUICtrlCreateButton("Maps", 592, 72, 147, 17)
$ButtonMainChat = GUICtrlCreateButton("Chat", 592, 96, 147, 17)

;Group alliance
$GroupMainAlly = GUICtrlCreateGroup("Alliance:-", 16, 120, 721, 115)
$LabMainAllyStr = GUICtrlCreateLabel("Total Strength:", 120, 183, 74, 17)
$LabMainAllyScore = GUICtrlCreateLabel("Total Score:", 120, 208, 62, 17)
$AllyStr = GUICtrlCreateLabel("-", 200, 183, 75, 17)
$AllyScore = GUICtrlCreateLabel("-", 200, 208, 75, 17)
$ProgressMainAllyStr = GUICtrlCreateProgress(120, 150, 475, 25)
GUICtrlSetData(-1, 73)
$LabMainStrAllyGainD = GUICtrlCreateLabel("/day", 315, 183, 75, 17)
$LabMainStrAllyGainW = GUICtrlCreateLabel("/week", 415, 183, 75, 17)
$LabMainStrAllyGainM = GUICtrlCreateLabel("/month", 520, 183, 90, 17)
$LabMainScoreAllyGainD = GUICtrlCreateLabel("/day", 315, 208, 75, 17)
$LabMainScoreAllyGainW = GUICtrlCreateLabel("/week", 415, 208, 75, 17)
$LabMainScoreAllyGainM = GUICtrlCreateLabel("/month", 520, 208, 90, 17)
$LabMainAllyHealth = GUICtrlCreateLabel("Health:", 330, 132, 40, 17)

;Group members
$GroupMainMembers = GUICtrlCreateGroup("Members:-", 16, 240, 721, 241)
$ListViewMainMembers = _GUICtrlListView_Create($WinMain, "", 32, 264, 690, 200, BitOR($LVS_SINGLESEL, $LVS_REPORT))
_GUICtrlListView_SetExtendedListViewStyle($ListViewMainMembers, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_TWOCLICKACTIVATE, $LVS_EX_DOUBLEBUFFER))
_GUICtrlListView_AddColumn($ListViewMainMembers, "Member", 100)
_GUICtrlListView_AddColumn($ListViewMainMembers, "Troops", 145)
_GUICtrlListView_AddColumn($ListViewMainMembers, "Score", 145)
_GUICtrlListView_AddColumn($ListViewMainMembers, "Co-ordinates", 300)
Global $B_DESCENDING[_GUICtrlListView_GetColumnCount($ListViewMainMembers)]

;Group message board
$GroupMainMsgBoard = GUICtrlCreateGroup("Message Board:-", 16, 488, 721, 153)
$oMainIE = _IECreateEmbedded()
$MainIEControl = GUICtrlCreateObj($oMainIE, 27, 505, 700, 125)


GUISetState(@SW_SHOW, $WinMain)

;Register interactions with the tab
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

_StartUpOperations()

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit

EndSwitch
WEnd

Let me know if you guys need any more of the script or any other info! Hope this is all clear...

Thanks for any help

Smerk

Share this post


Link to post
Share on other sites



What windows become unresponsive: main or child windows?? For me both works well. Maybe I missed something.


When the words fail... music speaks

Share this post


Link to post
Share on other sites

#3 ·  Posted (edited)

EDIT: Upon futher investigation it looks like the script actually runs okay when its not in the same directory as the files it is meant to parse... When it IS in the same directory it gets all the info and displays them in the inputs fine but when it gets to the while loop it becomes unresponsive... so confused...

The script itself becomes unresponsive, leading to both windows freezing.

When run separately they both work fine. The problem arises when the function _EditMember() is called from within the main script.

I was trying to make it easier by excluding a bunch of code that is irrelevant but ill post the entire program:

;==========================================================================================
;Includes
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
;==========================================================================================

;==========================================================================================

;Constant variables
Global $WinMainTitle = "King's Empire Alliance Manager"
Global $ProgVersion = "v1.00"
Global $LastUpdate = "2012/05/02"
Global $IsConnect = "Searching..."
Global $IsUpToDate = "Searching..."
;Directory paths
Global $ResDir = @ScriptDir & "Resources"
;File names
Global $SavedBoardtxt = "SavedBoard.txt"
Global $MsgBoardtxt = "MsgBoard.html"
Global $PrevMemDatatxt = "PrevMemData.txt"
Global $MemDatatxt = "MemData.txt"
Global $Indextxt = "Index.txt"
Global $AllyLogojpg = "logo.jpg"
;Global varliables
Global $totstr = "0"
Global $totscore = "0"
Global $prevtotscore = "0"
Global $prevtotstr = "0"
;Initial allaince to load
$f = FileOpen($ResDir & $Indextxt)
Global $allypointer = FileReadLine($f, 1)
FileClose($f)
;Tab globals
Global $tabcur
Global $tabprev = "0"
;==========================================================================================


;Declare onexit function
OnAutoItExitRegister( "_OnExit")

$WinMain = GUICreate($WinMainTitle, 750, 675)

;Tabs
$TabMain = _GUICtrlTab_Create($WinMain, 16, 95, 721, 20)

;Status bar
Local $vPartEdge[2] = [500, 600]
Local $vPartText[2] = [@Tab & _NowDate(), @TAB & $IsConnect]
$StatusBarMain = _GUICtrlStatusBar_Create($WinMain, $vPartEdge, $vPartText)

Global $AllyPic = GUICtrlCreatePic($ResDir & "" & $allypointer & $AllyLogojpg, 16, 15, 400, 100)
$LabelMainLastUpdate = GUICtrlCreateLabel("Last Updated:", 428, 25, 70, 17)
$LabLastUpdate = GUICtrlCreateLabel($LastUpdate, 503, 25, 80, 17)
$LabIsUpToDate = GUICtrlCreateLabel($IsUpToDate, 473, 45, 80, 17)
$LabMainProgVersion = GUICtrlCreateLabel($ProgVersion, 712, 5, 31, 17)

$ButtonMainConnect = GUICtrlCreateButton("Connect", 430, 85, 147, 17)
$ButtonMainSync = GUICtrlCreateButton("Sync", 592, 24, 147, 17)
$ButtonMainWiki = GUICtrlCreateButton("WiKi", 592, 48, 147, 17)
$ButtonMainMaps = GUICtrlCreateButton("Maps", 592, 72, 147, 17)
$ButtonMainChat = GUICtrlCreateButton("Chat", 592, 96, 147, 17)

;Group alliance
$GroupMainAlly = GUICtrlCreateGroup("Alliance:-", 16, 120, 721, 115)
$LabMainAllyStr = GUICtrlCreateLabel("Total Strength:", 120, 183, 74, 17)
$LabMainAllyScore = GUICtrlCreateLabel("Total Score:", 120, 208, 62, 17)
$AllyStr = GUICtrlCreateLabel("-", 200, 183, 75, 17)
$AllyScore = GUICtrlCreateLabel("-", 200, 208, 75, 17)
$ProgressMainAllyStr = GUICtrlCreateProgress(120, 150, 475, 25)
GUICtrlSetData(-1, 73)
$LabMainStrAllyGainD = GUICtrlCreateLabel("/day", 315, 183, 75, 17)
$LabMainStrAllyGainW = GUICtrlCreateLabel("/week", 415, 183, 75, 17)
$LabMainStrAllyGainM = GUICtrlCreateLabel("/month", 520, 183, 90, 17)
$LabMainScoreAllyGainD = GUICtrlCreateLabel("/day", 315, 208, 75, 17)
$LabMainScoreAllyGainW = GUICtrlCreateLabel("/week", 415, 208, 75, 17)
$LabMainScoreAllyGainM = GUICtrlCreateLabel("/month", 520, 208, 90, 17)
$LabMainAllyHealth = GUICtrlCreateLabel("Health:", 330, 132, 40, 17)

;Group members
$GroupMainMembers = GUICtrlCreateGroup("Members:-", 16, 240, 721, 241)
$ListViewMainMembers = _GUICtrlListView_Create($WinMain, "", 32, 264, 690, 200, BitOR($LVS_SINGLESEL, $LVS_REPORT))
_GUICtrlListView_SetExtendedListViewStyle($ListViewMainMembers, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_TWOCLICKACTIVATE, $LVS_EX_DOUBLEBUFFER))
_GUICtrlListView_AddColumn($ListViewMainMembers, "Member", 100)
_GUICtrlListView_AddColumn($ListViewMainMembers, "Troops", 145)
_GUICtrlListView_AddColumn($ListViewMainMembers, "Score", 145)
_GUICtrlListView_AddColumn($ListViewMainMembers, "Co-ordinates", 300)
Global $B_DESCENDING[_GUICtrlListView_GetColumnCount($ListViewMainMembers)]

;Group message board
$GroupMainMsgBoard = GUICtrlCreateGroup("Message Board:-", 16, 488, 721, 153)
$oMainIE = _IECreateEmbedded()
$MainIEControl = GUICtrlCreateObj($oMainIE, 27, 505, 700, 125)


GUISetState(@SW_SHOW, $WinMain)

;Register interactions with the tab
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

_StartUpOperations()

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit

EndSwitch
WEnd

Func _StartUpOperations()

_ReadMemData()
_CalcAllyTotals()
_CalcAllyRates()
_StartMessageBoard()
_StartTabs()

EndFunc

Func _OnExit()

;Destroy controls to free memory
_GUICtrlListView_Destroy($ListViewMainMembers)
_GUICtrlStatusBar_Destroy($StatusBarMain)
_GUICtrlTab_Destroy($TabMain)

EndFunc

Func _ReadMemData()
;============================================
; Update members list
;============================================
Local $f, $lc, $line, $i, $memdat

;Delete any previous items
_GUICtrlListView_DeleteAllItems($ListViewMainMembers)

$f = FileOpen($ResDir & "" & $allypointer & $MemDatatxt)
$lc = _FileCountLines($ResDir & "" & $allypointer & $MemDatatxt)

;Loop through and parse data from file
For $i = 1 To $lc
$line = FileReadLine($f, $i)
If $line = "~" Then
ExitLoop
EndIf
$memdat = StringSplit($line, "|")
;Add data to listview
_GUICtrlListView_AddItem($ListViewMainMembers, $memdat[1])
_GUICtrlListView_AddSubItem($ListViewMainMembers, ($i - 1), $memdat[2], 1)
_GUICtrlListView_AddSubItem($ListViewMainMembers, ($i - 1), $memdat[3], 2)
_GUICtrlListView_AddSubItem($ListViewMainMembers, ($i - 1), $memdat[4], 3)
Next

FileClose($f)

EndFunc ;==>_ReadMemData

Func _CalcAllyTotals()
;============================================
; Calculate alliance totals
;============================================
Local $ic, $i, $tcval

;Delete any previous totals
$totstr = "0"
$totscore = "0"

$ic = _GUICtrlListView_GetItemCount($ListViewMainMembers)

;Loop through and gather data from listview
For $i = 1 To $ic
$tcval = _GUICtrlListView_GetItemText($ListViewMainMembers, ($i - 1), 1)
$tcval = StringReplace($tcval, ",", "")
$sval = _GUICtrlListView_GetItemText($ListViewMainMembers, ($i - 1), 2)
$sval = StringReplace($sval, ",", "")
$totstr = $totstr + $tcval
$totscore = $totscore + $sval
Next

;Display data
GUICtrlSetData($AllyStr, $totstr)
GUICtrlSetData($AllyScore, Int(($totscore/1000)))

EndFunc ;==>_CalcAllyTotals

Func _CalcAllyRates()
;============================================
; Calculate gains per day/week/month
;============================================

Local $f, $lc, $line, $memdat, $tcval, $sval, $scorepd, $strpd

;Delete any previous totals
$prevtotstr = "0"
$prevtotscore = "0"

$f = FileOpen($ResDir & "" & $allypointer & $PrevMemDatatxt)
$lc = _FileCountLines($ResDir & "" & $allypointer & $PrevMemDatatxt)

;Loop through and parse data from file
For $i = 1 To $lc
$line = FileReadLine($f, $i)
If $line = "~" Then
ExitLoop
EndIf
$memdat = StringSplit($line, "|")
$tcval = $memdat[2]
$tcval = StringReplace($tcval, ",", "")

$sval = $memdat[3]
$sval = StringReplace($sval, ",", "")

$prevtotstr = $prevtotstr + $tcval
$prevtotscore = $prevtotscore + $sval
Next

;Convert data
$scorepd = (($totscore - $prevtotscore) / _DateDiff("D", $LastUpdate, _NowCalcDate()))
$strpd = (($totstr - $prevtotstr) / _DateDiff("D", $LastUpdate, _NowCalcDate()))

;Display data
GUICtrlSetData($LabMainScoreAllyGainD, Int($scorepd/1000) & "/Day")
GUICtrlSetData($LabMainScoreAllyGainW, (Int($scorepd*7/1000)) & "/Week")
GUICtrlSetData($LabMainScoreAllyGainM, (Int($scorepd*30/1000)) & "/Month")
GUICtrlSetData($LabMainStrAllyGainD, Int($strpd) & "/Day")
GUICtrlSetData($LabMainStrAllyGainW, (Int($strpd*7)) & "/Week")
GUICtrlSetData($LabMainStrAllyGainM, (Int($strpd*30)) & "/Month")
FileClose($f)

EndFunc ;==>_CalcAllyRates

Func _StartMessageBoard()

Local $body, $f, $lc, $line, $i, $crisscross

;Navigate to messageboard page
_IENavigate($oMainIE, $ResDir & $MsgBoardtxt)
$body = _IETagNameGetCollection($oMainIE, "body", 0)

;Loop through saved boards.txt and collect entries
$f = FileOpen($ResDir & $SavedBoardtxt)
$lc = _FileCountLines($ResDir & $SavedBoardtxt)
For $i = 1 to $lc

;Check if even or odd number for table color
If Mod($i, 2) = 0 Then
$crisscross = "b0b0b0"
Else
$crisscross = "d0d0d0"
EndIf

$line = FileReadLine($f, $i)
$line = StringSplit($line, "|")

;Display entries
_IEDocInsertHTML($body, '                                       [i]' & $line[1] & "[/i] [b]" & $line[2] & ":[/b] " & $line[3] & '           ', "afterbegin")

Next

FileClose($f)

EndFunc

Func _StartTabs()

Local $f, $lc, $line, $i

;Open file and count how many alliances
$f = FileOpen($ResDir & $Indextxt)
$lc = _FileCountLines($ResDir & $Indextxt)

;For every allaince loop through and create a tab
For $i = 1 to $lc

$line = FileReadLine($f, $i)

_GUICtrlTab_InsertItem($TabMain, ($i-1) , $line)

Next

FileClose($f)

EndFunc


;=====================================================================
; Need to tidy this code in here!
;=====================================================================
#region Native function from UDF Tabs
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg, $iwParam
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndTab, $hWndListView, $tInfo

;Declare which UDF controls to monitor
$hWndTab = $TabMain
If Not IsHWnd($TabMain) Then $hWndTab = GUICtrlGetHandle($TabMain)
$hWndListView = $ListViewMainMembers
If Not IsHWnd($ListViewMainMembers) Then $hWndTab = GUICtrlGetHandle($ListViewMainMembers)

;Native DLL stuff
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")

;Begin events check
Switch $hWndFrom

;Events for tabmain
Case $hWndTab
Switch $iCode

Case $NM_CLICK ;User clicks on tab control
;Check if a new tab has been selected
$tabcur = _GUICtrlTab_GetCurSel($TabMain)
If $tabcur <> $tabprev Then
;Tab has changed so load new tab data
_TabChange()
;Set the previous tab to current tab
$tabprev = $tabcur
EndIf
EndSwitch

;Events for listviewmain
Case $hWndListView
Switch $iCode

Case $LVN_COLUMNCLICK ;A column is clicked
$tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
;Sort items
_GUICtrlListView_SimpleSort($ListViewMainMembers, $B_DESCENDING, DllStructGetData($tInfo, "SubItem"))

Case $LVN_ITEMACTIVATE ;An item is double clicked

;Get member name and pass to editmember func
$itemcur = _GUICtrlListView_GetSelectedIndices($ListViewMainMembers)
$itemcur = _GUICtrlListView_GetItem($ListViewMainMembers, $itemcur)
_EditMember($itemcur[3])

EndSwitch

EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
#endregion

Func _TabChange()

Local $f

$f = FileOpen($ResDir & $Indextxt)

;Get alliance tab change points to
$allypointer = FileReadLine($f, ($tabcur+1))

;Update controls with new allaince data
_ReadMemData()
_CalcAllyTotals()
_CalcAllyRates()

;Update allaince logo
GUICtrlDelete($AllyPic)
$AllyPic = GUICtrlCreatePic($ResDir & "" & $allypointer & $AllyLogojpg, 16, 15, 400, 100)

FileClose($f)

EndFunc

Func _EditMember($mem)

Local $f, $lc, $i, $line


;Create Edit Member Window
$WinEditMem = GUICreate($mem, 595, 227, 384, 145, 0, 0, $WinMain)
$LabEditMemName = GUICtrlCreateLabel($mem, 112, 32, 32, 17)
$LabEditMemScore = GUICtrlCreateLabel("Score:", 16, 80, 35, 17)
$LabEditMemTc = GUICtrlCreateLabel("Troop Count:", 16, 112, 66, 17)
$LabEditMemCoord = GUICtrlCreateLabel("Coords", 16, 144, 37, 17)
$InputEditMemScore = GUICtrlCreateInput("-", 88, 80, 201, 21)
$InputEditMemTc = GUICtrlCreateInput("-", 88, 112, 201, 21)
$InputEditMemCoord = GUICtrlCreateInput("-", 88, 144, 201, 21)
$EditEditMemNote = GUICtrlCreateEdit("Notes...", 296, 8, 289, 161)
$ButtonEditMemSave = GUICtrlCreateButton("Save", 200, 184, 83, 25)
$ButtonEditMemCancel = GUICtrlCreateButton("Cancel", 296, 184, 83, 25)
GUISetState(@SW_SHOW, $WinEditMem)

;Get member data and display
$f = FileOpen($ResDir & "" & $allypointer & $MemDatatxt)
$lc = _FileCountLines($ResDir & "" & $allypointer & $MemDatatxt)

;Cycle through memdat.txt
For $i = 1 to $lc
$line = FileReadLine($f, $i)
$line = StringSplit($line, "|")
If $line[1] = $mem Then ;If the name of the member = name passed to function
;Update controls with member data
GUICtrlSetData($InputEditMemTc, $line[2])
GUICtrlSetData($InputEditMemScore, $line[3])
GUICtrlSetData($InputEditMemCoord, $line[4])
;GUICtrlSetData($InputEditMemCoord, NOTES placeholder)
ExitLoop
EndIf

Next

MsgBox(0, "", "1")
;Window events
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
MsgBox(0, "", "3")
ExitLoop

Case $ButtonEditMemCancel
MsgBox(0, "", "4")
ExitLoop

EndSwitch
WEnd

;Delete window on way out of function
MsgBox(0, "", "7")
FileClose($f)
GUIDelete($WinEditMem)

EndFunc
Edited by Smerk

Share this post


Link to post
Share on other sites

#4 ·  Posted (edited)

Can you provide some additional files to can populate the listview? It seems the function that creat child window is called when an item in listview it's double clicked. So would be nice to have something in listview. :guitar:

LE: actually I think I know why this happens. Because _EditMember function it's called in a callback and this is very wrong. Any callback function should run quickly and then return, in other case the application freezes or become not stable.

Edited by Andreik

When the words fail... music speaks

Share this post


Link to post
Share on other sites

That certainly sounds like what happening.. when you say the function is being called in a callback are you referring to it being called from the GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") callback to WM_NOTIFY? And if i move it outside of WM_NOTIFY it will no longer be unstable?

again sorry i am still learning

Share this post


Link to post
Share on other sites

#6 ·  Posted (edited)

The solve can be a dummy control.

I made some comments where I added something in your code. This should work without frezees.

;==========================================================================================
;Includes
;Includes
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <File.au3>
#include <Array.au3>
#include <String.au3>
#include <Date.au3>
#include <IE.au3>
#include <GuiStatusBar.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GuiTab.au3>
;==========================================================================================

;==========================================================================================

;Constant variables
Global $WinMainTitle = "King's Empire Alliance Manager"
Global $ProgVersion = "v1.00"
Global $LastUpdate = "2012/05/02"
Global $IsConnect = "Searching..."
Global $IsUpToDate = "Searching..."
;Directory paths
Global $ResDir = @ScriptDir & "Resources"
;File names
Global $SavedBoardtxt = "SavedBoard.txt"
Global $MsgBoardtxt = "MsgBoard.html"
Global $PrevMemDatatxt = "PrevMemData.txt"
Global $MemDatatxt = "MemData.txt"
Global $Indextxt = "Index.txt"
Global $AllyLogojpg = "logo.jpg"
;Global varliables
Global $totstr = "0"
Global $totscore = "0"
Global $prevtotscore = "0"
Global $prevtotstr = "0"
;Initial allaince to load
$f = FileOpen($ResDir & $Indextxt)
Global $allypointer = FileReadLine($f, 1)
FileClose($f)
;Tab globals
Global $tabcur
Global $tabprev = "0"
;==========================================================================================


;Declare onexit function
OnAutoItExitRegister( "_OnExit")

$WinMain = GUICreate($WinMainTitle, 750, 675)

;#####################################################################
Global $Dummy = GUICtrlCreateDummy()                                ;#    ADDED A DUMMY CONTROL
;#####################################################################
;Tabs
$TabMain = _GUICtrlTab_Create($WinMain, 16, 95, 721, 20)

;Status bar
Local $vPartEdge[2] = [500, 600]
Local $vPartText[2] = [@Tab & _NowDate(), @TAB & $IsConnect]
$StatusBarMain = _GUICtrlStatusBar_Create($WinMain, $vPartEdge, $vPartText)

Global $AllyPic = GUICtrlCreatePic($ResDir & "" & $allypointer & $AllyLogojpg, 16, 15, 400, 100)
$LabelMainLastUpdate = GUICtrlCreateLabel("Last Updated:", 428, 25, 70, 17)
$LabLastUpdate = GUICtrlCreateLabel($LastUpdate, 503, 25, 80, 17)
$LabIsUpToDate = GUICtrlCreateLabel($IsUpToDate, 473, 45, 80, 17)
$LabMainProgVersion = GUICtrlCreateLabel($ProgVersion, 712, 5, 31, 17)

$ButtonMainConnect = GUICtrlCreateButton("Connect", 430, 85, 147, 17)
$ButtonMainSync = GUICtrlCreateButton("Sync", 592, 24, 147, 17)
$ButtonMainWiki = GUICtrlCreateButton("WiKi", 592, 48, 147, 17)
$ButtonMainMaps = GUICtrlCreateButton("Maps", 592, 72, 147, 17)
$ButtonMainChat = GUICtrlCreateButton("Chat", 592, 96, 147, 17)

;Group alliance
$GroupMainAlly = GUICtrlCreateGroup("Alliance:-", 16, 120, 721, 115)
$LabMainAllyStr = GUICtrlCreateLabel("Total Strength:", 120, 183, 74, 17)
$LabMainAllyScore = GUICtrlCreateLabel("Total Score:", 120, 208, 62, 17)
$AllyStr = GUICtrlCreateLabel("-", 200, 183, 75, 17)
$AllyScore = GUICtrlCreateLabel("-", 200, 208, 75, 17)
$ProgressMainAllyStr = GUICtrlCreateProgress(120, 150, 475, 25)
GUICtrlSetData(-1, 73)
$LabMainStrAllyGainD = GUICtrlCreateLabel("/day", 315, 183, 75, 17)
$LabMainStrAllyGainW = GUICtrlCreateLabel("/week", 415, 183, 75, 17)
$LabMainStrAllyGainM = GUICtrlCreateLabel("/month", 520, 183, 90, 17)
$LabMainScoreAllyGainD = GUICtrlCreateLabel("/day", 315, 208, 75, 17)
$LabMainScoreAllyGainW = GUICtrlCreateLabel("/week", 415, 208, 75, 17)
$LabMainScoreAllyGainM = GUICtrlCreateLabel("/month", 520, 208, 90, 17)
$LabMainAllyHealth = GUICtrlCreateLabel("Health:", 330, 132, 40, 17)

;Group members
$GroupMainMembers = GUICtrlCreateGroup("Members:-", 16, 240, 721, 241)
$ListViewMainMembers = _GUICtrlListView_Create($WinMain, "", 32, 264, 690, 200, BitOR($LVS_SINGLESEL, $LVS_REPORT))
_GUICtrlListView_SetExtendedListViewStyle($ListViewMainMembers, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_TWOCLICKACTIVATE, $LVS_EX_DOUBLEBUFFER))
_GUICtrlListView_AddColumn($ListViewMainMembers, "Member", 100)
_GUICtrlListView_AddColumn($ListViewMainMembers, "Troops", 145)
_GUICtrlListView_AddColumn($ListViewMainMembers, "Score", 145)
_GUICtrlListView_AddColumn($ListViewMainMembers, "Co-ordinates", 300)
Global $B_DESCENDING[_GUICtrlListView_GetColumnCount($ListViewMainMembers)]

;Group message board
$GroupMainMsgBoard = GUICtrlCreateGroup("Message Board:-", 16, 488, 721, 153)
$oMainIE = _IECreateEmbedded()
$MainIEControl = GUICtrlCreateObj($oMainIE, 27, 505, 700, 125)


GUISetState(@SW_SHOW, $WinMain)

;Register interactions with the tab
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

_StartUpOperations()
;###############################################################
_GUICtrlListView_InsertItem($ListViewMainMembers,"Test")        ; THIS LINE IS JUST FOR TEST; TO ADD AN ITEM TO LISTVIEW
;###############################################################

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
;##################################################
Case $Dummy                                        ; #        CHECK FOR DUMMY CONTROL
_EditMember(GUICtrlRead($Dummy))                ; #        CALL THE _EditMember function outside of callback
;##################################################
EndSwitch
WEnd

Func _StartUpOperations()

_ReadMemData()
_CalcAllyTotals()
_CalcAllyRates()
_StartMessageBoard()
_StartTabs()

EndFunc

Func _OnExit()

;Destroy controls to free memory
_GUICtrlListView_Destroy($ListViewMainMembers)
_GUICtrlStatusBar_Destroy($StatusBarMain)
_GUICtrlTab_Destroy($TabMain)

EndFunc

Func _ReadMemData()
;============================================
; Update members list
;============================================
Local $f, $lc, $line, $i, $memdat

;Delete any previous items
_GUICtrlListView_DeleteAllItems($ListViewMainMembers)

$f = FileOpen($ResDir & "" & $allypointer & $MemDatatxt)
$lc = _FileCountLines($ResDir & "" & $allypointer & $MemDatatxt)

;Loop through and parse data from file
For $i = 1 To $lc
$line = FileReadLine($f, $i)
If $line = "~" Then
ExitLoop
EndIf
$memdat = StringSplit($line, "|")
;Add data to listview
_GUICtrlListView_AddItem($ListViewMainMembers, $memdat[1])
_GUICtrlListView_AddSubItem($ListViewMainMembers, ($i - 1), $memdat[2], 1)
_GUICtrlListView_AddSubItem($ListViewMainMembers, ($i - 1), $memdat[3], 2)
_GUICtrlListView_AddSubItem($ListViewMainMembers, ($i - 1), $memdat[4], 3)
Next

FileClose($f)

EndFunc ;==>_ReadMemData

Func _CalcAllyTotals()
;============================================
; Calculate alliance totals
;============================================
Local $ic, $i, $tcval

;Delete any previous totals
$totstr = "0"
$totscore = "0"

$ic = _GUICtrlListView_GetItemCount($ListViewMainMembers)

;Loop through and gather data from listview
For $i = 1 To $ic
$tcval = _GUICtrlListView_GetItemText($ListViewMainMembers, ($i - 1), 1)
$tcval = StringReplace($tcval, ",", "")
$sval = _GUICtrlListView_GetItemText($ListViewMainMembers, ($i - 1), 2)
$sval = StringReplace($sval, ",", "")
$totstr = $totstr + $tcval
$totscore = $totscore + $sval
Next

;Display data
GUICtrlSetData($AllyStr, $totstr)
GUICtrlSetData($AllyScore, Int(($totscore/1000)))

EndFunc ;==>_CalcAllyTotals

Func _CalcAllyRates()
;============================================
; Calculate gains per day/week/month
;============================================

Local $f, $lc, $line, $memdat, $tcval, $sval, $scorepd, $strpd

;Delete any previous totals
$prevtotstr = "0"
$prevtotscore = "0"

$f = FileOpen($ResDir & "" & $allypointer & $PrevMemDatatxt)
$lc = _FileCountLines($ResDir & "" & $allypointer & $PrevMemDatatxt)

;Loop through and parse data from file
For $i = 1 To $lc
$line = FileReadLine($f, $i)
If $line = "~" Then
ExitLoop
EndIf
$memdat = StringSplit($line, "|")
$tcval = $memdat[2]
$tcval = StringReplace($tcval, ",", "")

$sval = $memdat[3]
$sval = StringReplace($sval, ",", "")

$prevtotstr = $prevtotstr + $tcval
$prevtotscore = $prevtotscore + $sval
Next

;Convert data
$scorepd = (($totscore - $prevtotscore) / _DateDiff("D", $LastUpdate, _NowCalcDate()))
$strpd = (($totstr - $prevtotstr) / _DateDiff("D", $LastUpdate, _NowCalcDate()))

;Display data
GUICtrlSetData($LabMainScoreAllyGainD, Int($scorepd/1000) & "/Day")
GUICtrlSetData($LabMainScoreAllyGainW, (Int($scorepd*7/1000)) & "/Week")
GUICtrlSetData($LabMainScoreAllyGainM, (Int($scorepd*30/1000)) & "/Month")
GUICtrlSetData($LabMainStrAllyGainD, Int($strpd) & "/Day")
GUICtrlSetData($LabMainStrAllyGainW, (Int($strpd*7)) & "/Week")
GUICtrlSetData($LabMainStrAllyGainM, (Int($strpd*30)) & "/Month")
FileClose($f)

EndFunc ;==>_CalcAllyRates

Func _StartMessageBoard()

Local $body, $f, $lc, $line, $i, $crisscross

;Navigate to messageboard page
_IENavigate($oMainIE, $ResDir & $MsgBoardtxt)
$body = _IETagNameGetCollection($oMainIE, "body", 0)

;Loop through saved boards.txt and collect entries
$f = FileOpen($ResDir & $SavedBoardtxt)
$lc = _FileCountLines($ResDir & $SavedBoardtxt)
For $i = 1 to $lc

;Check if even or odd number for table color
If Mod($i, 2) = 0 Then
$crisscross = "b0b0b0"
Else
$crisscross = "d0d0d0"
EndIf

$line = FileReadLine($f, $i)
$line = StringSplit($line, "|")

;Display entries
_IEDocInsertHTML($body, '                                      [i]' & $line[1] & "[/i] [b]" & $line[2] & ":[/b] " & $line[3] & '           ', "afterbegin")

Next

FileClose($f)

EndFunc

Func _StartTabs()

Local $f, $lc, $line, $i

;Open file and count how many alliances
$f = FileOpen($ResDir & $Indextxt)
$lc = _FileCountLines($ResDir & $Indextxt)

;For every allaince loop through and create a tab
For $i = 1 to $lc

$line = FileReadLine($f, $i)

_GUICtrlTab_InsertItem($TabMain, ($i-1) , $line)

Next

FileClose($f)

EndFunc


;=====================================================================
; Need to tidy this code in here!
;=====================================================================
#region Native function from UDF Tabs
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg, $iwParam
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndTab, $hWndListView, $tInfo

;Declare which UDF controls to monitor
$hWndTab = $TabMain
If Not IsHWnd($TabMain) Then $hWndTab = GUICtrlGetHandle($TabMain)
$hWndListView = $ListViewMainMembers
If Not IsHWnd($ListViewMainMembers) Then $hWndTab = GUICtrlGetHandle($ListViewMainMembers)

;Native DLL stuff
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")

;Begin events check
Switch $hWndFrom

;Events for tabmain
Case $hWndTab
Switch $iCode

Case $NM_CLICK ;User clicks on tab control
;Check if a new tab has been selected
$tabcur = _GUICtrlTab_GetCurSel($TabMain)
If $tabcur <> $tabprev Then
;Tab has changed so load new tab data
_TabChange()
;Set the previous tab to current tab
$tabprev = $tabcur
EndIf
EndSwitch

;Events for listviewmain
Case $hWndListView
Switch $iCode

Case $LVN_COLUMNCLICK ;A column is clicked
$tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
;Sort items
_GUICtrlListView_SimpleSort($ListViewMainMembers, $B_DESCENDING, DllStructGetData($tInfo, "SubItem"))

Case $LVN_ITEMACTIVATE ;An item is double clicked

;Get member name and pass to editmember func
$itemcur = _GUICtrlListView_GetSelectedIndices($ListViewMainMembers)
$itemcur = _GUICtrlListView_GetItem($ListViewMainMembers, $itemcur)

;##################################################
GUICtrlSendToDummy($Dummy,$itemcur[3])            ; #        INSTEAD OF CALLING _EditMember function here in this callback we send
;##################################################        a message to our dummy control, that will be processed in main loop

EndSwitch

EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
#endregion

Func _TabChange()

Local $f

$f = FileOpen($ResDir & $Indextxt)

;Get alliance tab change points to
$allypointer = FileReadLine($f, ($tabcur+1))

;Update controls with new allaince data
_ReadMemData()
_CalcAllyTotals()
_CalcAllyRates()

;Update allaince logo
GUICtrlDelete($AllyPic)
$AllyPic = GUICtrlCreatePic($ResDir & "" & $allypointer & $AllyLogojpg, 16, 15, 400, 100)

FileClose($f)

EndFunc

Func _EditMember($mem)

Local $f, $lc, $i, $line


;Create Edit Member Window
$WinEditMem = GUICreate($mem, 595, 227, 384, 145, Default, Default, $WinMain)
$LabEditMemName = GUICtrlCreateLabel($mem, 112, 32, 32, 17)
$LabEditMemScore = GUICtrlCreateLabel("Score:", 16, 80, 35, 17)
$LabEditMemTc = GUICtrlCreateLabel("Troop Count:", 16, 112, 66, 17)
$LabEditMemCoord = GUICtrlCreateLabel("Coords", 16, 144, 37, 17)
$InputEditMemScore = GUICtrlCreateInput("-", 88, 80, 201, 21)
$InputEditMemTc = GUICtrlCreateInput("-", 88, 112, 201, 21)
$InputEditMemCoord = GUICtrlCreateInput("-", 88, 144, 201, 21)
$EditEditMemNote = GUICtrlCreateEdit("Notes...", 296, 8, 289, 161)
$ButtonEditMemSave = GUICtrlCreateButton("Save", 200, 184, 83, 25)
$ButtonEditMemCancel = GUICtrlCreateButton("Cancel", 296, 184, 83, 25)
GUISetState(@SW_SHOW, $WinEditMem)

;Get member data and display
$f = FileOpen($ResDir & "" & $allypointer & $MemDatatxt)
$lc = _FileCountLines($ResDir & "" & $allypointer & $MemDatatxt)

;Cycle through memdat.txt
For $i = 1 to $lc
$line = FileReadLine($f, $i)
$line = StringSplit($line, "|")
If $line[1] = $mem Then ;If the name of the member = name passed to function
;Update controls with member data
GUICtrlSetData($InputEditMemTc, $line[2])
GUICtrlSetData($InputEditMemScore, $line[3])
GUICtrlSetData($InputEditMemCoord, $line[4])
;GUICtrlSetData($InputEditMemCoord, NOTES placeholder)
ExitLoop
EndIf

Next

MsgBox(0, "", "1")
;Window events
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
MsgBox(0, "", "3")
ExitLoop

Case $ButtonEditMemCancel
MsgBox(0, "", "4")
ExitLoop

EndSwitch
WEnd

;Delete window on way out of function
MsgBox(0, "", "7")
FileClose($f)
GUIDelete($WinEditMem)

EndFunc
Edited by Andreik
1 person likes this

When the words fail... music speaks

Share this post


Link to post
Share on other sites

Beautiful, i understand where i went wrong now :D i will have to read up on the use of Dummy controls they were unknown to me before.

Thank you for your help Bishop

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0