全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1004
推到 Plurk!
推到 Facebook!

dblookupcombox 的輸入速度調整

缺席
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-30 01:16:07 IP:61.71.xxx.xxx 未訂閱
請問各位! 我設置一組 dblookupcombobox元件, 假設其中有一組(一共1000組記錄)為 王大頭 在combox closeup的狀態下使用者不希望以下拉方式來選擇, 因為1000組太多了 , 所以希望直接輸入王大再下拉就可以更快找到 如果輸入的速度平均則可以輸入王大就找到"王大"起頭的記錄, 但如果輸入一個"王", 過了4-5秒再輸入"大", 則系統即消除前一個"王"的記憶 反而找到以"大"為開頭的記錄, 有沒有辦法可以關閉或延長這個等待時間, 以 配合中打速度慢的人, 謝謝!
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-02 12:13:26 IP:61.222.xxx.xxx 未訂閱
我沒用過 TDBLookupComboBox,以下推測應該也是八九不離十。 在Delphi 源碼中,有定義以下程式。我把它列出,方便證明我的推測。    
procedure TDBLookupControl.ProcessSearchKey(Key: Char);
var
  TickCount: Integer;
  S: string;
  CharMsg: TMsg;
begin
  if (FListField <> nil) and (FListField.FieldKind in [fkData, fkInternalCalc]) and
    (FListField.DataType in [ftString, ftWideString]) then
    case Key of
      #8, #27: SearchText := '';
      #32..#255:
        if CanModify then
        begin
          
          TickCount := GetTickCount;
          if TickCount - SearchTickCount > 2000 then SearchText := '';
          SearchTickCount := TickCount;
          
          if SysLocale.FarEast and (Key in LeadBytes) then
            if PeekMessage(CharMsg, Handle, WM_CHAR, WM_CHAR, PM_REMOVE) then
            begin
              if CharMsg.Message = WM_Quit then
              begin
                PostQuitMessage(CharMsg.wparam);
                Exit;
              end;
              SearchText := SearchText   Key;
              Key := Char(CharMsg.wParam);
            end;
          if Length(SearchText) < 32 then
          begin
            S := SearchText   Key;
            try
              if FListLink.DataSet.Locate(FListField.FieldName, S,
                [loCaseInsensitive, loPartialKey]) then
              begin
                SelectKeyValue(FKeyField.Value);
                SearchText := S;
              end;
            except
              { If you attempt to search for a string larger than what the field
                can hold, and exception will be raised.  Just trap it and
                reset the SearchText back to the old value. }
              SearchText := S;
            end;
          end;
        end;
    end;
end;
在標示紅字,限定 兩秒就重新設定 SearchText := ''; 由於該 秒數變數為私有,無法更改! 為一一途,為更改元件,可能還有些希望。
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-02 23:25:30 IP:61.71.xxx.xxx 未訂閱
感謝提供, 因為趕案子無法細查程式內段, 有勞wameng兄幫我找出來 看情況得自己創造一個繼承元件, 等改好再丟上來給各位, 謝謝!
系統時間:2024-11-25 8:51:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!