2010-07-21 91 views
1

與FLEX4 AIR應用程序工作的TextInput不完整的價值,使用該組件我從條形碼閱讀器獲取的數據,星火使用條碼閱讀器

<s:TextInput id="barcode" enter="showBarcode()"/> 

那麼對於處理輸入事件,當讀者完成其讀至極自動觸發

private function showBarcode():void{ 
    Alert.show(barcode.text); 
} 

好的,很簡單。但我的問題是:在警報框中顯示的文本不完整,它沒有輸入一個或兩個數字(最後一個),或者它只是顯示TextInput組件中的整個文本(正確的視圖)

我已經測試了我的BC閱讀器記事本,而且很好。

我已經使用Flex3 web應用中的MX組件測試了相同的代碼,並且沒有問題。

一些幫助將不勝感激。

Tnx

回答

1

而不是使用「enter」嘗試偵聽onKeyUp事件。

您必須從條形碼掃描儀中找出適當的行尾字符讀入。但是,請關注這一點,並以這種方式進行警戒;否則什麼都不做。

+0

我嘗試使用keyUp =「showBarcode(event)」的建議。結果是一樣的。 我相信這可能是一個與輸入緩衝區有關的錯誤,我不知道。 Tnx – gustyaquino 2010-07-21 15:38:02

+1

有趣。很容易相信輸入緩衝區是一個因素。您是否嘗試過Flex 4 SDK中的mx:TextInput? – JeffryHouser 2010-07-21 16:14:59

+0

你實際上想要做keyDown,而不是keyUp(想想按住textInput中的一個鍵)。我們在許多機器上使用條形碼掃描儀(監聽條形碼上的第一個字符ctrl-y,觸發條形碼管理器中的某些動作,成爲顯示列表的一部分......所有動作都完美無缺)。 – 2010-07-21 16:18:16

0

文本至少按照您在Spark TextInput中所期望的那樣使用條形碼閱讀器使用相同的工作流程顯示,如本視頻中所示:「Flash Nicey Nice With HID」http://www.youtube.com/watch?v=sEw0RB-Uj00

無論如何,我不認爲Adobe Flash播放器支持正式的其他HID設備,而不是鍵盤或鼠標。

因此,我不希望Adobe工程師在短時間內使Spark TextInput與您的條形碼閱讀器輸入兼容。

+0

只是一個想法。 嘗試偵聽Spark TextInput的「更改」事件並在事件偵聽器中檢查最後一個文本字符是否爲Keyboard.ENTER符號>這將表示從條形碼讀取器讀取整個文本。 – JabbyPanda 2010-07-22 14:42:02

+0

BC閱讀器充當普通鍵盤,完美地聽取mx:TextInput和s:TextInput上的「輸入」事件,問題僅與Spark組件的輸入數據有關,它表現奇怪,數據相同在任何事件發生後(即輸入,更改,鍵盤上,...)立即顯示在現場顯示不可用(有時是部分)。 MX組件的工作原理與此有關。 – gustyaquino 2010-07-23 21:10:21

0

我在Flex 4/Spark的條碼掃描工作中遇到了同樣的問題。我們找到了兩種解決方法。

第一個是使用舊的「Halo」TextInput控件(<mx:TextInput />)。即使在Flex 4項目中也可以做到這一點。

第二方法,是保持「星火」的TextInput控制,而是利用很短的計時器在你使用keyUp或keyDown事件讓文本屬性完全充滿條形碼掃描數據 - 這不是我我不確切知道這是爲什麼起作用,但確實如此。而且你可以保留Spark控件/蒙皮的所有優點。所以,樓主的例子可能是固定的,如果它變成了:

<s:TextInput id="barcode" keyDown="showBarcode(event)"/> 

private function showBarcode(evt:KeyboardEvent):void { 

    var t:Timer = new Timer(10, 1); // 10ms 
    t.addEventListener(TimerEvent.TIMER, function():void { 
     Alert.show(barcode.text); 
    }); 
    t.start(); 
} 

獎勵:
如果你不想使用此定時器遍佈在事件處理程序代碼,你可以把它一個效用函數在Barcoder.as類,像這樣:

public static function checkScan(evt:KeyboardEvent, callback:Function):void 
{ 
    if (evt.keyCode == Keyboard.ENTER) 
    { 
     var t:Timer = new Timer(10, 1); // 10 ms 
     t.addEventListener(TimerEvent.TIMER, function():void { callback(); }); 
     t.start(); 
    } 
} 

然後,如果你有兩個獨立的條碼領域,具有兩個獨立的處理器(bc1_handler()bc2_handler())你的MXML會是這樣的:

<s:TextInput id="barcode1" keyDown="Barcoder.checkScan(event, bc1_handler)" /> 
<s:TextInput id="barcode2" keyDown="Barcoder.checkScan(event, bc2_handler)" /> 
3

我們遇到了同樣的問題,我們結束了保存字符從條形碼接收掃描程序在緩衝區而不是訪問TextInput文本屬性。我們總是以正確的順序接收字符,但是,使用Spark TextInput時,文本屬性有時會混亂。

<s:TextInput id="barcode" keyDown="barcode_keyDownHandler(event)" /> 

這是我們所使用的緩衝區,這些都是相關的功能:

private var textBuffer:ArrayList = new ArrayList(); 

protected function getTextBufferContent():String 
{ 
    var content:String=""; 
    for (var i:int = 0; i < textBuffer.length; i++) 
    { 
     content=content.concat(textBuffer.getItemAt(i)); 
    } 
    return content; 
} 

protected function handleKeyboardEnter():void 
{ 
    var barcodeScan:String=getTextBufferContent(); 
    textBuffer.removeAll(); 
    if (barcodeScan != "") 
    { 
     Alert.show(barcodeScan); 
    } 
} 

protected function barcode_keyDownHandler(event:KeyboardEvent):void 
{ 
    trace("barcode_keyDownHandler: " + event.keyCode + " " + String.fromCharCode(event.keyCode));    
    if (event.keyCode == Keyboard.ENTER) 
    { 
     handleKeyboardEnter(); 
    } 
    else textBuffer.addItem(String.fromCharCode(event.keyCode)); 
} 

的MX:的TextInput也工作過,但我們想保持Spark組件。