Уф... все же два дня поисков увенчались успехом - нашел, ура!
Кажется то что нужно, наконец, по крайней мере работает пока как надо (это оригинал кода
Armorer):
Код:
Procedure TfMain.ResetStatusPos;
var
X, Y : Integer;
begin
if CarPos <> -1 then// если нажали мышь и выделяем текст - то здесь начало выделяемого текста
begin
if ( Memo.SelStart + Memo.SelLength ) = CarPos // вычисляем в какую сторону выделяем
then
begin
// строка - если выделяем в сторону начала текста
Y := Memo.Perform( EM_LINEFROMCHAR, -1, -1 );
// колонка - если выделяем в сторону начала текста
X := LoWord( Memo.Perform( EM_GETSEL, 0, 0 ) ) - Memo.Perform( EM_LINEINDEX, -1, 0 );
end
else
begin
// строка - если выделяем в сторону конца текста
Y := Memo.CaretPos.Y;
// колонка - если выделяем в сторону конца текста
X := HiWord( Memo.Perform( EM_GETSEL, 0, 0 ) ) - Memo.Perform( EM_LINEINDEX, -1, 0 );
end;
end
else
begin
Y := Memo.Perform( EM_LINEFROMCHAR, -1, -1 );
X := LoWord( Memo.Perform( EM_GETSEL, 0, 0 ) ) - Memo.Perform( EM_LINEINDEX, -1, 0 );
end;
inc(Y);
inc(X);
StatusBar.Panels[0].Text := IntToStr( Y ) + ':' + IntToStr( X );
end;
procedure TfMain.MemoMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Memo.SelLength = 0 then
CarPos := -1;
ResetStatusPos;
end;
procedure TfMain.MemoMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
ResetStatusPos;
end;
procedure TfMain.MemoMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
CarPos := Memo.SelStart;
ResetStatusPos;
end;
procedure TfMain.MemoKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if not (ssShift in Shift) and (Memo.SelLength = 0) then
CarPos := -1;
ResetStatusPos;
end;
procedure TfMain.MemoKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (CarPos = -1) and (ssShift in Shift) then
CarPos := Memo.SelStart;
ResetStatusPos;
end;
Теперь осталось разобраться с буфером обмена, но тут не знаю с какой стороны подступиться
---------
Кстати, как перехватить попытки вырезать и вставить (копирование не нужно) до их выполнения и определить область выделения (для случая вырезания) - в тех же координатах [строка, позиция_в_строке] ?