2016-04-30 43 views
0

私は、外部ListSourceを使用せずに独自のSQL(Devart UniDacを使用)でDBLookupComboBoxコンポーネントを開発しています。 ListField、KeyField。すべてが完璧に動作していますが、より良いユーザーインターフェイスのために、私は小さな細部が必要です。Delphi - selstartとsellengthを使用していますが、カーソルは左側にあります(セルの開始位置)代わりにend(sellengthの位置)

私はいつもユーザーの入力に応じて選択したテキストを残します。文字が入力されたとき、大丈夫です。 SelStart/SelLengthはテキストの終わりにカーソルを置く(sellength)ので、移動キーがタイプされているとき(VK_LEFT、VK_RIGHT、組み合わせなど)、プロセスはクールではありません。 SelStartで)、最後に入力された文字の横に表示されます。

コンポーネント(TFrame、TEditなどを使用)。

enter image description here

ユーザーは、私のコンポーネントが最初の人を見つけて強調表示するSelStart/SelLengthを使用し、BIANを入力しました。

enter image description here

ユーザーVK_LEFTを入力した、私のコンポーネントは、これを示す必要があります。

enter image description here

をしかし示し、この:残念ながら

+0

問題を再現するのに十分なコードを他の人に投稿する必要があります。 [良い質問をするにはどうすればいいですか?](http://stackoverflow.com/help/how-to-ask)を読んでください。 – MikeJRamsey56

+0

あなたが使っているコードが見えないときに、あなたがやっていることがうまくいかない理由を説明するにはどうすればいいですか?問題を再現できるように[mcve]を投稿するか、私たちはあなたを助けることができません。私のコードはうまくいきませんが、私は自分のコードを表示しません。どうしましたか?単に動作しません。 –

答えて

3

enter image description hereSelStart/SelLengthプロパティにありませんあなたが求めるものをサポートするg for。 Despite what MSDN documentation claimsの場合、キャレットは常に選択範囲の右側に配置されます。

しかし、あなたが代わりに選択の左側にキャレットを配置するために使用できる簡単なトリックがあります:代わり

procedure SelectText(Edit: TCustomEdit; iFirst, iLast: Integer); 
var 
    bState: TKeyboardState; 
    bNewState: TKeyboardState; 
    i: Integer; 
begin 
    if iFirst <= iLast then begin 
    { 
    Edit.SelStart := iFirst; 
    Edit.SelLength := iLast - iFirst; 
    } 
    SendMessage(Edit.Handle, EM_SETSEL, iFirst, iLast); 
    end else 
    begin 
    //Edit.SelStart := iFirst; 
    SendMessage(Edit.Handle, EM_SETSEL, iFirst, iFirst); 
    if GetKeyboardState(bState) then 
    begin 
     bNewState := bState; 
     bNewState[VK_SHIFT] := bNewState[VK_SHIFT] or 128; 
     if SetKeyboardState(bNewState) then 
     begin 
     repeat 
      SendMessage(Edit.Handle, WM_KEYDOWN, VK_LEFT, 0); 
      Dec(iFirst); 
     until iFirst = iLast; 
     SendMessage(Edit.Handle, WM_KEYUP, VK_LEFT, 0); 
     SetKeyboardState(bState); 
     end; 
    end; 
    end; 
end; 

procedure SelectText(Edit: TEdit; iFirst, iLength: Integer); 
var 
    bState: TKeyboardState; 
    bNewState: TKeyboardState; 
    i: Integer; 
begin 
    if iLength >= 0 then begin 
    { 
    Edit.SelStart := iFirst; 
    Edit.SelLength := iLength; 
    } 
    SendMessage(Edit.Handle, EM_SETSEL, iFirst, iFirst + iLength); 
    end else 
    begin 
    //Edit.SelStart := iFirst; 
    SendMessage(Edit.Handle, EM_SETSEL, iFirst, iFirst); 
    if GetKeyboardState(bState) then 
    begin 
     bNewState := bState; 
     bNewState[VK_SHIFT] := bNewState[VK_SHIFT] or 128; 
     if SetKeyboardState(bNewState) then 
     begin 
     repeat 
      SendMessage(Edit.Handle, WM_KEYDOWN, VK_LEFT, 0); 
      Inc(iLength); 
     until iLength = 0; 
     SendMessage(Edit.Handle, WM_KEYUP, VK_LEFT, 0); 
     SetKeyboardState(bState); 
     end; 
    end; 
    end; 
end; 

はあなたが定義するかどうかに応じて、絶対開始/終了位置、または開始位置と長さを使用した選択。

基本的に、終了位置が開始位置よりも低い場合、コードは開始位置の右側にキャレットを置き、次にキャレットが目的の位置に達するまでShift + Leftキーを押します。左側の位置。

+0

ありがとう、大変ありがとうございました!完璧に働いた! 他の人に使いやすくするためのコメント: 上記の関数を呼び出すときは、最高値をiFirst、最低値をiLastとします。つまり、SelectText(Edit、SelLength、SelStart) –

+0

@FashionStradaこの関数は、左から右への選択と右から左への選択の両方を可能にします。 –

関連する問題