Faq пример получения позиции курсора из компоненты tmemo


Уроки Delphi

понедельник, 28 июля 2008 г.

Компонент TMemo

Он находится на палитре компонентов 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 // задается цикл, равный кол-ву строк

ShowMessage(Memo1.Lines.Strings[i]); // вывод строк в сообщение

Очистить 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.

Изменение позиции курсора в TMemo

У меня есть компонент, полученный из TMemo. Знаете ли вы, какое сообщение Windows я должен перехватить, чтобы реагировать на изменения позиции курсора? Я имею в виду текстовый курсор, который меняет положение, нажимая клавиши со стрелками или левой кнопкой мыши. Я на Delphi 7. Работа OnMouseDown или OrKeyPress работает для клавиш со стрелками, но не для LMB.

4 ответа

0 Решение user3848246 [2015-08-10 22:34:00]


Я разобрался. Неработающие мышиные события были моей ошибкой. Чтобы ответить на изменения позиции каретки в TMemo, вы можете сделать комбинацию из двух событий: OnKeyUp (для клавиш со стрелками) и OnMouseDown:

3 asd-tm [2015-08-10 10:04:00]

Вы можете сохранить CaretPos свойства CaretPos и сравнить его в OnKeyPress и OnClick . Вызов какой-либо процедуры, если она изменилась.

Знаете ли вы, какое сообщение Windows я должен перехватить, чтобы реагировать на изменения позиции курсора?

Нет никакого уведомления об изменении позиции каретки в элементе управления Win32.

Вы могли бы обнаружить такое изменение путем опроса в ответ на событие OnIdle приложения.

Если это единственная специальность, которую вы хотите, есть уже некоторые ответы. Если вы хотите расширить функциональность TMemo больше, чем вы рано или поздно найдете, вам лучше использовать что-то вроде SynEdit, которое, кстати, также поддерживает реакцию на изменения позиции курсора.

Faq пример получения позиции курсора из компоненты tmemo

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

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

Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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

kami
Дата 27.5.2010, 21:01 (ссылка) | (нет голосов) Загрузка .
Код
procedure TForm1.btn1Click(Sender: TObject);
var
p:TPoint;
begin
p.X:=0;
p.Y:=0;
Memo1.CaretPos:=p;
Memo1.SetFocus;
end;

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

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

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

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

Это сообщение отредактировал(а) Aleks26 — 28.5.2010, 10:10

Aleks26
Дата 27.5.2010, 23:17 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник Клуба
Сообщений: 882
Регистрация: 30.3.2002
Где: Саратов

Коллекции (массивы) строк и компоненты для них

Цель лекции

Изучение типа TStrings и компонентов TMemo , TListBox и TComboBox .

Компонент TMemo


До сих пор для предоставления пользователю возможности ввести текст мы использовали компоненты вроде TEdit , с помощью которых можно ввести только одну строку текста. Компонент TMemo — это, по сути, целый текстовый редактор ! Не верите? Давайте посмотрим. Откройте Lazarus с новым проектом. Сразу же переименуйте форму в fMain (свойство Name ), в свойстве Caption напишите Мой Блокнот . Сохраните проект как MyNotebook в папку 14-01, а модулю дайте имя Main . Установим некоторые другие параметры формы. Прежде всего, форма будет содержать редактор текстов, поэтому она не должна быть маленькой. Давайте сделаем следующие установки в свойствах формы:

Далее, на вкладке Standard Палитры компонентов найдите компонент TMemo :

Установите его на форму. Теперь давайте рассмотрим, как следует, свойства компонента TMemo — уже известные по другим компонентам свойства мы рассматривать не будем, остановимся только на новых и специфичных для TMemo ( компонент должен быть выделен).

Mikel
Дата 31.5.2010, 16:08 (ссылка) | (нет голосов) Загрузка .
BorderStyle — Включает/отключает обрамление вокруг компонента, и может быть:
  • bsNone — нет обрамления
  • bsSingle — есть обрамление (по умолчанию)
CharCase — задает регистр выводимых в компоненте символов. Может быть:
  • ecLowerCase — все символы строчные
  • ecNormal — символы такие, какими их вводит пользователь (по умолчанию)
  • ecUppercase — все символы прописные
Color — цвет текстового поля. Вы можете задавать цвет как текстового поля, так и шрифта, однако имейте в виду, что серьезные программы не делаются с яркими попугайскими расцветками, поэтому желательно компонентам оставлять их стандартные цвета.
Font — шрифт текста в компоненте. Свойство имеет кнопку ««, с помощью которой его можно раскрыть и настроить шрифт: название шрифта, его размер, начертание, цвет и видоизменение. Насчет расцветок шрифта здесь справедливо то же замечание, что и для свойства Color . Начертание (простой шрифт, курсив, полужирный, полужирный курсив) тоже без нужды изменять не стоит. А вот что касается названия шрифта и его размера — их изменить можно. Дело в том, что по умолчанию в компоненте установлен мелкий шрифт, а у некоторых пользователей может быть слабое зрение. Чтобы пользователь зря не напрягал глаза, я обычно устанавливаю шрифт Times New Roman (он выглядит привлекательней) 12-го размера. Шрифт получается достаточно крупным. Вы можете поэкспериментировать с разными шрифтами и размерами и подобрать то, что нравится лично вам. Только еще одно замечание: если вы полагаете, что ваша программа будет работать и на других компьютерах, то желательно выбирать стандартные шрифты. Если вы установите какой-то экзотический шрифт, которого у пользователя может и не быть, то программа у него не будет работать нормально. Пользователю придется дополнительно искать и устанавливать ваш шрифт, а они обычно не терпят таких неудобств, и скорее предпочтут какую-то другую, аналогичную программу.
HideSelection — включает или выключает выделение текста, когда компонент теряет фокус. Если равно True, то выделение текста скрывается, когда активным становится другой компонент. При False выделение остается. Обычно оставляют значение по умолчанию — True .
Lines — коллекция (массив) строк. Позволяет обращаться как ко всему тексту, так и к его отдельным строкам. Это сложное свойство, которое имеет свои свойства, методы и события. Методы — это то, что компонент умеет делать. Это те же самые процедуры и функции. Lines это свойство, но и у него есть методы, с помощью которых можно сохранять текст в файл, считывать его из файла, делать еще много других полезных вещей. Имеет тип TStrings . Мы вернемся к нему чуть позже, фактически, вся эта лекция посвящена работе с типом TStrings .
MaxLength — максимальная длина вводимого пользователем текста. По умолчанию, свойство равно нулю. Это означает, что ограничений на размер текста нет.
ReadOnly — переводится как «Только для чтения». По умолчанию, равно False — пользователь может как читать, так и редактировать текст. Если установить в True , пользователь не сможет изменять текст. Так делают, когда нужно вывести для пользователя многострочный текст, например, текст лицензии или описание программы в окне «О программе». Мы оставим False, так как сейчас нам нужно, чтобы пользователь мог редактировать текст.
ScrollBars — полосы прокрутки компонента. Может быть:
  • ssNone — нет полос прокрутки.
  • ssHorizontal — горизонтальная полоса прокрутки, располагается по нижнему краю компонента. Неактивна, пока текст строки умещается на экране. Когда он становится больше, полоса становится активной, и пользователь может прокрутить текст по горизонтали.
  • ssVertical — вертикальная полоса прокрутки, располагается по правому краю компонента. Неактивна, пока все строки умещаются на экране. Когда строк больше, полоса прокрутки становится активной, и пользователь может прокручивать текст вверх-вниз.
  • ssBoth — присутствуют как вертикальная, так и горизонтальная полосы прокрутки.
  • ssAutoHorizontal — отличается от ssHorizontal тем, что пока текст умещается в окне, полоса прокрутки невидима. По крайней мере, так задумывалось разработчиками. На деле же, ssAutoHorizontal ведет себя так же, как и ssHorizontal — полоса видима, но неактивна, пока текст умещается в окне. Будем надеяться, что в будущем разработчики Lazarus исправят эту ошибку.
  • ssAutoVertical — то же, что и ssAutoHorizontal , но для вертикальной полосы прокрутки.
  • ssAutoBoth — то же, что и ssAutoHorizontal , но для обеих полос прокрутки.
WantReturns — тоже недоработанное свойство. По идее, если его установить в False , пользователь не сможет клавишей вставлять разрывы строк. Однако новые строки по-прежнему вставляются клавишей вне зависимости от установок этого свойства.
WantTabs — вот это свойство работает. Если оно установлено в False (по умолчанию), то пользователь не сможет клавишей вставлять знаки табуляции — эта клавиша будет переключать фокус с TMemo на другой компонент, если он есть. Если же свойство установить в True , то пользователь сможет вставлять знаки табуляции. Разрешать ему вставку табуляции или нет, зависит от назначения компонента. Если вам нужно простое поле, чтобы пользователь мог ввести несколько строк текста, то табуляцию можно и не разрешать. Если же вам нужно сделать полноценный текстовый редактор, то табуляция необходима.
WordWrap — разрешает или запрещает перенос текста на новую строку. Если установлено True (по умолчанию), то когда текст достигает края, происходит автоматический переход на новую строку. Если установлено False , то строка будет продолжаться, пока пользователь не нажмет . Обычно свойство оставляют в True и устанавливают вертикальную полосу прокрутки. Если вам захочется установить False , позаботьтесь о том, чтобы была установлена и горизонтальная полоса прокрутки.

В Инспекторе объектов отсутствует еще одно важное свойство: Text . Это свойство имеет тип String и содержит весь текст, все строки разом, включая символы перехода на новую строку.

Итак, займемся настройкой компонента TMemo . Имя оставим по умолчанию: Memo1 . Свойства Left и Top установите в 5. Свойство Height установите равным 400, а Width — 740. Компонент занял почти всю форму, оставив небольшие бордюры и место для кнопок снизу. Теперь нам нужно привязать компонент к сторонам, чтобы он автоматически изменял размер при изменении пользователем размеров окна. Для этого разверните свойство Anchors (якоря) и установите в True все его четыре подсвойства.

Далее, нам как-то нужно убрать текст «Memo1» из компонента, который был добавлен в поле автоматически. Для этого выделите свойство Lines и щелкните по её кнопке ««. Это приведет к открытию окна диалога ввода строк. Сотрите там весь текст и нажмите » ОК » — текст в компоненте пропал.

Теперь установите вертикальную полосу прокрутки ( ScrollBars = ssVertical ) и убедитесь, что в WordWrap установлено True — компонент будет автоматически переносить текст на новые строки.

Вот, собственно, и все настройки. Теперь нам нужно добиться от компонента трех вещей: чтобы он сохранял текст в файл , чтобы он считывал текст из файла, и чтобы он очищал весь текст. Для этого нам придется воспользоваться некоторыми методами свойства Lines компонента. И еще нам потребуются три простых кнопки, для которых внизу как раз осталось место . Давайте первую кнопку назовем bSave (в свойстве Name ), вторую — bRead , и третью — bClear . Маленькая буква b означает кнопку ( button ), хотя вы можете изобрести и свои правила наименования компонентов. Нам потребуется изменить и свойство Caption у этих кнопок: в первой кнопке напишите Сохранить , во второй — Читать , а в третьей — Очистить . Чтобы текст умещался на кнопках просторней, свойство Width (ширину) кнопок поставьте в 90. Теперь вот еще что: по умолчанию, все компоненты «привязываются» к верхней и левой границам формы. Если пользователь будет изменять размеры окна, то кнопки будут находиться на таком же расстоянии от левого и верхнего края, что и при проектировании. А так как наш Memo привязан ко всем сторонам, и будет увеличиваться, то закроет собой кнопки. Чтобы этого избежать, выделите все кнопки, откройте их свойство Anchors , akTop переведите в False , а akBottom наоборот, в True . Теперь наши кнопки привязаны к левому и нижнему краю, и всегда будут на одинаковом расстоянии от Memo .

Свойства компонента TMemo

Font Определяет формат текста (шрифт, его атрибуты, выравнивание), одинаков для всего текста компонента .
Lines Содержащее текст окна в виде списка строк и имеющее тип TStrings.Начальное значение текста можно установить в процессе проектирования, нажав кнопку с многоточием около свойства Linesв окне Инспектора Объектов.
Text Весь текст, представленный одной строкой типа String,внутри которой используются разделители типа символов возврата каретки и перевода строки.
Count Указывает число строк в тексте, используется только для чтения
Aligment Выравнивание теста внутри Memo. Если равно taLeftJustify, то слева, taRightJustify — справа, taCenter — по центру.
MaxLength Максимальная длина количества вводимых символов, по умолчанию равно 0, то есть не ограничено.
ReadOnly Если установлено true, то запрещает изменение текста пользователем, но возможно выделение и копирование.
ScrollBars Определяет полосу прокрутки, ssNone — отсутствует, ssHorizontal — горизонтальная, ssVertical — вертикальная, ssBoth — присутствует и горизонтальная и вертикальная.
WordWrap Авто перенос текста по словам при достижении границы, если установлено в true.

Доступ к отдельной строке текста вы можете получить с помощью свойства

AnsiString Strings[int Index].

Индексы, как и везде в C++Builder, начинаются с 0.

Так что Memol—>Lines—>Strings[0] — это текст первой строки.

Методы компонента TMemo

Clear Используется для очистки текста в окне.
Add или Append Для занесения новой строки в конец текста окна редактирования. Для загрузки текста из файла применяется метод LoadFromFile. Сохранение текста в файле осуществляется методом SaveToFile.

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Только сон приблежает студента к концу лекции. А чужой храп его отдаляет. 8807 — | 7523 — или читать все.

188.64.174.135 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

Отключите adBlock!
и обновите страницу (F5)

очень нужно

Компонента TMemo

Компонент TMemo gредставляет собой редактор текста и предназначен для ввода, редактирования или отображения достаточно длинного текста. Текст хранится в свойстве Lines класса TString и таким образом представляет пронумерованный набор строк (нумерация начинается с нуля).

С помощью свойств и методов (Add, Delete, Clear, Count и т.д.) представляется возможность динамически формировать содержимое компонента. Многие свойства аналогичны свойствам рассмотренного компонента TEdit.


Allignment– служит для выравнивания текста. Это свойство может принимать такие же значения, как у компонента TEdit.

WordWrap – свойство, которое позволяет управлять переносом слова на новую строку, может принимать булевские значения.

ScrollBars – позволяет устанавливать полосы скроллинга. Может принимать значения:

ssNone– без полос скроллинга,

ssHorizontal– горизонтальная полоса скроллинга,

ssVertical– вертикальная полоса скроллинга,

ssBoth – обе полосы скроллинга.

При этом значение свойства WordWrap игнорируется.

Lines – с помощью этого свойства задается список строк, помещенных в редактор.

Чтобы поместить исходный текст в TMemo на стадии проектирования необходимо в инспекторе объектов выделить свойство Lines и в открывшемся окне диалога ввести соответствующий текст.

Компонент TMemo обрабатывает все события от мыши и клавиатуры, а также реагирует на активизацию компонента и снятию активизации, а также при изменении текста.

Компонент TMemo может также обмениваться информацией с буфером Сlipboard. Для этого используются методы:

CopyToClipBoard – копировать в буфер,

Для компонента TMemo может использоваться метод LoadFromFile, с помощью которого можно заполнить поле компонента из текстового файла. Возможна и обратная операция, т.е. можно сохранить содержимое компонента TMemo в файле с помощью метода SaveToFile.

Пример

Обработчик кнопки Button1 – Прочитать

If FileExist(Edit1.Text) then

Обработчик кнопки Button5– Сохранить

If Length(Edit2.Text)<>0 then

Обработчик кнопки Button2– Копировать

Обработчик кнопки Button4 — Вырезать

У класса Tstrings имеются такие свойства

Count–целое число, определяющее количество строк,

Strings[Index] – с помощью которого можно получить строку с номером Index (нумерация строк начинается с 0).

Чтобы получить весь текст можно воспользоваться свойством Text. Чтобы обратиться к нулевой строке нужно

У класса TStrings имеются также методы


Add(s) позволяет добавить строку s в список,

Delete(Index)– удаление строки с номером Index,

Exchange(Index1, Index2) – можно поменять местами две строки,

Index of(s) – позволяет определить номер строки s или -1, если такой нет,

Insert(Index, s) вставит строку s после номера Index,

Move(CurIndex, NewIndex) — переместить строку СurIndex в строку Newindex.

DelphiComponent.ru — бесплатно видеоуроки по Delphi, статьи, исходники

Многострочное поле ввода (TMemo) Delphi

Итак, добавьте на форму пока только одну кнопку. Измените ее свойство caption на очистить и имя на ciearButton. Кстати, давайте изменим имя компо­ нента Memo1 на MainMemo . Создайте для кнопки обработчик события onclick . В нем напишите следующее :

procedure TForm1.ClearButtonclick(Sender: TObj ect);

В этом программном коде вызывается метод clear объекта Lines, который в свою очередь принадлежит объекту MainMemo. Немного запутано, но со време­нем вы поймете, что это очень даже удобно. У компонента MainMemo есть свой­ство Lines, значит, чтобы получить к нему доступ, мы должны написать MainMemo.Lines. Свойство Lines — это целый объект, и у него есть метод Clear, который очищает содержимое строк редактора.

Попробуйте запустить программу и написать внутри компонента Memo какой- нибудь текст. Потом нажмите кнопку Очистить, чтобы уничтожить все, что вы ввели.

Теперь давайте усложним наш пример, добавив возможность сохранения вве­денного текста и загрузки его обратно.

Создайте обработчик события Onshow (срабатывает, когда отображается окно) для формы и напишите в нем следующее:

procedure TForm1.FormShow(Sender: TObject);

MainMemo. Lines. LoadFromFile (‘ memo. txt ‘ ) ;

Здесь вызывается метод LoadFromFile объекта Lines. Ему нужно передать толь­ко один параметр — имя файла, откуда будет происходить загрузка данных. Есть только один недостаток — если вы сейчас попытаетесь запустить программу, то во время загрузки произойдет ошибка, потому что файла memo.txt нет. Тут есть два выхода:

  • заранее создать файл;
  • при старте программы проверять, есть ли файл, и только если он существует, производить загрузку текста.

С первым способом все понятно. А вот для реализации второго способа можно воспользоваться функцией FileExists. Ей нужно передать имя файла, существо­вание которого надо проверить, и если такой файл существует, функция вернет true. Давайте изменим обработчик события Onshow следующим образом:

procedure TForml.FormShow(Sender: TObject); begin

if FileExists (‘memo. txt’) then

MainMemo. Lines. LoadFromFile (‘ memo. txt’) ;

Теперь создадим обработчик события OnClose (срабатывает на закрытие окна).

В нем напишем процедуру сохранения содержимого MainMemo.

procedure TForml.FormClose(Sender: TObj ect; var Action: TCloseAction);

Здесь используется метод SaveToFile, который работает так же, как и LoadFromFile, только сохраняет данные.


Теперь осталось только научиться программно добавлять, удалять и изменять строки в компоненте Tmemo, и можно считать, что мы досконально изучили этот компонент.

В этом компоненте текст хранится как простая последовательность строк — массив. Используя предыдущий пример, наберите текст и после закрытия про­граммы посмотрите, как он выглядит в файле. Вот содержимое моего примера memo.txt:

Как видите, в файле четыре строки (вторая пустая). Точно так же строки распо­ложены и в файле.

Для доступа к каждой строке можно воспользоваться свойством strings свой­ства Lines. На рис. 7.6 наглядно показано, как получить доступ к строкам. Чтобы получить нулевую строку, нужно написать MainMemo.Lines.strings[0], для пер­вой строки — MainMemo. Lines . Strings [ 1 ] И Т. Д.

Давайте напишем пример, кото­рый будет получать доступ к стро­кам, чтобы увидеть все это на практике. Добавьте к предыдуще­му примеру три кнопки.

  • Добавить. Дадим этой кнопке ИМЯ— AddButton.
  • Удалить. Дадим этой кнопке ИМЯ — DelButton.
  • Изменить. Дадим этой кнопке ИМЯ — ChangeButton.

Давайте изменим обработчик события Onshow следующим образом:

procedure TForml.FormShow(Sender: TObj ec t);

if FileExists (‘memo. txt’) then

MainMemo. Lines. LoadFromFile (‘ memo. txt’) ;

Теперь создадим обработчик события OnClose (срабатывает на закрытие окна). В нем напишем процедуру сохранения содержимого MainMemo.

procedure TForml.FormClose(Sender: TObj ect; var Action: TCloseAction);

Здесь используется метод SaveToFile, который работает так же, как и LoadFromFile, только сохраняет данные.

Можете расположить их, как показано на рис. 7.7. Теперь созда­дим обработчик события onclick для кнопки Добавить. Здесь мы будем про­граммно добавлять новую строку В MainMemo. Для ЭТОГО У объекта Lines есть метод Add, у которого только один параметр — текст новой строки:

procedure TFormi.ButtonlClick(Sender: TObj ec t) ;

Теперь создадим обработчик события onclick для кнопки Удалить. По этому событию мы должны удалить строку, в которой находится сейчас курсор. Для это­го напишите в обработчике следующий текст:

procedure TFormi.DelButtonclick(Sender: TObj ec t);

if MainMemo.Lines.CountoO then MainMemo. Lines. Delete (MainMemo. CaretPos. Y) ;

В первой строке кода проверяется, сколько строк в компоненте MainMemo. Для этого есть свойство Lines, count. Если оно не равно нулю (MainMemo.Lines .count<>o), значит, строки есть, и мы можем удалить текущую строку.

Для удаления используется метод Delete объекта Lines. В качестве единствен­ного параметра нужно передать номер строки для удаления. Но как узнать, какая строка сейчас является текущей? Для этого у MainMemo есть свойство CaretPos, которое указывает на текущую позицию курсора.

CaretPos — это переменная типа TPoint . Этот тип определяется как запись. С таким типом мы подробно познакомимся немного позже. Единственное, что сей­час необходимо знать, так это то, что данный тип похож на объект, только у него нет методов, а только свойства. У TPoint есть два свойства х и y :

х указывает на текущую колонку,

a y — на текущую строку.

Таким образом можно узнать теку­щую строку С ПОМОЩЬЮ MainMemo.CaretPos . y.

Итак, MainMemo . Lines . Delete удаляет указанную строку. Указание текущей строки происходит С ПОМОЩЬЮ MainMemo.CaretPos .Y .


Теперь осталось только написать обработчик события onclick для кнопки Изменить. В нем напишите следующий код:

Procedure TForml.ChangeButtonclick(Sender: TObject);

MainMemo.Lines.Strings [MainMemo.CaretPos.Y] : = ‘Horrific ‘ ;

MainMemo.Lines.Strings[0]: =’Текст изменен’;

В первой строке мы изменяем текущую строку на «Horrific». Второй строкой ко­да я изменяю первую строку мапмето на «Текст изменен».

Здесь вам уже все должно быть знакомым. Так что теперь можно считать, что мы изучили основные возможности компонента TMemo.

Как получить абсолютную позицию курсора в TMemo?

С> CaretPos мне возвращает Строку,Символ, а мне-то надо X,Y в пикселях для задания координат вывода моего листбокса.

Hello, Странникс!You wrote on Wed, 29 Apr 09 16:19:23 GMT:TCanvas.TextWidth() и прочее.—With best regards, Мимопроходящий.

Hello, Anatoly!You wrote on Wed, 29 Apr 09 17:02:52 GMT:аж интересно стало всегда возвращает -1

For a single-line edit control, the y-coordinate is always zero. A returned coordinate can be negative if the character has been scrolled outside the edit control’s client area. The coordinates are truncated to integer values.

AP> А что должно? AP> Результат в wparam, а не в lResult

Return Value:

  • Rich Edit 1.0 and 3.0: The return value is not used.
  • Edit controls and Rich Edit 2.0: The return value contains the client area coordinates of the character.The low-order word contains the horizontal coordinate and the high-order word contains the vertical coordinate.

  • AP> И надо разобраться что передавать в lparam, вроде надо индекс символа, где установлена каретка, AP> его еще надо получить с помощью EM_CHARFROMPOS.

    lParam

  • Rich Edit 1.0 and 3.0: The zero-based index of the character.
  • Edit controls and Rich Edit 2.0: This parameter is not used.

  • Изменение положения курсора в TMemo

    У меня есть компонент, полученный от TMemo. Знаете ли вы, какое сообщение Windows я должен перехватить, чтобы реагировать на изменения позиции курсора? Я имею в виду текстовый курсор, который меняет положение, нажимая клавиши со стрелками или левой кнопкой мыши. Я на Delphi 7. Работа OnMouseDown или OrKeyPress работает для клавиш со стрелками, но не для LMB.

    Создан 10 авг. 15 2015-08-10 06:40:15 user3848246

    Интересно, что вы будете делать в ответ на знак вставку Смените Pos – David Heffernan 10 авг. 15 2015-08-10 06:50:57

    Memo является частью схемы последовательности операций графического компонент. Код, сгенерированный на этой блок-схеме, отображается в отдельной форме в TSynMemo. Когда я перемещаю курсор из одной строки в другую (так в вертикальном направлении) в записке на блок-схеме, я хочу переместить активную строку в редакторе, чтобы исправить строку. Все, что мне нужно — это реагировать на изменение мышью. Я не знаю, почему, но щелчки мыши не работают в событии OnKeyPress. Другие события мыши (например, OnMouseDown) либо не запускаются. – user3848246 10 авг. 15 2015-08-10 16:44:12

    Проблема с обработкой любых событий для обнаружения движения курсора заключается в том, что курсор обычно перемещается в ответ на это событие, а не всегда до вызова обработчика. Я часто обнаруживал, что я занимаю позицию, где он был, а не там, где он был. Чтобы решить эту проблему, я отправляю и потребляю сообщение пользователя и обрабатываю изменение каретки при приеме сообщения; к тому времени он перемещается, и я могу обнаружить, что это новая позиция. – Flynn1179 14 июл. 16 2020-07-14 15:12:18

    TMemo/ru

    TMemo является элементом управления с многострочным полем для редактирования текста. Данный компонент доступен на вкладке Standard палитры компонентов.


    Contents

    Использование

    Для использования элемента TMemo на форме вам необходимо просто выбрать его на вкладке Standard палитры компонентов и разместить на форме с помощью щелчка мыши. В данном текстовом поле вы можете редактировать многострочный текст во время выполнения программы.

    Например, если вы добавили элемент TMemo с именем Memo1 на форму с именем Form1, то для того чтобы присвоить значение типа String данному элементу, вы можете использовать такую инструкцию Memo1.Text := ‘Это однострочный текст’; .

    Также вы можете использовать текст из элемента с именем Memo1 в любом месте исходного кода с помощью следующей инструкции myString := Memo1.Text; .

    Кроме того можно присвоить многострочный текст элементу с именем Memo1 с помощью такой инструкции Memo1.Text:=’This’+LineEnding+’is’+LineEnding+’a’+LineEnding+’multiline’+LineEnding+’text’; .

    Присваивание строк из TStrings или TStringList

    В общем, для присваивания текста элементу TMemo используется класс TStringList или его родительский класс — TStrings. Это показано в следующем примере (данный код располагается в обработчике события кнопки с именем Button1, расположенной на форме с именем Form1; также на форме должен быть расположен элемент TMemo с именем Memo1):

    Непосредственное добавление строк

    Вы можете непосредственно добавлять строки в элемент TMemo, как показано в следующем примере:

    Чтение стоки

    Если вы хотите узнать, что содержится в определенной строке, вы можете непосредственно проверить это с помощью такой инструкции myString:=Memo1.Lines[Index]; . Обратите внимание, что индексы строк в TMemo.Lines начинаются с 0, т.е. первая строка будет иметь индекс 0: myString:=Memo1.Lines[0];

    Добавьте ещё одну кнопку с именем Button2 к предыдущему примеру для того, чтобы отобразить содержимое третьей строки, как показано в следующем примере:

    Выделенный текст

    Вы можете отметить часть текста в режиме выполнения программы с помощью левой кнопки мыши или удерживать клавишу [Shift] и выбрать текст с помощью мыши или стрелок на клавиатуре. Выделенный текст (String) можно отобразить с помощью следующей инструкции:

    Поиск текста

    В отличие от предыдущего примера вы также можете искать текст (String) в элементе TMemo и определять место, где он находится: Position:=Memo1.SelStart;

    В следующем примере показано, как вы можете искать текст в элементе TMemo:

    • Создайте новое приложение со следующими элементами: TEdit с именем Edit1, TMemo с именем Memo1 и две кнопки с именами Button1 и Button2.
    • Добавьте в раздел Uses строки LCLProc, strutils и LazUTF8.
    • В обработчике события OnClick кнопки Button1 заполните строки элемента Memo1 любым текстом, как в примере Непосредственное добавление строк.
    • В редакторе исходного кода добавьте следующую функцию (основана на этом примере [1] с German Lazarusforum):
    • Добавьте следующий код в обработчик события OnClick кнопки Button2:
    • Теперь вы можете заполнить текстом элемент Memo1 в режиме выполнения программы с помощью кнопки Button1, вставить текст, который нужно найти в элемент Edit1 и найти его с помощью кнопки Button2.

    Сохранение и загрузка текста

    Вы можете довольно легко сохранять и загружать содержимое в элемент TMemo, используя методы SaveToFile и LoadFromFile класса TStrings.

    В следующем примере показано, как это можно сделать:

    • Создайте новое приложение со следующими элементами: TMemo с именем Memo1 и три кнопки с именами Button1, Button2 и Button3.
    • Дополнительно поместите на форму элементы TSaveDialog и TOpenDialog, расположенные на вкладке Dialogs палитры компонентов.
    • Измените свойство Caption кнопки Button1 на «Fill memo».
    • В обработчике события OnClick кнопки Button1 заполните элемент TMemo любым текстом, как в примере Непосредственное добавление строк.
    • Измените свойство Caption кнопки Button2 на «Save memo».
    • Измените свойство Caption кнопки Button3 на «Load memo».
    • Теперь отредактируйте обработчики событий OnClick кнопок Button2 и Button3:
    Илон Маск рекомендует:  Что такое код udm_find
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL