Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > SynUniHighlighter и SynEdit > Drag&Drop в SynMemo


Автор: igoreka 27.3.2009, 09:13
Добрый день
Необходимо что бы при Drag&Drop вставка шла на место указанное курсором мыши
в RichEdit это работает нормально

Код

void __fastcall TForm1::RichEdit1DragOver(TObject *Sender, TObject *Source,
      int X, int Y, TDragState State, bool &Accept)
{
// Accept = Source = ListBox1;
TPoint P;
P = Point(X, Y);                     
result =  SendMessage(RichEdit1->Handle, EM_CHARFROMPOS,(WPARAM)0, (LPARAM)(POINTL*)&P );
//Caption=result;
RichEdit1->SelStart=result;
RichEdit1->SetFocus();
}


В SynMemo result = 65ххх (точно число не помню) и не изменяется

(SynMemo на форме создается динамически во время выполнения программы )

Как решить эту проблему?

Заранее благодарен

Автор: igoreka 30.3.2009, 09:58
основная проблема решена

единственно не знаю как правиль спозицианировать курсор, пока написал 
Код

SynEdit1->SetFocus();
TPoint p;
p=Point(X,Y);
SynEdit1->CaretXY = BufferCoord(p.x/10,p.y/10)

как правильно указать положение кусора?

Автор: Crw 30.3.2009, 20:26
SynEdit1->CaretX = X;
SynEdit1->CaretY = Y;

Автор: igoreka 31.3.2009, 07:16
Цитата(Crw @ 30.3.2009,  20:26)
SynEdit1->CaretX = X;
SynEdit1->CaretY = Y;

то же самое что и SynEdit1->CaretXY = BufferCoord(X,Y)
при малейшем движении мыши курсор бегает по всему полю
я так понимаю надо разделить на высоту (ширину) шрифта, но с этим проблема

Автор: Crw 31.3.2009, 16:03
Не сразу понял что надо из экранных координат перегнать в позицию курсора.
Попробуй воспользоваться функцией SynEdit'а
function DisplayToBufferPos(const p: TDisplayCoord): TBufferCoord;

Автор: igoreka 1.4.2009, 11:02
Спасибо за ответ
function DisplayToBufferPos(const p: TDisplayCoord): TBufferCoord;

можно премер как эту функцию использовать, метод науч. тыка не помог


Автор: Crw 1.4.2009, 21:15
Код

procedure TForm1.SynEditMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  dcr:SynEditTypes.TDisplayCoord;
  bcr:TBufferCoord;
begin
  dcr:=SynEdit.PixelsToRowColumn(x,y);
  bcr:=SynEdit.DisplayToBufferPos(dcr);
  SynEdit.CaretXY:=bcr;
end;

Автор: igoreka 2.4.2009, 09:29
 smile Спасибо! То что нужно!

прада не смог перевести на С++

 dcr:SynEditTypes.TDisplayCoord;
  bcr:TBufferCoord;

на
TBufferCoord bcr;
пишет 
[C++ Error] Unit1.cpp(221): E2015 Ambiguity between 'TBufferCoord' and 'Synedittypes::TBufferCoord'

пришлось без промежуточных
NewSynMemo[PageControl1->ActivePageIndex]->CaretXY =NewSynMemo[PageControl1->ActivePageIndex]->DisplayToBufferPos(NewSynMemo[PageControl1->ActivePageIndex]->PixelsToRowColumn(X,Y));  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)