我还有另一个无法解决的问题
我有一个以下代码,可以将用户(名字,姓氏和年龄)添加到树视图中。除了一件小事之外,它一切运行良好:只有在第一次添加用户时它才能正常工作。当你点击添加然后尝试添加另一个用户时,它将尝试添加2个用户,然后是3,4,依此类推,随着每次添加而增加。这是捕获click事件的代码:
onClicked (dodajUczBt gui) (dodajUcz gui dbh stores)
这是处理点击的函数dodajUcz
:
dodajUcz gui dbh stores =
do entrySetText (nImie gui) ""
entrySetText (nNazwisko gui) ""
entrySetText (nWiek gui) ""
onClicked (cancelAddUczBt gui) (widgetHide (dodajUzDialog gui))
onClicked (zapiszUczBtn gui) procADD
windowPresent (dodajUzDialog gui)
where procADD = do
ucz <- getUczestnik
let store = uczestnicy stores
New.listStoreAppend store ucz
dlugosc <- New.listStoreGetSize store
labelSetText (lblLiczbaUcz gui) $ "Liczba uczestników: "++ show dlugosc
widgetHide (dodajUzDialog gui)
addUser ucz dbh
getUczestnik = do
imie <- entryGetText (nImie gui)
nazwisko <- entryGetText (nNazwisko gui)
wiek <- entryGetText (nWiek gui)
let wiek' = read wiek :: Integer
return $ Uczestnik 0 imie nazwisko wiek' False
Uczestnik
是一种代数数据类型,addUser
是一个将Uczestnik
添加到数据库中的函数。 gui也是一个代数数据类型GUI
,它包含castToXml
在我看来,widgetHide
是主要问题,因为即使您不做任何事情(只需打开对话框然后关闭它),它会在下次打开时尝试添加2个用户它
任何想法如何解决这个问题?任何帮助将不胜感激:)
答案 0 :(得分:1)
嗯,我的理解是:
dodajUcz
。 最重要:每次评估(即执行)dodajUcz
时,都会在zapiszUczBtn
<上为“Clicked”事件安装事件处理程序strong> AGAIN (使用onClicked
)。当您为事件安装事件处理程序时,它将永远保留在那里并且每次触发事件时都会执行。如果你安装两次,它将被执行两次。在这种特殊情况下,在调用dodajUcz
两次后,当在zapiszUczBtn
上触发事件Clicked时,事件处理程序将执行两次。
使用onClicked或任何其他事件处理程序安装程序不会删除以前的处理程序,它们会被添加到该窗口小部件和事件的处理程序堆栈中。
初始化gui时(首次创建时),在代码中仅将事件处理程序设置一次并且不再执行该代码。您可以将gui和商店作为args传递给procADD
然后。
例如:
startGUI :: DBH -> IO (GUI, Stores)
startGUI dbh = do
gui <- giveMeGUI -- or some other function that returns a gui
stores <- giveMeStores -- or some other function that returns the stores
onClicked (cancelAddUczBT gui) (widgetHide (dodaUzDialog gui))
onClicked (zapiszUczBtn gui) (procADD gui dbh stores)
return (gui, stores)
dodajUcz gui dbh stores = do
entrySetText (nImie gui) ""
entrySetText (nNazwisko gui) ""
entrySetText (nWiek gui) ""
windowPresent (dodajUzDialog gui)
procADD gui dbh stores = do
...