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

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

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

Сообщение prom-net-pixel » 21.12.2009 04:42:28

Привет all!
Как пролистывать (не через жо) в коде memo?
Интересует кроссплатформенный случай.
З.Ы. Гугл и поиск по форуму использовал. Честно.
Последний раз редактировалось prom-net-pixel 25.12.2009 01:56:55, всего редактировалось 1 раз.
prom-net-pixel
новенький
 
Сообщения: 13
Зарегистрирован: 21.12.2009 02:25:50

Re: вопрос по memo

Сообщение Vadim » 21.12.2009 06:34:22

prom-net-pixel писал(а):Как пролистывать (не через жо) в коде memo?

Не плохо бы узнать, что Вы имеете в виду под термином "пролистывать". :)
Мемо - это массив строк. Если Вам надо перебирать строки, то и делайте это как Вы делаете в массиве:
Код: Выделить всё
For i:=0 To Memo.Lines.Count-1 Do
Memo.Lines[i]:='тыры-пыры';
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: вопрос по memo

Сообщение Putnick » 21.12.2009 11:36:25

Уважаемый 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}


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

С уважением, Алексей.
Putnick
новенький
 
Сообщения: 62
Зарегистрирован: 18.03.2009 13:02:56

Re: вопрос по memo

Сообщение prom-net-pixel » 21.12.2009 16:48:20

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

Re: вопрос по memo

Сообщение prom-net-pixel » 24.12.2009 03:49:32

Следующий
Код: Выделить всё
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:
prom-net-pixel
новенький
 
Сообщения: 13
Зарегистрирован: 21.12.2009 02:25:50

Re: вопрос по memo

Сообщение v-t-l » 24.12.2009 11:53:40

Код: Выделить всё
  Memo1.Lines.Append(fStatusText);
  //Memo1.Refresh;
v-t-l
энтузиаст
 
Сообщения: 740
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: вопрос по memo

Сообщение Putnick » 24.12.2009 13:17:10

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

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

А Мемка сама прокручивается (ну, по крайней мере, в 0.9.28.2 и старше).
И зря мы с Вами "огород городили" :wink:
Putnick
новенький
 
Сообщения: 62
Зарегистрирован: 18.03.2009 13:02:56

Re: вопрос по memo

Сообщение prom-net-pixel » 25.12.2009 01:55:58

Да :D и это основная причина, почему я написал в обучение :) :)
Спасибо в очередной раз :)
З.Ы. Теоретическая часть однако полезна.
prom-net-pixel
новенький
 
Сообщения: 13
Зарегистрирован: 21.12.2009 02:25:50


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru