1

Тема: AHK: ListView. Взаимодействие из других потоков.

Всем доброго здоровья и с прошедшими праздниками!


myTableArr:=[["Name","ID","Date","Other data"]
			,["Name1","001","01.01.2017","Some data1"]
			,["Name2","002","01.01.2017","Some data2"]
			,["Name3","003","01.01.2017","Some data3"]
			,["Name4","004","01.01.2017","Some data4"]]
			
Gui, Add,Button,gS_table,ShowTable
Gui, Add,Button,x+10 gI_data,InsData
Gui, Show,y750,Main

Gui, 10: Default
Gui, 10: Add, ListView,w500 h200 vLVval
Gui, 10: Add,Button,y+10 gI_data,InsData
Gui, 10: Show,Hide,Table

Menu,MyContextMenu,Add,Изменить ID,TheEdit
Menu,MyContextMenu,Add,Удалить,DelData
Menu,MyContextMenu,Add,Копировать Имя,CopyName
return
GuiClose:
	ExitApp

S_table:
	Gui, 10: Show
return
I_data:
	ReCreateTable(myTableArr)
return
10GuiContextMenu:
	if (A_GuiControl!="LVval")
		return
	newRowNmbr:=A_EventInfo+1
	if (newRowNmbr>1) {
		LVname:=myTableArr[newRowNmbr][1]
		LV_Modify(newRowNmbr-1, "-Focus")
		Menu, MyContextMenu, Show, %A_GuiX%, %A_GuiY%
	}
return
CopyName:
	Clipboard:=LVname
	MsgBox,, Title, %Clipboard%
return
TheEdit:
	if (newRowNmbr>1) {
		if (editIDWin) {
			Gui, 50: Show
			ControlSetText,Edit1,% myTableArr[newRowNmbr][2],ahk_id%hEdit%
		} else {
			editIDWin:=1
			Gui, 50: +AlwaysOnTop +ToolWindow +HWNDhEdit
			Gui, 50: Add,Edit,w100 vChangeEdit,% myTableArr[newRowNmbr][2]
			Gui, 50: Add,Button,y+3 h18 gEditChange,Изменить
			Gui, 50: Add,Button,x+5 h18 gNoEdit,Отмена
			Gui, 50: Show,,Изменить
		}
	}
return
50GuiClose:
NoEdit:
	Gui, 50: Show, Hide
return
EditChange:
	Gui, 50: Submit
	myTableArr[newRowNmbr][2]:=ChangeEdit
	LV_Modify(newRowNmbr,"Col2",ChangeEdit)
return
DelData:
	if (newRowNmbr>1) {
		myTableArr.RemoveAt(newRowNmbr)
		ReCreateTable(myTableArr)
	}
return
ReCreateTable(tableArr) {
	Global
	GuiControl, -ReDraw, LVval
	LV_Delete()
	Loop, % LV_GetCount("Column")
		LV_DeleteCol(1)
	Loop,% tableArr[1].Length()
		LV_InsertCol(A_Index,"", tableArr[1][A_Index])
	Loop,% tableArr.Length()-1 {
		rNmbr := LV_Add("", "")
		Loop,% tableArr[rNmbr+1].Length()
			LV_Modify(rNmbr, "Col" . A_Index, tableArr[rNmbr+1][A_Index])
	}
	Loop, % tableArr[1].Length()
		LV_ModifyCol(A_Index, "AutoHdr")
	GuiControl, +ReDraw, LVval
}

Подскажите пожалуйста, как можно вежливо попросить кнопку "InsData" в окне "Main", приводить к аналогичному результату работы одноимённой кнопки в окне "Table"? Подпрограмму "EditChange", обновлять содержимое ячейки функцией "LV_Modify"? Подпрограмму "DelData" обновлять таблицу после удаления из неё данных?
Всё время приходится тыкать "InsData" в окне "Table", чтобы произошедшие изменения отобразились визуально. =/

2 (изменено: serzh82saratov, 2017-01-08 20:15:13)

Re: AHK: ListView. Взаимодействие из других потоков.


#Persistent
#SingleInstance, Force

myTableArr:=[["Name","ID","Date","Other data"]
			,["Name1","001","01.01.2017","Some data1"]
			,["Name2","002","01.01.2017","Some data2"]
			,["Name3","003","01.01.2017","Some data3"]
			,["Name4","004","01.01.2017","Some data4"]]
			
Gui, Add,Button,gS_table,ShowTable
Gui, Add,Button,x+10 gI_data,InsData
Gui, Show,y750,Main

Gui, 10: Default
Gui, 10: Add, ListView,w500 h200 vLVval
Gui, 10: Add,Button,y+10 gI_data,InsData
Gui, 10: Show,Hide,Table

Menu,MyContextMenu,Add,Изменить ID,TheEdit
Menu,MyContextMenu,Add,Удалить,DelData
Menu,MyContextMenu,Add,Копировать Имя,CopyName
return
GuiClose:
	ExitApp

S_table:
	Gui, 10: Show
return
I_data:
	ReCreateTable(myTableArr)
return

10GuiContextMenu:
	if (A_GuiControl!="LVval")
		return
	newRowNmbr:=A_EventInfo+1
	if (newRowNmbr>1) {
		LVname:=myTableArr[newRowNmbr][1]
		LV_Modify(newRowNmbr-1, "-Focus")
		Menu, MyContextMenu, Show, %A_GuiX%, %A_GuiY%
	}
return
CopyName:
	Clipboard:=LVname
	MsgBox,, Title, %Clipboard%
return
TheEdit:
	if (newRowNmbr>1) {
		if (editIDWin) {
			Gui, 50: Show
			ControlSetText,Edit1,% myTableArr[newRowNmbr][2],ahk_id%hEdit% 
		} else {
			editIDWin:=1
			Gui, 50: +AlwaysOnTop +ToolWindow +HWNDhEdit
			Gui, 50: Add,Edit,w100 vChangeEdit,% myTableArr[newRowNmbr][2]
			Gui, 50: Add,Button,y+3 h18 gEditChange,Изменить
			Gui, 50: Add,Button,x+5 h18 gNoEdit,Отмена
			Gui, 50: Show, ,Изменить 
		} 
	}
return
50GuiClose:
NoEdit:
	Gui, 50: Show, Hide
return
EditChange:
	Gui, 50: Submit 
	myTableArr[newRowNmbr][2]:=ChangeEdit 
	Gui, 10:Default
	LV_Modify(newRowNmbr - 1,"Col2",ChangeEdit), LV_ModifyCol()
return

DelData: 
	if (newRowNmbr>1) { 
		myTableArr.RemoveAt(newRowNmbr) 
		ReCreateTable(myTableArr)
	}
return

ReCreateTable(tableArr) { 
	Gui, 10:Default
	GuiControl, -ReDraw, LVval
	LV_Delete()
	Loop, % LV_GetCount("Column")
		LV_DeleteCol(1)
	Loop,% tableArr[1].Length()
		LV_InsertCol(A_Index,"", tableArr[1][A_Index])
	Loop,% tableArr.Length()-1 {
		rNmbr := LV_Add("", "")
		Loop,% tableArr[rNmbr+1].Length()
			LV_Modify(rNmbr, "Col" . A_Index, tableArr[rNmbr+1][A_Index])
	}
	Loop, % tableArr[1].Length()
		LV_ModifyCol(A_Index, "AutoHdr")
	GuiControl, +ReDraw, LVval
} 

 
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).