Как сделать прокрутку в memo delphi

Добавил пользователь Дмитрий К.
Обновлено: 05.10.2024

Основу Delphi составляет не только сам язык, но и RAD (Rapid Application Development) – среда быстрой разработки программ . Благодаря визуальному программированию, а также достаточно большой библиотеке визуальных компонентов, Delphi позволяет создавать программы наиболее быстро и эффективно, принимая на себя основную работу, и оставляя программисту творческий процесс. Разумеется, возможность быстрого создания профессиональных приложений для Windows делает Delphi – программистов востребованными во всех отраслях человеческой деятельности.

Первая программа

Традиционно при изучении программирования принято создавать первую программу, которая выводит текст "Hello, world!". Не будем отступать от традиции и создадим программу, которая выводит этот текст тремя разными способами. Но вначале познакомимся с самой средой программирования Delphi. Предполагается, что на этот момент Delphi 7 уже установлена на вашем ПК. Если это не так, то перед дальнейшим прочтением лекции установите Delphi 7. При загрузке Delphi 7 вы видите такую картину:

Рабочая среда Delphi 7

Рис. 1.1. Рабочая среда Delphi 7

Познакомьтесь – это Delphi. У нее есть много окон, панелей, компонентов. С большинством из них мы познакомимся со временем, а пока нам нужно обратить внимание на 5 окон:

  1. Главное окно Delphi. Здесь находится основное меню, различные панели инструментов и палитра компонентов, состоящая из множества вкладок.
  2. Конструктор формы. Здесь мы визуально видим, как будет выглядеть форма программы, здесь мы будем создавать интерфейс, перенося на форму различные компоненты, и расставляя их таким образом, чтобы интерфейс выглядел привлекательным. Нам часто придется переключаться между конструктором форм и редактором кода, делается это клавишей F12.
  3. Редактор кода. Здесь мы видим исходный код программы, который создан самой Delphi. Тут же мы будем вводить наш собственный код.
  4. Объектный инспектор. Он предназначен для управления объектами проекта и состоит из двух вкладок – Properties (Свойства) и Events (События).
  5. Дерево объектов. Здесь мы видим, какой именно объект в данный момент является текущим. Это окно будет особенно полезно, когда на форме появится множество компонентов.

Когда открывается Delphi, она автоматически создает и отображает новый проект (программу). На рисунке вы видите проект , который содержит только одну стандартную форму . Форма – это тоже объект, который представляет собой окно программы. Чтобы программа делала что-то полезное, нам придется вносить изменения в нее. Выведем текст "Hello, world!" первым способом. Для этого в инспекторе объектов найдите свойство Caption. В данный момент текущим является объект – форма , и свойство Caption формы отвечает за надпись на системной строке программы (синяя полоса вверху любого программного окна). По умолчанию, свойство Caption содержит надпись "Form1", также называется и сама форма. Измените эту надпись на "Hello, world!" (конечно, без кавычек). Уже в процессе ввода текста вы видите, что надпись в системной строке принимает новый вид. Мы ввели этот текст одним способом.

Теперь нам нужно сохранить проект . Проект – совокупность файлов разных форматов, из которых создается программа. Об этом мы подробней поговорим в одной из следующих лекций, а пока запомните правило – каждую программу (проект), которую вы создаете, нужно сохранять в отдельной папке. Если вы все проекты станете сохранять в одну папку, то очень скоро запутаетесь. Чтобы сохранить проект, выполним следующие действия:

    Выбираем команду меню "File – Save All" (сохранить все), либо нажимаем горячие клавиши , либо нажимаем одноименную кнопку на панели инструментов

Рис. 1.2. Кнопки Save (Сохранить) и Save All (Сохранить всё) на панели инструментов

Далее нам необходимо скомпилировать программу, то есть, перевести исходный код в выполняемый exe-файл. Для этого мы можем выбрать команду меню "Run - Run", либо нажать горячую клавишу F9, либо нажать кнопку "Run" на панели инструментов (на кнопке изображение зеленой стрелки, указывающей вправо). В результате, программа была не только скомпилирована, но и запущена. Если вы посмотрите на системную строку Delphi, то увидите надпись "Delphi 7 – hello [Running]", а окна инспектора объектов и дерева объектов исчезли. Это говорит о том, что программа находится в режиме выполнения. Выполняемая программа имеет точно такой же вид, как наша главная форма, только на форме отсутствует точечная сетка, предназначенная для облегчения дизайна. Окно полученной программы содержит все стандартные кнопки Windows – программы. Щелкнув по красному крестику в правой верхней части окна, закройте программу (но не Delphi), и вы увидите прежнюю форму.

Обратите внимание, что свойства в Объектном Инспекторе принадлежат выделенному в данный момент компоненту. Выделяются компоненты простым щелчком мыши. Имейте в виду, что щелкать нужно один раз. Двойной щелчок создаст обработчик события – процедуру. Если вы ошибочно создадите таким образом процедуру, то просто сохраните проект, ничего в нее не вписывая – при сохранении последние пустые процедуры автоматически удаляются. Удалять их вручную не рекомендуется.

Попробуем второй способ. Обратите внимание на Палитру компонентов . Текущей является вкладка Standard , и на ней находится множество значков – компонентов. Когда вы подводите указатель мыши к какому-либо компоненту, через некоторое время выскакивает подсказка с именем компонента. Нам нужен компонент Label , который представлен на вкладке в виде кнопки с изображением жирной буквы "А". Щелкните по этой кнопке, затем щелкните по свободному месту на форме, чтобы вставить компонент. Лучше, если вы расположите его ближе к левому верхнему краю формы. Компонент Label появился на форме. Этот компонент представляет собой обычную надпись. Сейчас он выделен, и содержит надпись по умолчанию, - "Label1". Теперь объектный инспектор показывает свойства этого компонента, а не формы. Label также имеет свойство Caption , которое вы можете изменить в Инспекторе объектов. Найдите это свойство, и вместо "Label1" впишите "Hello, world!". Текст в компоненте Label изменился. Если вам не нравится место, в котором оказался компонент, вы можете перетащить его мышью на другое место. Кроме того, точное местоположение компонента вы можете задать, если выделите его, и будете нажимать клавиши перемещения курсора, удерживая при этом клавишу . Теперь попробуйте еще одно свойство компонента Label – свойство Font (шрифт). Найдите это свойство в инспекторе объектов, и выделите его. Справа появится кнопочка с тремя точками, нажмите ее. Откроется стандартное окно выбора шрифта. Здесь вы можете выбрать имя шрифта, его размеры, начертание (например, жирный курсив) и цвет текста. Поэкспериментируйте с размером компонента, его положением и шрифтом. Почти все компоненты, с которыми нам придется иметь дело, имеют эти свойства, так что в дальнейшем вам будет легче осваивать новый компонент.

Снова сохраните проект и нажмите кнопку Run (или ). Убедитесь, что надпись появилась на форме, после чего закройте программу (но не Delphi) и вернитесь к форме.

Для начала нужно установить на форму кнопку. Этот компонент также находится на вкладке Standard палитры компонентов, и выглядит как кнопочка с надписью "ОК". При наведении на него указателя мыши выскакивает подсказка "Button". Щелкнув по компоненту, щелкните затем по тому месту на форме, где вы хотели бы видеть эту кнопку. Изменим надпись на кнопке. Убедитесь, что кнопка выделена, и найдите в инспекторе объектов ее свойство Caption. Замените надпись "Button1" на "Нажми меня!". Если надпись не умещается на кнопке, вы можете растянуть кнопку мышью, или использовать для этого клавиши управления курсором с нажатой кнопкой .

Далее нам нужно создать обработчик нажатия на кнопку. Обработчик представляет собой процедуру, в которой мы будем писать наш код. Этот код будет выполняться программой всякий раз, когда пользователь нажмет на эту кнопку. Чтобы создать этот обработчик, следует дважды нажать на кнопку на форме. Вы сразу попадаете в редактор кода и видите, что процедура уже создана, курсор мигает в том месте, где мы должны ввести свой код. Пока что не будем разбираться, что тут к чему, а просто впишем строку:

Он находится на палитре компонентов Standart. Как мы уже успели понять, он представляет собой поле для отображения и редактирования неформатированного текста. Текст можно загрузить из файла, набрать на клавиатуре, вставить из буфера обмена. Т.е. он имеет многие доступные свойства для редактирования текста, что способствует его применению в простейших текстовых редакторах для просмотра (редактирования) текста, наподобие того примера, который мы с вами периодически дописываем вот уже несколько уроков.

В этом компоненте текст всегда имеет одинаковый шрифт, задающийся через свойство Font.

Программно для компонента Memo1, расположенного на форме это делается следующим образом. Допустим, на форме расположено три компонента: поле редактирования текста Memo1 (страница Standart), диалог выбора шрифта FontDialog1 (страница Dialogs) и кнопка Button1 (страница Standart). Реакция на событие нажатия на кнопку Button1

procedure TForm1.Button1Click(Sender: TObject);

if FontDialog1.Execute then // если пользователь выбрал шрифт

Memo1.Font:=FontDialog1.Font; // установить выбранный шрифт

Если необходимо, чтобы в диалоге выбора шрифта изначально был выбран текущий шрифт, установленный компоненте Memo1, то перед вызовом диалога Execite устанавливаем в диалоге нужный шрифт.

procedure TForm1.Button1Click(Sender: TObject);

FontDialog1.Font:=Memo1.Font; // установить шрифт в диалоге

if FontDialog1.Execute then

Можно изменять шрифт для компонента TMemo (и не только для него) программно. Для этого в свойстве Font устанавливаются необходимые свойства во время работы приложения.

Memo1.Font.Name:='Arial'; // установка имени шрифта

Memo1.Font.Size:=14; // установка размера шрифта

Memo1.Font.Color:=clRed; // цвет шрифта

Memo1.Font.Style:=[fsBold]; // установить жирный стиль

Style представляет собой массив свойств стиля шрифта. Необходимо в квадратных скобках указывать через запятую необходимые стили. Пустые кавычки будут означать установку шрифта без стиля. Список доступный свойств стиля шрифта:

Свойство WordWrap устанавливает, может или нет текст автопереносится на следующую строчку, если он достиг левого края компонента. Автоперенос работает и когда пользователь во время работы приложения изменяет размеры компонента.

Текст в компоненте доступен через свойство Lines. Он содержит массив строк, находящихся в компоненте. Можно получить доступ как к отдельной строке, так и к всему тексту. Это свойство можно редактировать и во время работы приложения, и во время разработки в инспекторе объектов.

Загрузка строк из файла через процедуру

где "c:\1.txt" – загружаемый файл в компонент. Следует при этом помнить, что компонент TMemo ограничен в размерах текста.

Сохранение строк в файл.

Количество строк в компоненте можно узнать через свойство Memo1.Lines.Count, а доступ к отдельной строчке через функцию Strings. Например:

ShowMessage(Memo1.Lines.Strings[0]); // Показывает в окошке первую строчку текста.

Strings – это массив строк, начинающихся с нулевого знака, заканчивающиеся Count-1. Об этом следует помнить при написании подобных процедур доступа, иначе произойдет выход за доступный предел массива, что вызовет ошибку в программе.

Можно для примера организовать цикл поочередного отображения строк из компонента Memo1. Для реакции на нажатия на кнопку Button1 это выглядит следующим образом:

procedure TForm1.Button1Click(Sender: TObject);

Var i:Integer; // объявление целочисленной переменной

if Memo1.Lines.Count<>0 then // проверка ненулевого количества строк

for i:=0 to Memo1.Lines.Count-1 do // задается цикл, равный кол-ву строк

Очистить Strings можно одной процедурой Memo1.Lines.Clear.

Вставить строчку в заданное место –

Последний пример вставляет текстовую строку в первую строку (первая строка -1 = 0).

Memo1.Lines.Delete(0); // удаляет первую строку

При применении процедуры удаления строк Delete помните, что сначала нужно проверять компонент TMemo на наличие таковых вообще. Проверка через функцию Count, которая возвращает их целочисленное значение.

Работа с выделенным текстом программно аналогична работе пользователя вручную. Если пользователь выберет процедуру вырезания выделенного текста в буфер или его удаление, то он пропадет. Выделение текста производится с помощью двух процедур.

Memo1.SelStart:=0; // установить начальное положение выделения

Memo1.SelLength:=15; // установить длину выделенного текста

Если необходимо всегда видит выделенный текст, даже при переходе управления на другой элемент управления, то установите свойство HideSelection в false.

Работа с выделенным фрагментом текста

Memo1.ClearSelection; // удалить выделенный текст

Memo1.CutToClipboard; // вырезать в буфер обмена

Memo1.CopyToClipboard; // скопировать в буфер обмена

Memo1.PasteFromClipboard; // вставить из буфера обмена

Memo1.SelText; // эта функция возвращает текстовую строку выделенного текста

Отмена последнего изменения – процедура Memo1.Undo.

Компонент TMemo является оконным визуальным компонентом, т.е. у него имеются свойства, характерные множеству компонентов,
таких как Border, Color, Align, Enabled, Visible.

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

Подскажите! Может я просто просмотрел. Нужно свойство или метод в TCustomMemo, чтобы установить текущий курсор в нужную строку. Методы, показывающие текущее положение, вроде есть, но нужно установить. Чтобы было понятней, я считываю из текстового файла с помощью ReadLn в цикле последовательно строки. После завершения цикла я оказываюсь на последней строке Memo. А нужно либо в начало, либо на конкретную строку.

Репутация: 22
Всего: 72

Код

procedure TForm1.btn1Click(Sender: TObject);
var
p:TPoint;
begin
p.X:=0;
p.Y:=0;
Memo1.CaretPos:=p;
Memo1.SetFocus;
end;

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

Спасибо! Только почему нельзя сразу задать нулевые значения в поля Memo1.TCaretPos, а необходим p типа TPoint?

Я вчера вечером получил этот ответ, но пробовал лишь сегодня утром и результата, которого я хотел получить не смог достичь. После кода, который мне был показан как решение, курсор действительно устанавливается в точку (X=0, Y=0), но я вижу это только после возврата ScrollBar'ом в начало моего текста. Я же спрашивал, есть ли какая-то возможность автоматом (не вручную, используя ScrollBar) "прокрутить" мой текст в начало? А так курсор находится в начале, но в окне Memo все равно виден конец моего текстового файла.

Компонент Memo

Основное предназначение компонента TMemo — работа с большим количеством строк (ввод, отображение и редактирование текстового материала).

Для работы с буфером обмена можно использовать общепринятые горячие клавиши: Ctrl-X — вырезать, Ctrl-C — копировать; Ctrl-V — вставить.

Свойство Описание
Name Имя компонента. Используется в программе для доступа к компоненту и его свойствам, в частности для доступа к тексту, введенному в поле редактирования.
Text Текст, находящийся в поле Memo. Рассматривается как единое целое.
Lines Массив строк, соответствующий содержимому поля. Доступ к строке осуществляется по номеру. Строки нумеруются с нуля.
Lines.Count Количество строк текста в поле Memo.
Left Расстояние от левой границы поля до левой границы формы.
Top Расстояние от верхней границы поля до верхней границы формы.
Width, Height Ширина, высота поля.
Font Шрифт, используемый для отображения вводимого текста.
ParentFont Признак наследования свойств шрифта родительской
WantReturns Клавиша для ввода конца строки: TRUE – клавиша ENTER; FALSE – сочетание клавиш CTRL + ENTER.
WordWrap Переход в начало следующей строки при вводе длинных строк: TRUE –производится автоматически; FALSE – не производиться.При включенной горизонтальной полосе прокрутке это свойство игнорируется.
ScrollBar Использование полосы прокрутки, если текст большой и не помещается в компоненте Memo:
ssNone — Нет полосы прокрутки;
ssHorizontal — Установлена горизонтальная прокрутка;
ssVertical — Установлена вертикальная прокрутка;
ssBoth — Установленs две полосы прокрутки.
ReadOnly Разрешает или запрещает редактирование текста. (Программно все равно текст можно добавлять).

Для сохранения содержимого текстового поля Memo в файл используется функция SaveToFile(‘mytetxt.txt’), а для извлечения -LoadFromFile(‘mytetxt.txt’), где mytetxt.txt — текстовый файл расположенный в каталоге программы.

В коментариях пишкт что у memo нет свойства text, но это не так. Для примера разместите на форму элементы button, memo и label. И вставте код ниже в кнопку.

После запуска программы при нажатии на пнопку текст в label поменяется на текст расположенный в memo.

Читайте также: