Программирование на Delphi
Пошлите в Memo сообщение EM_SETTABSTOPS. Например установим первую позицию табуляции на 20-й пиксел. Пример:
Компоненты и Классы — TMemo и TRichEdit
Memo со своими шрифтами
Memo со свойствами Row и Col
RichEdit замена текста
RichEdit поиск текста
TDBMemo в TDBCtrlGrid
В TRichEdit или TMemo при нажатии Enter позиционирование курсора в позицию как в предыдущей строке
Взят RTF отформатированный текст из TRichEdit
Вставка рисунка в TRxRichEdit
Вставка текста в TMemo в текущую позицию
Выделить строку в Memo
Выделить строку в TMemo при щелчке на ней
Выполнить обратный поиск строки в TRichEdit
Выравнивание текста в TRichEdit
Добавить цветную строку в TRichEdit
Добавление строк в Memo
Загрузка нескольких RTF файлов в RichEdit
Задать расстояние между строк для TRichEdit
Изменение величины табуляции в Memo
Изменить цвет выделения для TRichEdit
Импортирование файла в компонент Memo
Использовать SubScript или SuperScript в TRichEdit
Использовать различные стили подчеркивания для TRichEdit
Исправление загрузки RTF текста через поток
Как в Memo прокрутить текст
Как в компоненте TMemo перехватить нажатие Ctrl+V и вставить специальный текст не из буфера обмена
Как вставить содержимое файла в текущую позицию курсора в компоненте TMemo
Как вставить содержимое файла в текущую позицию курсора в компоненте TMemo 2
Как выделить в RichEdit 4 строки
Как запихать в Мемо больше текста, чем оно может вместить по умолчанию
Как изменить стиль шрифта RichEdit нажатиями соответствующих клавиш (например включить курсив по нажатию Ctrl+I)
Как нарисовать что-нибудь на TMemo
Как настроить табуляцию в компоненте TMemo
Как получить определённую часть текста из RichEdit
Как прокрутить TRichEdit в конец
Как сделать окошко подсказки в редакторе как Delphi по CTRL-J
Как сделать отступ в Memo
Как сделать так, чтобы в Memo переносилось не слово целиком, а только та часть слова, которая не помещается
Memo и RichEdit – многострочные окна редактирования
Свойство Font компонента Memo одинаковый формат (шрифт и его атрибуты) для всего текста. Отредактированный текст при копировании из окна Memo не будет содержать элементы форматирования. Или отредактированный текст скопированный, например, из Word с элементами форматирования, то при вставке в окно Memo, будет вставлен как текст и к нему применяться те стили, которые указаны в свойстве Font.
Свойства Memo
- Lines типа TStrings – содержит текст окна и представляет из себя список строк. Через «Инспектор Объектов» можно задать начальный текст в Lines. Lines имеет ряд параметров:
- Add или Append – добавляет текст в конец строки;
- Clear – очистка Memo от всего текста.
- ssNone – скрывает полосу прокрутки;
- ssHorizontal – устанавливает горизонтальную прокрутку;
- ssVertical – устанавливает вертикальную прокрутку;
- ssBoth – устанавливает и горизонтальную и вертикальную.
- SelStart – указывает индекс текста, на котором установлен указатель мыши.
- CaretPos – отображает структуру:
- X – содержит индекс символа перед курсором мыши;
- Y – отображает индекс строки, где расположен курсор.
Пример добавления текста в Memo
RichEdit
Компонент RichEdit – это удобное многострочное окно редактирования текста. Компонент RichEdit имеет большинство функций компонентов Memo и Edit. Так же есть наличие комбинации «горячих» клавиш. Окно редактирования RichEdit обладает множеством сообщений Windows, которые позволяют управлять текстом.
- Color – устанавливает цвет текста.
- Name – устанавливает имя шрифта.
- Size – устанавливает размер.
- Style – определяет стиль текста.
С помощью диалога выбора шрифта FontDialog можно легко менять атрибуты текста в RichEdit.
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.
Memo как узнать позиции табуляции
procedure TForm1.Button1Click(Sender: TObject);
var
h : THandle;
begin
Application.ProcessMessages;
DbGrid1.SetFocus;
DbGrid1.EditorMode := true;
Application.ProcessMessages;
h:= Windows.GetFocus;
SendMessage(h, EM_SETSEL, 2, 2);
end;Ответ:
Можно использовать методы Delphi SelStart() и SelectLength().Ответ:
В примере перехватывается сообщение WM_SYSCOMMAND. Если это сообщение говорит о
минимизации или максимизации формы — пищит динамик.type
TForm1 = class(TForm)
private
procedure WMSysCommand(var Msg: TWMSysCommand);
message WM_SYSCOMMAND;
public
end;var
Form1: TForm1;procedure TForm1.WMSysCommand;
begin
if (Msg.CmdType = SC_MINIMIZE) or (Msg.CmdType = SC_MAXIMIZE) then
MessageBeep(0)
else
inherited;
end;Ответ:
В примере показывается не автосоздаваемая (non auto-created) форма, но фокус ввода ей
не передается.procedure TForm1.Button1Click(Sender: TObject);
begin
Form2 := TForm2.Create(Application);
Form2.Visible := FALSE;
ShowWindow(Form2.Handle, SW_SHOWNA);
end;Ответ:
В примере TDriveComboBox не показывает дисководы, которые не готовы. (not ready).
Учтите что на многих компьютерах будет ощутимая задержка при поверке plug&play
флоппи дисковода.procedure TForm1.FormCreate(Sender: TObject);
var
i : integer;
OldErrorMode : Word;
OldDirectory : string;
begin
OldErrorMode := SetErrorMode(SEM_NOOPENFILEERRORBOX);
GetDir(0, OldDirectory);
i := 0;
while i <= DriveComboBox1.Items.Count — 1 do begin
<$I->
ChDir(DriveComboBox1.Items[i][1] + ‘:\’);
<$I+>
if IoResult <> 0 then
DriveComboBox1.Items.Delete(i)
else
inc(i);
end;
ChDir(OldDirectory);
SetErrorMode(OldErrorMode);
end;Ответ:
Один из способов — создать пользовательское сообщение и использовать метод preform
чтобы разослать его всем формам из массива Screen.Forms.const
UM_MyGlobalMessage = WM_USER + 1;type
TForm1 = class(TForm)
Label1: TLabel;
Button1: TButton;
procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
procedure UMMyGlobalMessage(var AMessage: TMessage); message
UM_MyGlobalMessage;
public
end;var
Form1: TForm1;procedure TForm1.FormShow(Sender: TObject);
begin
Form2.Show;
end;procedure TForm1.UMMyGlobalMessage(var AMessage: TMessage);
begin
Label1.Left := AMessage.WParam;
Label1.Top := AMessage.LParam;
Form1.Caption := ‘Got It!’;
end;procedure TForm1.Button1Click(Sender: TObject);
var
f: integer;
begin
for f := 0 to Screen.FormCount — 1 do
Screen.Forms[f].Perform(UM_MyGlobalMessage, 42, 42);
end;const
UM_MyGlobalMessage = WM_USER + 1;
type
TForm2 = class(TForm)
Label1: TLabel;
private
procedure UMMyGlobalMessage(var AMessage: TMessage);
message UM_MyGlobalMessage;
public
end;var
Form2: TForm2;procedure TForm2.UMMyGlobalMessage(var AMessage: TMessage);
begin
Label1.Left := AMessage.WParam;
Label1.Top := AMessage.LParam;
Form2.Caption := ‘Got It!’;
end;Совет взят с диска "All4Delphi" 14.10.2001
Следующий пример вызывает защищенный (protected) метод класса TDriveComboBox
BuildList() для регеирации списка дисков. (использовая так наз. "class cracer")type
TNewDriveComboBox = class(TDriveComboBox) //это наш "class cracer"
end;procedure TForm1.Button1Click(Sender: TObject);
var
Drive : char;
begin
Drive := DriveComboBox1.Drive;
TNewDriveComboBox(DriveComboBox1).BuildList;
//вызываем защищенный метод родительского класса
DriveComboBox1.Drive := Drive;Совет взят с диска "All4Delphi" 15.10.2001
В примере показано как показать меню и выбрать в нем какой-то пункт, эмулируя нажатие "быстрой кдавиши" пункта меню. Если у Вашего пункта меню нет "быстрой клавиши" Вы можете посылать комбинации VK_MENU, VK_LEFT, VK_DOWN, и VK_RETURN, чтобы программно "путешествовать" по меню.
Пример:procedure TForm1.Button1Click(Sender: TObject);
begin
//Allow button to finish painting in response to the click
Application.ProcessMessages;
keybd_Event(VK_MENU, 0, 0, 0);
keybd_Event(ord(‘F’), 0, 0, 0);
keybd_Event(ord(‘F’), 0, KEYEVENTF_KEYUP, 0);
keybd_Event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
keybd_Event(ord(‘S’), 0, 0, 0);
keybd_Event(ord(‘S’), 0, KEYEVENTF_KEYUP, 0);
end;Добавлено 15.10.2001
Возможный вариант — присвоить ссылку на этот компонент свойству FocusControl TLabel’а. В примере используется невидимый Label для создания "быстрой" клавиши (Alt+M) компонента Memo. Чтобы использовать пример, разместите на форме компонет TMemo, Label и несколько других компонентов, которые могут принимать фокус ввода. Запустите программу, перевидите фокус ввода куда-нибудь вне Memo и нажмите Alt+M — фокус ввода вернется в Memo.
Пример:procedure TForm1.FormCreate(Sender: TObject);
begin
Label1.Visible := false;
Label1.Caption := ‘&M’;
Label1.FocusControl := Memo1;
end;Добавлено 18.10.2001
Если добавить флаг csOpaque (непрозрачный) к свойству ControlStyle компонента
— то фон компонента перерисовываться не будет.constructor TMyControl.Create;
begin
inherited;
ControlStyle := ControlStyle + [csOpaque];
end;Поместите в конструктор компонента код, устанавливающий размеры по умолчанию.
Переопределите метод SetBounds и проверяйте в нем "componentstate". Если компонет
находится режиме "design-time" (csDesigning in ComponentState) просто передавайте
значения ширины и высоты (width и heights) компонента по умолчанию (в нашем
примере 50) методу класса-предка.procedure TVu.SetBounds(ALeft : integer; ATop : integer; AWidth : integer;
AHeight : integer);
begin
if csdesigning in componentstate then
begin
AWidth := 50;
AHeight := 50;
inherited; //вызываем унаследованный от предка метод
end;
end;Да. Можно уничтожать обьекты, расположенные не на текущей странице TNotebook или
TTabbedNotebook. В примере вызывается защищенный (Protected) метод путем создания
так называемый "class cracer’ов".type TMyTabbedNotebook = class(TTabbedNotebook); //это наш "class cracer"
type TMyNotebook = class(TNotebook);procedure TForm1.TabbedNotebook1Change(Sender: TObject; NewTab: Integer;
var AllowChange: Boolean);
begin
with TabbedNotebook1 do //вызываем защищенный метод родительского класса
TMyTabbedNotebook(TWinControl(Pages.Objects[PageIndex])).DestroyHandle;
end;procedure TForm1.TabSet1Change(Sender: TObject; NewTab: Integer;
var AllowChange: Boolean);
begin
with Notebook1 do //вызываем защищенный метод родительского класса
TMyNotebook(TWinControl(Pages.Objects[PageIndex])).DestroyHandle;
NoteBook1.PageIndex := NewTab;
AllowChange := true
end;TSelectableTree — наследник от TCustomTreeView, обладает возможностью множественного выбора ( свойство MultiSelect ).
Соответственно дополнительные методы —Так же как в случае с TMemo, здесь можно использовать сообщения. Например, сообщение может быть отослано в момент создания формы:
Или я бы сделал метод рисования этой таблицы, а данные хранил бы в отдельном stringList-е, там есть методы вставки, а вообще-то для этих целей предпочитаю DrawGrid: переопределяю метод onDrawCell, всё же объектная модель лучше и данные проще контролировать.
Как вставить иконку (или bitmap) в TRichEdit, причем так, чтобы пользователь мог ее удалить нажатием клавиши Del (как это сделано в Microsoft Word)?
Memo1.Perform(EM_UNDO, 0, 0);
Для переключения enable/disable опции undo:Undo1.Enabled := Memo1.Perform(EM_CANUNDO, 0, 0)<> 0;
ComboBox1.DroppedDown := True;
Естественно, False закроет его.
- Создать форму.
- Поместить компоненты TComboBox и TListbox на форму.
- Изменить свойство Style у TComboBox на csOwnerDrawVariable и lbOwnerDrawVariable для TListBox. Owner-Draw TListBox или TComboBox позволяют показать и объекты (например, картинку) и строки одновременно. В данном примере мы добавляем и графический объект и строку.
- Создать 5 переменных типа TBitmap в разделе var модуля для формы.
- Создать обработчики для событий OnCreate, OnDraw, OnMeasureItem, OnClose.
unit Ownerdrw;
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;