![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сохранить выделение в 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 будет находиться одинаковое значение.