、SelStart
/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キーを押します。左側の位置。
問題を再現するのに十分なコードを他の人に投稿する必要があります。 [良い質問をするにはどうすればいいですか?](http://stackoverflow.com/help/how-to-ask)を読んでください。 – MikeJRamsey56
あなたが使っているコードが見えないときに、あなたがやっていることがうまくいかない理由を説明するにはどうすればいいですか?問題を再現できるように[mcve]を投稿するか、私たちはあなたを助けることができません。私のコードはうまくいきませんが、私は自分のコードを表示しません。どうしましたか?単に動作しません。 –