Форум: "Начинающим";
Текущий архив: 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