Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];

Вниз

Как сохранить выделение в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.052 c
15-1159902923
EkZot
2006-10-03 23:15
2006.10.29
ПОмогите плз. операции с матрицами.


3-1157437387
Sansy
2006-09-05 10:23
2006.10.29
таблица не существует?


15-1159866263
vitv
2006-10-03 13:04
2006.10.29
Я нашёл официальный русский MSDN.


15-1160130608
zdm
2006-10-06 14:30
2006.10.29
Mercury


1-1158567014
dmitry kholl
2006-09-18 12:10
2006.10.29
Бездействие с программой





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский