Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как сохранить выделение в Memo? [D7, XP]


Alex_C ©   (2006-10-11 14:43:00) 

Я делал так: на событие OnMouseDown сохранял позицию SelStart, а затем непосредственно перед изменением текста мемо сохранял SelLength. После изменения текста мемо восстанавливал SelStart и SelLength. Но это работает только при выделении текста с лева на право. При обратном выделении после восстановления естественно позиция SelStart меняется и выделяется кусок, который был бы выделен при выделении слева на право. Как этого избежать?


Alex_C   (2006-10-12 09:56:00) [1]

Еще раз попытаюсь объяснить суть проблемы:
у меня есть мемо, в которое с некоторого устройства приходят данные (текстовые). Я хочу, чтобы оператор одновременно с этим мог выделять данные ну и допустим скопировать их. При добавлении текста в мемо выделение естественно сбрасывается. Чтоб оно не сбрасывалось я делаю так:
      // Сохраняем старые координаты выделения
      OldSelLength := SelLength;
      OldSelStart := SelStart;
      // Что-то там пишем в мемо
      Text := Text + 'ksbdksdb'; <- тут понятно для примера абра-кадабра
      // Восстанавливаем выделение
      SelStart := OldSelStart;
      SelLength := OldSelLength;
Если текст уже выделен - выделение естественно сохраняется, тут проблем нет. Но данные поспупают практически постоянно, и если оператор еще не закончил вылеление, а данные поступили - то то, что он вылелил - сбрасывается. Причем сбрасыается в том случае, если оператор выделяет текст справо на лево. Вот и хочу сделать, чтоб выделение не сбрасывалось.


Думкин   (2006-10-12 09:05:00) [2]

Пропустил.

> и в это время позвлить проге добавлять в мемо новые строки.

А что мешает запоминать перед тем как добавлять? Проблему проясни глубже.


Думкин   (2006-10-12 08:45:00) [3]


> Alex_C ©   (11.10.06 14:43)  
> Я делал так: на событие OnMouseDown

Повесь на Ап.


Alex_C   (2006-10-12 08:39:00) [4]

То han_malign: попробовал. Работает только в 1 строке. В 1 позиции 2 строки выдает 65543, в 1 позиции 3 строки 131162 и т.д. Что-то непонятные какие-то значения? Должно быть 7 и 90.


Alex_C   (2006-10-12 08:35:00) [5]

То Джо: ты меня немного не понял. Когда ты выделил - естественно совпадают, а я говорю о том, когда ты находишься в ПРОЦЕССЕ выделения - т.е. ведешь мышью, и при этом у тебя что-то добавляется  в мемо. Вот мне надо сохранять это выделение. Попробуй пример: положи на форму TMemo (чтоб не мерцало включи DoubleBuffered), и TTimer. Далее

procedure TForm1.Timer1Timer(Sender: TObject);
begin
   With Memo1 do
   begin
       // Сохраняем старые координаты выделения
       OldSelLength := SelLength;
       OldSelStart := SelStart;
       // Что-то там пишем в мемо
       Text := Text + 'ksbdksdb';
       // Восстанавливаем выделение
       SelStart := OldSelStart;
       SelLength := OldSelLength;
   end;
end;

Так вот - если у нас кусок был вылелен - то выделение естественно сохраняется - тут проблем нет, а если событие происходит именно в момент, когда пользователь еще делает выделение, то оно сбразывается в том случае, если оно происходит СПРАВО на ЛЕВО. Причина тут как бы ясна - мы восстанавливаем старые значения SelStart-SelLength, а мышь то уже сдвинулась влево и SetStart в этом случае изменилось. Вот собственно и проблема - как следать так, чтобы выделение пользователя сохранять и в тот момент, когда он его еще не закончил и в это время позвлить проге добавлять в мемо новые строки.


han_malign   (2006-10-11 18:32:00) [6]

телепатирую:
function EMCaretPos(Handle: THandle): Integer;
var
  P: TPoint;
begin
  Windows.GetCaretPos(P);
  Result:=SendMessage(Handle,EM_CHARFROMPOS,0,MakeLong(P.X, P.Y));
end;


Джо   (2006-10-11 16:52:00) [7]

> [4] Alex_C ©   (11.10.06 16:37)
> Попробуй вот это:

Аналогично. Значение SelStart всегда одинаковое, как бы не начинал выделение — справа или слева.


Alex_C   (2006-10-11 16:37:00) [8]

Попробуй вот это:

procedure TForm1.Memo1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
   Label1.Caption := 'SelStart = ' + IntToStr( Memo1.SelStart );
   Label2.Caption := 'SelLength = ' + IntToStr( Memo1.SelLength );
end;


Джо   (2006-10-11 16:27:00) [9]

> [2] Alex_C ©   (11.10.06 16:07)
> Нет.

Предлагаю убедиться в обратном. Выделяем сначала слева-направо, затем справа-налево (тот же фрагмент) и каждый раз вызываем:

procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMessage(IntToStr(Memo1.SelStart));
end;

Как видим, значение SelStart в обоих случаях будет одинаковым.


Alex_C   (2006-10-11 16:07:00) [10]

Нет. Значение SelLength - всегда положительное, а SelStart в зависимости от того, в какую сторону выделяешь - оно или не изменяется (слева на право) или уменьшается (справа на лево).


Джо   (2006-10-11 15:23:00) [11]

Подобного эффекта я не встречал. Хоть справа-налево выделяй, хоть слева-направо — в SelStart будет находиться одинаковое значение.


Наверх

Титульная страница Поиск, карта сайта Написать письмо