Flex - 带时间选择(可手工输入)的日期组件,去掉了 StringToolkit.formatNumberWithChar

来源:互联网 发布:gsx策略查询软件 编辑:程序博客网 时间:2024/05/01 12:17

先在网上找了别人写的例子,下载后进行了修改。

主要是把 StringToolkit.formatNumberWithChar 揪出来了,这个东东在很多人的例子里都出现过,经过千辛万苦才揪出来。

一、组件:

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="
http://www.adobe.com/2006/mxml"
   xmlns:eshangrao="com.utils.*"
    height="24" width="100%"  fontSize="12" >
  <mx:Script>
   <![CDATA[
  
    import mx.controls.DateField;
    import com.utils.TimeInput;
   
    [Bindable] 
    private var today:Date = new Date(new Date().setHours(0,0,0,0)); 
    [Bindable] 
    private var start:Date = today; 
    [Bindable] 
    private var end:Date = start; 
   
     /*DateChange*/ 
    private function onDateChangeHandler(event:Event):void 
    { 
       if(startDF.text == "") 
        { 
          startDF.selectedDate = start; 
        } 
        else 
        { 
          start = startDF.selectedDate;         
        } 
     }  
    // 获取值
    public function getDateTimeValue():String
    {
     var strDate:String=startDF.text ;
     var strHours:String=TimeInput.formatNumberWithChar(tInput.hours,2,"0");
     var strMinutes:String=TimeInput.formatNumberWithChar(tInput.minutes,2,"0");
     
     return strDate + " " +strHours +":" +strMinutes;
    }
    //设置值
    public function setDateTimeValue(vNewValue:String,vConversion:Boolean=true):String
    {
     if (vNewValue.length==0) return "未赋值!";
     if (vNewValue.length>15)
     {
      //取日期
      var strYear:String=vNewValue.substr(0,4);
      //从日期中取出月份
      var numMonth:Number=parseInt(vNewValue.substr(5,2));
      //从日期中取出天
      var numDay:Number=parseInt(vNewValue.substr(8,2));
      
      //取时
      var numHours:Number=parseInt(vNewValue.substr(11,2));
      //取分
      var numMinutes:Number=parseInt(vNewValue.substr(14,2));
      
      var strError:String="";
      //判断月份是否超出范围
      if (numMonth<1)
      {
      strError="月份应大于1月,输入值:" + numMonth;
       numMonth=1;
      }
      if (numMonth>12)
      {
       strError="月份应小于12月,输入值:" + numMonth;
       numMonth=12;
      }
      //判断天是否超出范围
      if (numDay<1)
      {
       if (strError.length>0)
       {
        strError +="/n";
       }
       strError +="日期应大于1号,输入值:" + numDay;
       numDay=1;
      }
      if (numDay>31)
      {
       if (strError.length>0)
       {
        strError +="/n";
       }
       strError +="日期应小于31号,输入值:" + numDay;
       numDay=31;
      }
      
      //判断时是否超出范围
      if (numHours<0)
      {
          if (strError.length>0)
       {
        strError +="/n";
       }
       strError +="小时应大于0点,输入值:" + numHours;
       numHours=0;
      }
      if (numHours>23)
      {
          if (strError.length>0)
       {
        strError +="/n";
       }
       strError +="小时应小于23点,输入值:" + numHours;
       numHours=23;
      }
      //判断分是否超出范围
      if (numMinutes<0)
      {
        if (strError.length>0)
       {
        strError +="/n";
       }
       strError +="分钟应大于0分,输入值:" + numMinutes;
       numMinutes=0;
      }
       
      if (numMinutes>59)
      {
       
       if (strError.length>0)
       {
        strError +="/n";
       }
       strError +="分钟应小于59分,输入值:" + numMinutes;
       numMinutes=59;
      }
      
      //如果不强制转换,则输出错误信息
      if(!vConversion && strError.length>0)
      {
       return strError;
      }
      
      var strDate:String=strYear + "-" + TimeInput.formatNumberWithChar(numMonth,2,"0")
            + "-" + TimeInput.formatNumberWithChar(numDay,2,"0");
      startDF.text=strDate;
      tInput.hours=numHours;
      tInput.minutes=numMinutes;
      return "";
     }
     else
     {
      return "参数错误,长度不够";
     }
  
    }
 ]]>
  </mx:Script> 
 
  <mx:DateField id="startDF" x="0" 
  dayNames="[日,一,二,三,四,五,六]" 
 monthNames="[一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月]"
 showToday="true" yearNavigationEnabled="true"
 selectedDate="{start}" formatString="YYYY-MM-DD" 
    selectableRange="{{rangeEnd:end}}" change="onDateChangeHandler(event)"  />
 
  <eshangrao:TimeInput id="tInput" x="{startDF.width+2}"
   hours="{new Date().getHours()}" minutes="{new Date().getMinutes()}"
    toolTip="双击时间可手工进行输入!"  />
 
 <mx:Style>
  toolTip{fontSize:12}
 </mx:Style>
 
</mx:Canvas>


 二、package file

package com.utils
{
  import flash.events.Event;
  import flash.events.FocusEvent;
  import flash.text.TextLineMetrics;
  
  import mx.containers.HBox;
  import mx.controls.NumericStepper;
  import mx.controls.Text;
  import mx.controls.TextInput;
  import mx.core.UITextField;
  import mx.core.mx_internal;
  import mx.events.FlexEvent;
  import mx.managers.IFocusManager;
 

 use namespace mx_internal;
 
 [Event(name="change",type="flash.events.Event")]
 [Event(name="hoursChange",type="flash.events.Event")]
 [Event(name="minutesChange",type="flash.events.Event")]

   public class TimeInput extends NumericStepper
 {
  public function TimeInput()
    {
     super();
     this.maxChars=2;
     this.minimum=0;
     this.maximum=23;
     this.stepSize=1;
     this.addEventListener(FlexEvent.VALUE_COMMIT,valueCommandHandler);
    }
  protected  var inputBox:HBox;  
  protected  var sText:Text;       
  protected  var hoursInputField:TextInput;
  protected  var minutesInputField:TextInput;
  protected  var _hours:Number = 0;
  protected  var _minutes:Number = 30;
  protected  var _timeDate:Date;
  private    var _enabled:Boolean=true;
   
     override protected function createChildren():void
     {
     super.createChildren();
     if(!inputBox)
     {
      inputBox=new HBox();
      inputBox.setStyle("paddingLeft",0);
      inputBox.setStyle("paddingRight",0);
      inputBox.setStyle("paddingTop",0);
      inputBox.setStyle("paddingBottom",0);
      inputBox.setStyle("horizontalGap",0);
      inputBox.setStyle("borderStyle","solid");
      inputBox.setStyle("verticalAlign","middle");
      addChild(inputBox);
     }
 
      var widestNumber:Number=61;
         var lineMetrics:TextLineMetrics = measureText(widestNumber.toString());
         var textWidth:Number = lineMetrics.width + UITextField.TEXT_WIDTH_PADDING+4;
         if (!hoursInputField)
         {
          hoursInputField = new TextInput();  
          hoursInputField.focusEnabled = false;
             hoursInputField.styleName = this;
       hoursInputField.width=textWidth;        
             hoursInputField.restrict = "0-9";
             hoursInputField.selectionBeginIndex=0;
             hoursInputField.selectionEndIndex=1;
             hoursInputField.maxChars = 2;
             hoursInputField.text = formatNumberWithChar(_hours,2,"0");
             hoursInputField.setStyle("textAlign","right");
       hoursInputField.setStyle("borderStyle","none");  
       hoursInputField.setStyle("paddingLeft",0);
       hoursInputField.setStyle("paddingRight",0);
       hoursInputField.setStyle("paddingTop",0);
       hoursInputField.setStyle("paddingBottom",0);
       hoursInputField.setStyle("horizontalGap",0); 
       hoursInputField.addEventListener(FocusEvent.FOCUS_IN,inputField_focusInHandler);
             hoursInputField.addEventListener(FocusEvent.FOCUS_OUT, inputField_focusOutHandler);
           
       inputBox.addChild(hoursInputField);
         }
          inputField=hoursInputField;
      if(!sText)
      {
       sText=new Text();
       sText.text=":";
       sText.setStyle("textAlign","center");
       sText.setStyle("paddingLeft",0);
       sText.setStyle("paddingRight",0);
       sText.setStyle("paddingTop",0);
       sText.setStyle("paddingBottom",0);
       sText.setStyle("horizontalGap",0);
       inputBox.addChild(sText);
      }
         if (!minutesInputField)
         {
          minutesInputField = new TextInput(); 
             minutesInputField.focusEnabled = false;
           minutesInputField.styleName = this;
       minutesInputField.width=textWidth;
          minutesInputField.restrict = "0-9";
    minutesInputField.selectionBeginIndex=0;
             minutesInputField.selectionEndIndex=1;
             minutesInputField.maxChars = 2;
             minutesInputField.text = formatNumberWithChar(_minutes,2,"0");
             minutesInputField.setStyle("textAlign","left");
       minutesInputField.setStyle("borderStyle","none");
       minutesInputField.setStyle("paddingLeft",0);
       minutesInputField.setStyle("paddingRight",0);
       minutesInputField.setStyle("paddingTop",0);
       minutesInputField.setStyle("paddingBottom",0);
       minutesInputField.setStyle("horizontalGap",0);
       minutesInputField.addEventListener(FocusEvent.FOCUS_IN,inputField_focusInHandler);
             minutesInputField.addEventListener(FocusEvent.FOCUS_OUT, inputField_focusOutHandler);
            
       inputBox.addChild(minutesInputField);
          }
      }
        override protected function measure():void
      {
      super.measure();
         var inputBoxHeight:Number = inputBox.getExplicitOrMeasuredHeight();
         var buttonHeight:Number = prevButton.getExplicitOrMeasuredHeight() +
                                   nextButton.getExplicitOrMeasuredHeight();

         var h:Number = Math.max(inputBoxHeight, buttonHeight);
         h = Math.max(DEFAULT_MEASURED_MIN_HEIGHT, h);

         var inputBoxWidth:Number = inputBox.getExplicitOrMeasuredWidth();
         var buttonWidth:Number = Math.max(prevButton.getExplicitOrMeasuredWidth(),
                                           nextButton.getExplicitOrMeasuredWidth());

         var w:Number = inputBoxWidth + buttonWidth;
         w = Math.max(DEFAULT_MEASURED_MIN_WIDTH, w);

         measuredMinWidth = DEFAULT_MEASURED_MIN_WIDTH;
         measuredMinHeight = DEFAULT_MEASURED_MIN_HEIGHT;

         measuredWidth = w;
         measuredHeight = h;
        }
     override protected function updateDisplayList(unscaledWidth:Number,unscaledHeight:Number):void
      {
      super.updateDisplayList(unscaledWidth, unscaledHeight);
 
         var w:Number = nextButton.getExplicitOrMeasuredWidth();
         var h:Number = Math.round(unscaledHeight / 2);
         var h2:Number = unscaledHeight - h;

         nextButton.x = unscaledWidth - w;
         nextButton.y = 0;
         nextButton.setActualSize(w, h2);
      
      prevButton.x = unscaledWidth - w;
         prevButton.y = unscaledHeight - h;
         prevButton.setActualSize(w, h);
         var inputBoxHeight:Number = inputBox.getExplicitOrMeasuredHeight();
         var inputBoxWidth:Number = inputBox.getExplicitOrMeasuredWidth();
         inputBox.setActualSize(inputBoxWidth,inputBoxHeight);
        }
        private function inputField_focusInHandler(event:FocusEvent):void
      {
    
        inputField=event.currentTarget as TextInput;
        if(event.currentTarget as TextInput == hoursInputField)
        {
        this.value=parseInt(inputField.text);
        this.minimum=0;
        this.maximum=23;
        }
        else
        {
        this.value=parseInt(inputField.text);
        this.minimum=0;
        this.maximum=59;
       }
         focusInHandler(event);
         dispatchEvent(new FocusEvent(event.type, false, false,
         event.relatedObject,
         event.shiftKey, event.keyCode));
        }

       private function inputField_focusOutHandler(event:FocusEvent):void
      {
         focusOutHandler(event);
       
       dispatchEvent(new FocusEvent(event.type, false, false,
         event.relatedObject,
         event.shiftKey,event.keyCode));
      }
   
     private function valueCommandHandler(event:FlexEvent):void
     {
      inputField.text=formatNumberWithChar(value,2,"0");
      if(inputField==hoursInputField)
      {
        this.hours=value;
      }
      else
      {
        this.minutes=value;
      }
     }
     override protected function focusInHandler(event:FocusEvent):void
      {
         super.focusInHandler(event);

         var fm:IFocusManager = focusManager;
         if (fm)
             fm.defaultButtonEnabled = false;
      }
    [Bindable]
     public function get hours():Number
    {
      return _hours;
    }
 
    [Inspectable(defaultValue=0,category="Time",name="Hours")]
    public function set hours(val:Number):void
    {
    if (val >= 0 || val <= 24)
    {
      this._hours = val;
      if(inputField==hoursInputField && val!=value)
       value=val;
      else{
       hoursInputField.text=formatNumberWithChar(val,2,"0");
      }
    }
   
    dispatchEvent(new Event("hoursChange"));
    dispatchEvent(new Event("change"));
    }
 
    [Bindable]
     public function get minutes():Number
    {
      return _minutes;
    }
 
    [Inspectable(defaultValue=30,category="Time",name="Minutes")]
    public function set minutes(val:Number):void
    {
     if (val >= 0 || val <= 59)
     {
      this._minutes = val;
      if(inputField==minutesInputField && val!=value)
       value=val;
      else{
       minutesInputField.text=formatNumberWithChar(val,2,"0");
      }
     }
   
     dispatchEvent(new Event("minutesChange"));
     dispatchEvent(new Event("change"));
    }
 
    public function get Time():Date
    {
     var date:Date=new Date();
     date.hours=_hours;
     date.minutes=_minutes;
     return date;
  }
    public function set Time(time:Date):void
    {
     this._timeDate=time;
     this.hours=time.hours;
     this.minutes=time.minutes;
  }
 
     override public function set enabled(value:Boolean):void
     {
          _enabled = value;
          if(hoursInputField){
           hoursInputField.enabled=value;
           minutesInputField.enabled=value; 
           sText.enabled=value;
           nextButton.enabled=value;
           prevButton.enabled=value;
          }
        
      }      
      override public function get enabled():Boolean
      {
          return _enabled;
      }
      public static function formatNumberWithChar(value:Number,length:int=2,pref:String="0"):String
      {
   var str:String=new String(value);
   var len:int=str.length;
   
   if(len>length)
    return str.substr(0,length);
   else
   {
    var n:int=length-len;
    for(var i:int=0;i<n;i++)
    {
     str=pref+str;
    }
    return str;
   }
  }
 }
}

 

原创粉丝点击