Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Memo, Memo 
:(
    Опции темы
Exploited
Дата 20.6.2002, 15:26 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Усем привет!

Как вывести ScrollBars в Memo1 только тогда, когда пользователь ввел текст, больше размера окна Memo1? Т.е нужно, чтобы ScrollBars не постоянно был виден, а только тогда, когда нужен.

Добавить ScrollBars не проблема:

Memo1.ScrollBars := ssVertical;

А как отловить нужный мне момент?
  Вверх
Song
Дата 20.6.2002, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



TMemo.onChange очевидно


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Exploited
Дата 20.6.2002, 20:36 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Да, понимаю, но как отследить, что пора показывать прокрутку?
  Вверх
Song
Дата 20.6.2002, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Видимо когда длина текущей строки становится больше клиентской области визуального компонента. Длину можно определить с помощью ф-ии TCanvas.TextWidth()


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Exploited
Дата 20.6.2002, 22:12 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А нелучше ли как-нибудь построчно это сделать? Прокрутка то у меня вертикальная.
  Вверх
Song
Дата 21.6.2002, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Если нужно отследить вертикальную прокрутку, то тогда ещё легче.
Нужно проверять когда кол-во строк превысит высоту в пикселях чем клиентская высота TMemo т.е. когда выполнится следующее условие

Т.к. шрифт у TMemo одинаков везде, то

With Memo1 Do IF Height>(Canvas.TextHeight(Lines[0])+2)*Lines.Count then ScrollBars:=ssNone else ScrollBars:=ssVertical;

Также видимо этот обработчик придётся вызывать и с TMemo.onKeyUp также.
Помучайте этот кусочек кода.


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Exploited
Дата 21.6.2002, 11:07 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Отлично!
Спасибочки!
  Вверх
Exploited
Дата 21.6.2002, 18:41 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Код работает не плохо, но есть одно но: когда появляется прокрутка, курсор перескакивает в начало самой первой строки. Как от этого избавиться?
  Вверх
Song
Дата 21.6.2002, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Очевидно запоминать TMemo.StartPos, а потом его восстанавливать.


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Exploited
Дата 21.6.2002, 19:44 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











У TMemo нет такого свойства StartPos, по крайней мере в Delphi3.
  Вверх
Song
Дата 21.6.2002, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Да, конечно же я перепутал классы. Нужное нам свойство - это TMemo.SelStart а не StartPos :)

Чтобы искупить вину от ошибки и предотвратить Вас от дальнейших экспериментов пишу Вам финальный код:
Код

procedure TForm1.Memo1Change(Sender: TObject);
begin
With TMemo(Sender) Do
 IF Length(Lines.Text)>0 then
  Begin
   Tag:=SelStart;
   IF ((Canvas.TextHeight(Lines[0])+2)*Lines.Count)>Height then ScrollBars:=ssVertical else ScrollBars:=ssNone;
   SelStart:=Tag;
  End;
end;


Я дико извиняюсь, но у меня вопрос: а зачем Вам это понадобилось если TMemo сам делает появление скроллбаров или я что-то упустил в этой жизни ? :)


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Exploited
Дата 22.6.2002, 10:33 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо, всё работает!
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0456 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.