TRichEdit(RichEdit 4.1) で URL を Shift+End or Shift+Home した時の動作

解決


Terry  2023-06-10 10:38:30  No: 150959  IP: 192.*.*.*

いつもお世話になります、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

編集 削除
igy  2023-06-11 04:50:32  No: 150960  IP: 192.*.*.*

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;

編集 削除
Terry  2023-06-11 10:18:43  No: 150961  IP: 192.*.*.*

igy  さん、ありがとうございます
url のみの行だと正しい動きをしますが
前後に文字があるとやはりアドレスを引きずり込んでしまうようです

編集 削除
AAAAA  2023-06-12 06:59:46  No: 150962  IP: 192.*.*.*

 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;

編集 削除
Terry  2023-06-12 09:14:59  No: 150963  IP: 192.*.*.*

AAAAA さん、ありがとうございます

目から鱗が20枚くらい落ちました
RichEdit1.Lines[Y] := RichEdit1.Lines[Y];
の部分も秘術

ありがとうございました

編集 削除