2012-02-23 25 views
2

我有解決不了多次添加,而不是單一的[gtk2hs]

另一個問題,我有以下的代碼,將用戶添加(名字,姓氏和年齡)成樹狀。除了一件小事外,這一切都運行良好:只有當您第一次添加用戶時,它才能很好地工作。當你點擊添加,然後嘗試添加另一個用戶時,它會嘗試添加2個用戶,然後添加3個,4個等等,每增加一個用戶都會增加。下面是捕獲點擊事件代碼:

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

創建GUI元素在我看來,這widgetHide是主要的問題,因爲即使你沒有做任何事情(只要打開對話框,然後關閉它)會在下次打開時嘗試添加2個用戶。

任何想法如何解決這個問題?任何幫助將不勝感激:)

回答

1

嗯,我的理解是:

  1. 要再次顯示的對話框中,你在你的代碼中調用dodajUcz從別的地方。
  2. 你添加一個用戶每一次,你隱藏對話框(和你要求它再次顯示)
  3. 最重要的:每次評估(即,執行)時間dodajUcz,安裝事件處理程序上zapiszUczBtnAGAIN '點擊' 事件(使用onClicked)。當您安裝的事件處理程序的事件,它保持永遠存在,並在每次事件觸發時會得到執行。如果你安裝了兩次,它會執行兩次。在這種特殊情況下,調用dodajUcz兩次後,事件處理程序將獲得當事件被點擊時觸發zapiszUczBtn執行兩次。

    使用onClicked或任何其他事件處理程序的安裝程序不會刪除之前的處理器,它們被添加到該窗口小部件和事件處理程序堆棧。

    當您初始化gui(當您第一次創建它時)時,請在您的代碼中僅設置事件處理程序一次,並且不要再次執行該代碼。您可以將gui和商店作爲參數傳遞給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 
        ... 
    
相關問題