いつもお世話になります、Terry です
RichEdit 4.1 がサポートされて佳いところもたくさんあったのですが
■URLの途中にキャレットを置いて Shift+End で後半を選択しようとすると
おっURLに用があるんか任せろ!みたいな感じで一行全選択してしまう(URL のみの行の場合)
Shift+Homeはそんな事しない
……と思っていたらURLの前に文字があると同じ動きをする
これはワードパッドでも同様な動きをするので MSFTEDIT.dll の仕様ということはわかるのですが
プレーンエディタと全く違う動きになってしまうのでプログラムから矯正出来ればありがたいです
OnKeyDown で(VK_SHIFT)and(Key=35 or 36)and(キャレット行内に'://'存在)の場合に
力業で SelStart と SelLength を変えて Key:=0 としてみたのですが
なかなか難敵で OnKeyUp とかも試したりいろいろやってもどれもしっくり動きません
そもそも Windowsコントロールの基礎動作を制御することは不可能なのでしょうか?
・Delphi 11 Community Edition のTRichEdit(EnableURLs:=True) および D2009上での TJvRichEdit で確認作業しています
以上、よろしくお願いいたしますm(_ _)m
OnKeyDownイベントで、試しに書いて見ました。
(あまりチェックしていないので、期待どおりに動作するかわからないですが・・)
procedure TForm1.RichEdit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
x, y, li: Integer;
begin
if (Key = VK_HOME) and (Shift = [ssShift]) then
begin
x := RichEdit1.CaretPos.X;
y := RichEdit1.CaretPos.Y;
li := RichEdit1.Perform(EM_LINEINDEX, UINT(-1), 0);
RichEdit1.SelLength := 0 - (RichEdit1.SelStart - li);
Key := 0;
end
else if (Key = VK_END) and (Shift = [ssShift]) then
begin
x := RichEdit1.CaretPos.X;
y := RichEdit1.CaretPos.Y;
li := RichEdit1.Perform(EM_LINEINDEX, UINT(-1), 0);
RichEdit1.SelStart := li + x;
RichEdit1.SelLength := Length(RichEdit1.Lines.Strings[y]) - x;
Key := 0;
end;
end;
igy さん、ありがとうございます
url のみの行だと正しい動きをしますが
前後に文字があるとやはりアドレスを引きずり込んでしまうようです
RichEdit1.EnableURLs := False では正常に動作する
RichEdit1.EnableURLs := False にしても URL は解除されない (テキスト書き込むと URL は消える)
RichEdit1.EnableURLs := True にしても選択エリアは変更しない
var
X,Y,LI: Integer;
SS: Integer;
begin
if (Key = VK_HOME) and (Shift = [ssShift]) then
begin
x := RichEdit1.CaretPos.X;
y := RichEdit1.CaretPos.Y;
li := RichEdit1.Perform(EM_LINEINDEX, UINT(-1), 0);
SS := RichEdit1.SelStart;
RichEdit1.EnableURLs := False;
RichEdit1.Lines[Y] := RichEdit1.Lines[Y];
RichEdit1.SelStart := SS;
RichEdit1.SelLength := 0 - (RichEdit1.SelStart - li);
RichEdit1.EnableURLs := True;
Key := 0;
end
else if (Key = VK_END) and (Shift = [ssShift]) then
begin
x := RichEdit1.CaretPos.X;
y := RichEdit1.CaretPos.Y;
li := RichEdit1.Perform(EM_LINEINDEX, UINT(-1), 0);
SS := RichEdit1.SelStart;
RichEdit1.EnableURLs := False;
RichEdit1.Lines[Y] := RichEdit1.Lines[Y];
RichEdit1.SelStart := SS;
RichEdit1.SelStart := li + x;
RichEdit1.SelLength := Length(RichEdit1.Lines.Strings[y]) - x;
RichEdit1.EnableURLs := True;
Key := 0;
end;
AAAAA さん、ありがとうございます
目から鱗が20枚くらい落ちました
RichEdit1.Lines[Y] := RichEdit1.Lines[Y];
の部分も秘術
ありがとうございました
ツイート | ![]() |