Показать сообщение отдельно
  #5  
Старый 24.05.2011, 20:06
KiL0z KiL0z вне форума
Прохожий
 
Регистрация: 27.05.2010
Сообщения: 23
Репутация: 10
Радость

Уф... все же два дня поисков увенчались успехом - нашел, ура!

Кажется то что нужно, наконец, по крайней мере работает пока как надо (это оригинал кода 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;
Теперь осталось разобраться с буфером обмена, но тут не знаю с какой стороны подступиться

---------
Кстати, как перехватить попытки вырезать и вставить (копирование не нужно) до их выполнения и определить область выделения (для случая вырезания) - в тех же координатах [строка, позиция_в_строке] ?
Ответить с цитированием