вопрос по memo (*разрешён*)
Модератор: Модераторы
-
prom-net-pixel
- новенький
- Сообщения: 13
- Зарегистрирован: 21.12.2009 01:25:50
вопрос по memo (*разрешён*)
Привет all!
Как пролистывать (не через жо) в коде memo?
Интересует кроссплатформенный случай.
З.Ы. Гугл и поиск по форуму использовал. Честно.
Как пролистывать (не через жо) в коде memo?
Интересует кроссплатформенный случай.
З.Ы. Гугл и поиск по форуму использовал. Честно.
Последний раз редактировалось prom-net-pixel 25.12.2009 00:56:55, всего редактировалось 1 раз.
prom-net-pixel писал(а):Как пролистывать (не через жо) в коде memo?
Не плохо бы узнать, что Вы имеете в виду под термином "пролистывать".
Мемо - это массив строк. Если Вам надо перебирать строки, то и делайте это как Вы делаете в массиве:
Код: Выделить всё
For i:=0 To Memo.Lines.Count-1 Do
Memo.Lines[i]:='тыры-пыры';Уважаемый prom-net-pixel,
на вскидку могу предложить такой вариант:
Предположим у нас есть Memo1 и две кнопки Up и Down, тогда:
Поясню:
У TMemo есть доступное только для чтения свойство CaretPos (собственно, будь оно Read-Write - вообще всё было бы просто) типа TPoint, где X - положение курсора в текущей строке, а Y - номер текущей строки. В то же самое время в TMemo есть свойство SelStart, отвечающее за, так сказать, "глобальную" позицию курсора.
Таким образом, вычтя CaretPos.X из SelStart, мы переведем курсор в начало текущей строки, а, вычтя еще и 2 (в Linux, предполагаю, 1) - в конец предыдущей строки.
Аналогично, прибавив к SelStart разницу между длиной текущей строки и позицией курсора в ней же
Ну, а для полного счастья, можно в код подставить константу (скажем, EoLLen) значение, которой определять с помощью директив:
Надеюсь, предлагаемый способ не покажется Вам излишне извращенным.
С уважением, Алексей.
на вскидку могу предложить такой вариант:
Предположим у нас есть Memo1 и две кнопки Up и Down, тогда:
Код: Выделить всё
procedure TForm1.UpClick(Sender: TObject);
var
cp:integer;
begin
cp:=Memo1.SelStart-Memo1.CaretPos.X-2;
if cp<0 then cp:=0;
Memo1.SelStart:=cp
end;
Код: Выделить всё
procedure TForm1.DownClick(Sender: TObject);
var
cp:integer;
begin
if Memo1.CaretPos.y<Memo1.Lines.Count then begin
cp:=Memo1.SelStart+2+Length(Memo1.Lines[Memo1.CaretPos.y])-Memo1.CaretPos.x;
Memo1.SelStart:=cp
end;
end;
Поясню:
У TMemo есть доступное только для чтения свойство CaretPos (собственно, будь оно Read-Write - вообще всё было бы просто) типа TPoint, где X - положение курсора в текущей строке, а Y - номер текущей строки. В то же самое время в TMemo есть свойство SelStart, отвечающее за, так сказать, "глобальную" позицию курсора.
Таким образом, вычтя CaretPos.X из SelStart, мы переведем курсор в начало текущей строки, а, вычтя еще и 2 (в Linux, предполагаю, 1) - в конец предыдущей строки.
Аналогично, прибавив к SelStart разницу между длиной текущей строки и позицией курсора в ней же
, мы переведём курсор в конец текущей строки, а прибавив 2 (1) - на следующую строку.Length(Memo1.Lines[Memo1.CaretPos.y])-Memo1.CaretPos.x
Ну, а для полного счастья, можно в код подставить константу (скажем, EoLLen) значение, которой определять с помощью директив:
Код: Выделить всё
const
{$ifDef UNIX}
EoLLen=1;
{$EndIf}
{$IfDef WINDOWS}
EoLLen=2;
{$EndIf}
Надеюсь, предлагаемый способ не покажется Вам излишне извращенным.
С уважением, Алексей.
-
prom-net-pixel
- новенький
- Сообщения: 13
- Зарегистрирован: 21.12.2009 01:25:50
Спасибо всем!
Алексей, попробую Ваш способ. Так и думал, что нужно что-то сделать с CaretPos и SelStart, но опыта не хватило придумать.
Это то, что мне было нужно. Ещё раз спасибо.
Алексей, попробую Ваш способ. Так и думал, что нужно что-то сделать с CaretPos и SelStart, но опыта не хватило придумать.
Это то, что мне было нужно. Ещё раз спасибо.
-
prom-net-pixel
- новенький
- Сообщения: 13
- Зарегистрирован: 21.12.2009 01:25:50
Следующий
обслуживает Memo1, который служит для отображения служебной информации.
Он скроллит, но не до конца (упорно не хочет отображать две последние строчки). Почему так?
сделал
т.к. после отображения строки теоретически старый участок кода должен давать ноль.
результат не изменился.
изменение этого же участка кода на
не отображает последние 4 строки
Добавлено спустя 47 минут 19 секунд:
Извратился даже так:
не-а
Код: Выделить всё
Memo1.SelStart:=Memo1.SelStart+2{т.к. сам прибавляю#13#10}+length(Memo1.Lines[Memo1.CaretPos.Y]) {-Memo1.CaretPos.X в принципе можно не указывать, т.к. изначально курсор находится в начале строки};обслуживает Memo1, который служит для отображения служебной информации.
Он скроллит, но не до конца (упорно не хочет отображать две последние строчки). Почему так?
сделал
Код: Выделить всё
length(Memo1.Lines[Memo1.CaretPos.Y-1])т.к. после отображения строки теоретически старый участок кода должен давать ноль.
результат не изменился.
изменение этого же участка кода на
Код: Выделить всё
length(Memo1.Lines[Memo1.Lines.Count])не отображает последние 4 строки
Добавлено спустя 47 минут 19 секунд:
Извратился даже так:
Код: Выделить всё
Memo1.Text :=Memo1.Text+ fStatusText;
Memo1.SelStart:= Memo1.SelStart+length(Memo1.Lines[Memo1.CaretPos.Y])-Memo1.CaretPos.X;
Memo1.Text :=Memo1.Text+ #13#10;
Memo1.SelStart:=Memo1.SelStart+2; не-а
Код: Выделить всё
Memo1.Lines.Append(fStatusText);
//Memo1.Refresh;
Простите, prom-net-pixel,
но, если я правильно понял, Ваша задача решается простейшим способом:
или
А Мемка сама прокручивается (ну, по крайней мере, в 0.9.28.2 и старше).
И зря мы с Вами "огород городили"
но, если я правильно понял, Ваша задача решается простейшим способом:
Код: Выделить всё
Memo1.Lines.Add(fStatusText)
или
Код: Выделить всё
Memo1.Lines.Append(fStatusText)
А Мемка сама прокручивается (ну, по крайней мере, в 0.9.28.2 и старше).
И зря мы с Вами "огород городили"
-
prom-net-pixel
- новенький
- Сообщения: 13
- Зарегистрирован: 21.12.2009 01:25:50
Да
и это основная причина, почему я написал в обучение

Спасибо в очередной раз
З.Ы. Теоретическая часть однако полезна.
Спасибо в очередной раз
З.Ы. Теоретическая часть однако полезна.
