線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2446
推到 Plurk!
推到 Facebook!

如何對scaner與鍵盤傳送內容做不同處理?

尚未結案
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-28 20:15:42 IP:219.145.xxx.xxx 未訂閱
各位先進好! 我有一個連接鍵盤口的Scaner,用於掃描書籍的Bar code(條形碼),我現在想對通過鍵盤輸入,傳送到Edit的內容,與SCaner自動傳送到Edit的內容做不同處理. 我曾考慮用時間區分,因為手工輸入十幾個數字,總要花費幾秒,而用Scaner不超過2秒,但不知道該如何實現。 請問各位先進,此問題該如何考慮?
breeze_1
一般會員


發表:33
回覆:72
積分:21
註冊:2003-05-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-29 05:05:23 IP:202.104.xxx.xxx 未訂閱
用時間怎麽判斷的?
turboted
版主


發表:95
回覆:754
積分:452
註冊:2002-07-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-29 08:00:06 IP:218.166.xxx.xxx 未訂閱
單就時間而言 你可以在user按下第一個button時,也就是第一次觸發onkeydown時 讀取一次系統時間 等到全部輸入完時,再讀一次 這樣一來,就可比對時間差 因為你要的時間不是ms,不必很精細,所以系統時間就可以了
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-06-05 18:37:12 IP:61.185.xxx.xxx 未訂閱
感謝前輩turboted的回應! 經過實際的測試,用時間來區分鍵盤輸入與Scaner輸入是不行的,原因是有時持Scaner操作延遲,或是Bar Code 不清楚,所延長的時間與鍵盤輸入所需時間差不多,不好區分!
jimmy_and_you
初階會員


發表:20
回覆:74
積分:33
註冊:2003-05-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-06-05 19:42:51 IP:202.145.xxx.xxx 未訂閱
其實你可以參考turboted所說的,用時間間隔,做長度比對 比如2個系統時間內(1/18.秒)字串長度的變化超過5個字,那就是SCANER掃近來的資料.... 或者是看看字串最後一個字...是不是'\r'換行符號(我用RS232的Scaner 會在字串尾加一個'\r')    這2種方法試試看...
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-06-06 18:33:46 IP:61.150.xxx.xxx 未訂閱
Hi!jimmy and you  我試了第二種方法,在 >,不知能不能給出例子,謝謝!
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-06-11 16:00:03 IP:219.145.xxx.xxx 未訂閱
各位先進好!  我現在在13時停止計時,然後我試了一下,不管是通過Keyboard輸入,還是通過Scaner花費的時間都為0 ,不知問題出在何處。 如圖所示:      Code 如下: procedure Timedelay(DT:dword); var tt:dword; begin tt:=getTickCount(); while getTickCount()-tt
pedro
尊榮會員


發表:152
回覆:1177
積分:865
註冊:2002-06-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-06-11 16:18:33 IP:210.61.xxx.xxx 未訂閱
那是TimeStart記錄的時間, 離後面要計算的時間 太短了... 修正之後供您參考///
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
const
TimeStart:Longword=0;
begin
 if Length(Edit1.Text)=1 then
    TimeStart:=GetTickCount;
  if Key=VK_Return then
  begin
    showmessage(inttostr(timestart) #13 inttostr(gettickcount) #13 inttostr(GetTickCount-TimeStart));
  end;
end;
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-06-11 17:47:04 IP:202.100.xxx.xxx 未訂閱
如Pedro兄所言!  見下面兩圖比較(Scaner Vs Keyboard) :  1) 2) 另外,請問 const TimeStart:Longword=0; 這句的作用是什麼? 我僅改動為 var TimeStart:Longword; 計時結果(用Scaner輸入)如下圖:
cocodi
一般會員


發表:21
回覆:65
積分:17
註冊:2002-06-27

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-06-11 22:12:47 IP:211.22.xxx.xxx 未訂閱
mathewzhao: 請問這樣處理的目的為何,說出來,也許有其它方法可解
pedro
尊榮會員


發表:152
回覆:1177
積分:865
註冊:2002-06-12

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-06-12 09:12:08 IP:210.61.xxx.xxx 未訂閱
這是把TimeStart宣告成靜態變數, 也就是在重覆進入該段函式裡, TimeStart值不會受Delphi重新配置及清空. 若改為var TimeStart,情況是最後一次進入 keypdown時,並未執行到if xxx then TimeStart 所以TimeStart值是未受信賴的. >const >TimeStart:Longword=0; >這句的作用是什麼?
weber
初階會員


發表:24
回覆:56
積分:26
註冊:2002-03-13

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-06-13 07:46:35 IP:61.217.xxx.xxx 未訂閱
提供另一個方向給你參考: 從 Barcode Reader 下手, Reader 可以設定前置碼及後置碼 比如說設定前置碼為 STX(#2) ,後置碼為 ETX(#3),那麼 Reader 讀到 123 時會送出 #2 '123' #3 ,程式就可以加以判斷了. 至於Reader 的設定方式,請參照 Reader 的手冊.
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-06-15 16:00:10 IP:61.150.xxx.xxx 未訂閱
Hi! cocodi前輩 這樣處理的目的是因為有一些舊書, 1)如果BarCode 能讀出,則直接存資料庫 2)如果BarCode 不能讀出,用手工輸入Barcode數值,加一個Flag後存入資料庫。 即要區分直接讀出和手工輸入的Barcode。 Hi!weber前輩: 感謝你的指引,由於我的Scaner 只有一個'快速查閱'的說明,並無BarCode Reader,所以無法測試。 但謝謝你的回應與指點!
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-06-15 17:02:46 IP:192.168.xxx.xxx 未訂閱
還有一個比較好的辦法 就是判斷每個鍵輸入的間隔時間 如果是Scanner傳來的應該每個鍵的間格時間很平均 將所有的時間間格算出Mean(平均值),再將每個時間間格與此平均值去算出SD(標轉誤差), SD值小於一定的數值就是Scanner,否則就是鍵盤 SD=(abs(T1-MEAN) abs(t2-mean) ...abs(tn-mean))/(n) 您看這個辦法如何? ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
cocodi
一般會員


發表:21
回覆:65
積分:17
註冊:2002-06-27

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-06-16 23:30:50 IP:211.22.xxx.xxx 未訂閱
weber兄說的應該是很可行的,你可能以barcode reader上的modal-no找看看是否有網點可download該設定本, 要不然還有個笨方法,通常BarCodeReader 讀取成功後會送 #13 可於onKeypress 內判斷, 但若是自行輸入的話,放個button 來觸發事件吧? 看看是否還有其它更好的方法
breeze_1
一般會員


發表:33
回覆:72
積分:21
註冊:2003-05-26

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-07-19 14:05:50 IP:61.152.xxx.xxx 未訂閱
Left side cannot be assigned to 
引言:
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); const TimeStart:Longword=0; begin if Length(Edit1.Text)=1 then TimeStart:=GetTickCount; if Key=VK_Return then begin showmessage(inttostr(timestart) #13 inttostr(gettickcount) #13 inttostr(GetTickCount-TimeStart)); end; end;
breeze_1
一般會員


發表:33
回覆:72
積分:21
註冊:2003-05-26

發送簡訊給我
#17 引用回覆 回覆 發表時間:2004-07-19 14:06:24 IP:61.152.xxx.xxx 未訂閱
Left side cannot be assigned to 錯誤信息
引言:
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); const TimeStart:Longword=0; begin if Length(Edit1.Text)=1 then TimeStart:=GetTickCount; if Key=VK_Return then begin showmessage(inttostr(timestart) #13 inttostr(gettickcount) #13 inttostr(GetTickCount-TimeStart)); end; end;
系統時間:2017-10-24 6:32:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!