Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.29;
Скачать: CL | DM;

Вниз

Как сохранить выделение в Memo?   Найти похожие ветки 

 
Alex_C ©   (2006-10-11 14:43) [0]

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


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

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


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

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


 
Джо ©   (2006-10-11 16:27) [3]

> [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:37) [4]

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

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:52) [5]

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

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


 
han_malign ©   (2006-10-11 18:32) [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;


 
Alex_C ©   (2006-10-12 08:35) [7]

То Джо: ты меня немного не понял. Когда ты выделил - естественно совпадают, а я говорю о том, когда ты находишься в ПРОЦЕССЕ выделения - т.е. ведешь мышью, и при этом у тебя что-то добавляется  в мемо. Вот мне надо сохранять это выделение. Попробуй пример: положи на форму 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 в этом случае изменилось. Вот собственно и проблема - как следать так, чтобы выделение пользователя сохранять и в тот момент, когда он его еще не закончил и в это время позвлить проге добавлять в мемо новые строки.


 
Alex_C ©   (2006-10-12 08:39) [8]

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


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


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

Повесь на Ап.


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

Пропустил.

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

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


 
Alex_C ©   (2006-10-12 09:56) [11]

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



Страницы: 1 вся ветка

Текущий архив: 2006.10.29;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.077 c
15-1160316660
@!!ex
2006-10-08 18:11
2006.10.29
Install Shield и реестр


2-1161061981
wipr
2006-10-17 09:13
2006.10.29
Проблемы с отображением данных из БД в QuickReport


3-1157456549
pic509
2006-09-05 15:42
2006.10.29
"Залипание" данных при вызове Хранимой процедуры


1-1158477840
так себе
2006-09-17 11:24
2006.10.29
печать конвертов


2-1160997598
Volodya_
2006-10-16 15:19
2006.10.29
TImage