2016-09-29 13 views
0

「パネル」をクリックした後、「statusField」を更新する方法についていくつかアドバイスをします。wxhaskell:パネルの「クリック」を使ってstatusFieldを更新する

次のプログラムは、この問題を示しています。プログラムは2つの フレームを描画します。左のフレームが何らかの描画領域 であり、右のフレームに「赤」と「緑」のボタンがあると想像できます。 「赤色」と表示されたボタンをクリックすると、statusFieldのテキストが が「現在の色:赤色」に更新されます。 「緑色」というラベルの付いたボタンは、テキストを「現在の色:緑色」に更新します。

ユーザーが左パネルの をクリックした後にstatusFieldのテキストを変更するにはどうすればよいですか?例えば。 「 描画パネルを正常にクリックしました」に変更します。

ボタンの「オンコマンド」と同じ方法で、「オンクリック」で行うことができないのはなぜですか? (下記の注釈を参照してください。)

ありがとうございました。

module Main where 

import Graphics.UI.WX 

-- | NOP (= No Operation) 
data Command = Nop 
      | Red 
      | Green 
       deriving (Eq) 

main :: IO() 
main 
    = start hello 


hello :: IO() 
hello 
    = do currentCommand <- varCreate $ Nop    -- current command performed on next click on "pDrawingarea" 

      status <- statusField [text := "Welcome."] 

      -- Frames and Panels 
      f   <- frame [ text := "Demo" 
            , bgcolor := lightgrey ] 

      pButtons  <- panel f [ bgcolor := lightgrey] 
      pDrawingarea <- panel f [ on paint := draw 
            , bgcolor := lightgrey 
            ] 

      set pDrawingarea [on click := do drawingAreaOnClick status currentCommand pDrawingarea 
              -- set status [text := "User clicked on the panel."] 
              -- Problem: uncommenting the line above shows the problem 
          ] 

      bRed <- button pButtons [text := "Red", on command := do varSet currentCommand Red 
                    set status [text := "Current color: Red"] 
           ] 

      bGreen <- button pButtons [text := "Green", on command := do varSet currentCommand Green 
                     set status [text := "Current color: Green"] 
            ] 

      set pButtons [ layout := column 1 [ hstretch.expand $ widget bRed 
              , hstretch.expand $ widget bGreen 
              ] 
         ] 

      set f [ statusBar := [status] 
       , layout := row 3 [ 
            minsize (sz 600 500) $ stretch.expand $ widget pDrawingarea 
            , vstretch.expand $ rule 3 500 
            , minsize (sz 200 500) $ vstretch.expand $ widget pButtons 
            ]  
       ] 

      return() 

draw :: DC a -> Rect -> IO() 
draw dc viewArea 
    = do putStrLn "Imagine some code to repaint the screen." 


drawingAreaOnClick :: statusField -> Var Command -> Panel() -> Point -> IO() 
drawingAreaOnClick sf command panel pt 
    = do c <- varGet command 
     case c of 
      Red -> do putStrLn "Imagine some code to do red painting" 
      Green -> do putStrLn "Imagine some code to do green painting" 

答えて

0

この問題に多くの時間を費やした後、私は解決策を見つけました。 「テキスト」は、私が問題を理解していない「STATUSFIELD」自体がクラスのメンバーなので

ソリューションは

drawingAreaOnClick :: Textual x => x -> Var Command -> Panel() -> Point -> IO() 

drawingAreaOnClick :: statusField -> Var Command -> Panel() -> Point -> IO() 

の定義を変更することです。

私はGHC verions.Theの元の問題は、GHC 7.8.4で発生し、私がGHC 7.10.3で動作する解決策を見つけたことを完全にするために、言及します。 GHCのバージョンが問題に影響を与えるかどうかは言えません。参考のため

完全な作業コード:

module Main where 

import Graphics.UI.WX 

-- | NOP (= No Operation) 
data Command = Nop 
      | Red 
      | Green 
       deriving (Eq) 

main :: IO() 
main 
    = start hello 


hello :: IO() 
hello 
    = do currentCommand <- varCreate Nop    -- current command performed on next click on "pDrawingarea" 


      status <- statusField [text := "Welcome."] 

      -- not needed:  currentStatus <- varCreate status 


      -- Frames and Panels 
      f   <- frame [ text := "Demo" 
            , bgcolor := lightgrey ] 

      pButtons  <- panel f [ bgcolor := lightgrey] 
      pDrawingarea <- panel f [ on paint := draw 
            , bgcolor := lightgrey 
            ] 

      set pDrawingarea [on click := do drawingAreaOnClick status currentCommand pDrawingarea 
              -- set status [text := "User clicked on the panel."] 
              -- Problem: uncommenting the line above shows the problem 
          ] 

      bRed <- button pButtons [text := "Red", on command := do varSet currentCommand Red 
                    set status [text := "Current color: Red"] 
           ] 

      bGreen <- button pButtons [text := "Green", on command := do varSet currentCommand Green 
                     set status [text := "Current color: Green"] 
                     --sf <- varGet currentStatus 
                     -- set sf [text := "yyy"] 

            ] 

      set pButtons [ layout := column 1 [ hstretch.expand $ widget bRed 
              , hstretch.expand $ widget bGreen 
              ] 
         ] 

      set f [ statusBar := [status] 
       , layout := row 3 [ 
            minsize (sz 600 500) $ stretch.expand $ widget pDrawingarea 
            , vstretch.expand $ rule 3 500 
            , minsize (sz 200 500) $ vstretch.expand $ widget pButtons 
            ]  
       ] 

      return() 

draw :: DC a -> Rect -> IO() 
draw dc viewArea 
    = do putStrLn "Imagine some code to repaint the screen." 


drawingAreaOnClick :: Textual x => x -> Var Command -> Panel() -> Point -> IO() 
drawingAreaOnClick sf command panel pt 
    = do c <- varGet command 
     set sf [text := "Drawing on the screen."] 
     case c of 
      Red -> do putStrLn "Imagine some code to do red painting" 
      Green -> do putStrLn "Imagine some code to do green painting" 
関連する問題