Страница 1 из 1

вопрос по memo (*разрешён*)

СообщениеДобавлено: 21.12.2009 04:42:28
prom-net-pixel
Привет all!
Как пролистывать (не через жо) в коде memo?
Интересует кроссплатформенный случай.
З.Ы. Гугл и поиск по форуму использовал. Честно.

Re: вопрос по memo

СообщениеДобавлено: 21.12.2009 06:34:22
Vadim
prom-net-pixel писал(а):Как пролистывать (не через жо) в коде memo?

Не плохо бы узнать, что Вы имеете в виду под термином "пролистывать". :)
Мемо - это массив строк. Если Вам надо перебирать строки, то и делайте это как Вы делаете в массиве:
Код: Выделить всё
For i:=0 To Memo.Lines.Count-1 Do
Memo.Lines[i]:='тыры-пыры';

Re: вопрос по memo

СообщениеДобавлено: 21.12.2009 11:36:25
Putnick
Уважаемый prom-net-pixel,
на вскидку могу предложить такой вариант:
Предположим у нас есть 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 разницу между длиной текущей строки и позицией курсора в ней же
Length(Memo1.Lines[Memo1.CaretPos.y])-Memo1.CaretPos.x
, мы переведём курсор в конец текущей строки, а прибавив 2 (1) - на следующую строку.
Ну, а для полного счастья, можно в код подставить константу (скажем, EoLLen) значение, которой определять с помощью директив:
Код: Выделить всё
const
{$ifDef UNIX}
  EoLLen=1;
{$EndIf}
{$IfDef WINDOWS}
  EoLLen=2;
{$EndIf}


Надеюсь, предлагаемый способ не покажется Вам излишне извращенным.

С уважением, Алексей.

Re: вопрос по memo

СообщениеДобавлено: 21.12.2009 16:48:20
prom-net-pixel
Спасибо всем!
Алексей, попробую Ваш способ. Так и думал, что нужно что-то сделать с CaretPos и SelStart, но опыта не хватило придумать.
Это то, что мне было нужно. Ещё раз спасибо.

Re: вопрос по memo

СообщениеДобавлено: 24.12.2009 03:49:32
prom-net-pixel
Следующий
Код: Выделить всё
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 строки :shock:

Добавлено спустя 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;

не-а :cry:

Re: вопрос по memo

СообщениеДобавлено: 24.12.2009 11:53:40
v-t-l
Код: Выделить всё
  Memo1.Lines.Append(fStatusText);
  //Memo1.Refresh;

Re: вопрос по memo

СообщениеДобавлено: 24.12.2009 13:17:10
Putnick
Простите, prom-net-pixel,
но, если я правильно понял, Ваша задача решается простейшим способом:
Код: Выделить всё
Memo1.Lines.Add(fStatusText)

или
Код: Выделить всё
Memo1.Lines.Append(fStatusText)

А Мемка сама прокручивается (ну, по крайней мере, в 0.9.28.2 и старше).
И зря мы с Вами "огород городили" :wink:

Re: вопрос по memo

СообщениеДобавлено: 25.12.2009 01:55:58
prom-net-pixel
Да :D и это основная причина, почему я написал в обучение :) :)
Спасибо в очередной раз :)
З.Ы. Теоретическая часть однако полезна.