2011-03-07 106 views
0

我有一個flex應用程序,曾經是一個基於互聯網的應用程序。其中我有一個函數,當我告訴它創建錯誤消息時,會創建工具提示錯誤消息。我將這個應用程序逐字地提取到桌面應用程序中,並稍微調整了一些東西以使其運行,但是我並沒有弄亂mxml文件的核心基礎,該文件利用這一點從一種類型的改變根標籤:組'到's:窗口'Flex 4桌面應用程序TooltipManager

一切運行正常,但工具提示未顯示。我似乎無法弄清楚爲什麼,所以我想我會由你們運行。這裏的工具提示代碼(內嵌MXML代碼FX:腳本CDATA標籤):

import mx.controls.ToolTip; 
import mx.managers.ToolTipManager; 

public var errorTip:ToolTip;  
private function createErrorMsg(errorMsg:String, object:Object):void {    
    if (errorTip){ToolTipManager.destroyToolTip(errorTip);}; 
    errorTip = ToolTipManager.createToolTip(errorMsg,object.getBounds(root).x + object.width,object.getBounds(root).y) as ToolTip; 
    errorTip.setStyle("styleName", "errorTip"); 
    errorTip.visible = true; 
    errorTip.enabled = true; 
} 

基本上,我傳遞給函數的字符串和對象(文本輸入,複選框,按鈕等...等。 。)並定位它並顯示錯誤消息。這完全適用於我的網絡版本,但不適用於我的桌面版本。

下面是實例化窗口代碼:

var window:LoginWindow = new LoginWindow(); 
Window.systemChrome = NativeWindowSystemChrome.NONE; 
Window.transparent = true; 
Window.open(true); 
Window.maximize() 

任何想法?


在一個側面說明,我檢查,看看是否存在errorTip在函數的開始,然後摧毀它,這樣的高範圍變量「errorTip」總是等於參考當前顯示的錯誤。這使我可以在表單驗證中摧毀該錯誤提示,然後再次進行錯誤檢查,但它只允許一次顯示一個工具提示。有沒有更好的方法來查詢工具提示管理器的所有當前顯示的工具提示並將其全部銷燬?

+0

我也想請注意,我正在使用此設置,因爲工廠錯誤工具提示系統要求您在顯示工具提示之前將焦點放在無效的字段上,並且字段無效並不總是顯而易見的。 –

回答

0

要解決這一點,你必須更改線路,調用「createTooltip」以下幾點:

errorTip = ToolTipManager.createToolTip(errorMsg,object.getBounds(root).x + object.width,object.getBounds(root).y, null, object as IUIComponent) as ToolTip; 

這背後的想法是,現在你只需撥打「createErrorMsg(‘myError’,myComponent的)」和它會在那裏顯示一條錯誤消息,然後您可以添加另一個功能:

private function clearError():void 
{ 
    if(errorTip) errorTip.visible = false; 
} 

實際移除錯誤消息。這一方面的缺點是它一次只顯示一條消息,但我會稍微調整一下以改變這種情況。所以這裏是我的更好的分辨率:

錯誤消息將(傳統上)只顯示在一個批處理集。 (基本上,您只會在一個時間點上顯示少數工具提示,並且它們都將與您所在的表單相關聯)。這並非總是如此,但這不是我關心的問題。我創建了執行錯誤信息處理工具類:

package Utils 
{ 
    import mx.controls.ToolTip; 
    import mx.core.IUIComponent; 
    import mx.managers.ToolTipManager; 

    public class ErrorUtils 
    { 
     private static var errorCache:Array = new Array(); 

     public function ErrorUtils() 
     { 

     } 

     public static function createErrorMsg(errorMsg:String, object:Object):void { 
      var errorTip:ToolTip = ToolTipManager.createToolTip(errorMsg,object.getBounds(object.root).x + object.width,object.getBounds(object.root).y, null, object as IUIComponent) as ToolTip 
      errorTip.setStyle("styleName", "errorTip"); 
      errorTip.visible = true; 
      errorTip.enabled = true; 

      var position:int = errorCache.length; 
      errorCache.push(errorTip); 
     } 

     public static function clearAllErrors():void 
     { 
      for each(var error:ToolTip in errorCache) 
      { 
       ToolTipManager.destroyToolTip(error); 
      } 
     } 
    } 
} 

要使用您只需撥打ErrorUtils.createErrorMsg(「我的信息」,invalidComponent)類,並清除您只需撥打ErrorUtils.clearAllErrors錯誤()

這樣,如果你有一個表單,並且你有一個驗證函數,那麼每次它返回時都會調用該函數。唯一缺少的是清除特定錯誤的方法,但要處理的是,您可以將所有創建調用置於驗證表單中所有字段的主驗證函數中,然後每次調用該函數您獲得或放鬆對某個字段的注意力,並在該函數的開頭調用「ErrorUtils.clearAllErrors()」。

BTW: 這是我收到這樣做原教程的來源,我只是抽象有點 http://aralbalkan.com/1125 所以學分到上面去現場爲原代碼