Программисты Майкрософт ворвались в Apple и ставят на все компютеры Винды. Посреди этого всего стоит Билли в чёрной рясе с капюшоном и здоровенным крестом с логотипом W95. И подбегают к нему программисты и спрашивают:
- Отче, как отличить поганый Мак от честного писюка?
Мрачно усмехнулся Билли и сказал:
- Ставьте на всех!!! Виндоуз узнает своих!!!
Кто-нибудь знает как использовать различные шрифты и стили в
Memo-объекте?
Просто создайте собственный TxxxMemo: наследуйтесь от стандартного TMemo и
перекройте метод Paint.
Вот мой старый пример, изменяющий цвет каждой строки:
unit Todrmemo;
interfaceuses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls;
type
TOwnerDrawMemo = class(TMemo)
private{ Private declarations }procedure WMPaint(varMessage: TWMPaint); message WM_PAINT;
protected{ Protected declarations }public{ Public declarations }published{ Published declarations }end;
procedureRegister;
implementationprocedure TOwnerDrawMemo.WMPaint(varMessage: TWMPaint);
var
Buffer: array[0..255] of Char;
PS: TPaintStruct;
DC: HDC;
i: Integer;
X, Y, Z: Word;
OldColor: LongInt;
begin
DC := Message.DC;
if DC = 0 then
DC := BeginPaint(Handle, PS);
try
X := 1;
Y := 1;
SetBkColor(DC, Color);
SetBkMode(DC, Transparent);
OldColor := Font.Color;
for i := 0 to Pred(Lines.Count) dobeginif odd(i) then
SetTextColor(DC, clRed)
else
SetTextColor(DC, OldColor);
Z := Length(Lines[i]);
StrPCopy(Buffer, Lines[i]);
Buffer[Z] := #0; { реально не нужно }
TextOut(DC, X, Y, Buffer, Z);
Inc(Y, abs(Font.Height));
end;
finallyifMessage.DC = 0 then
EndPaint(Handle, PS);
end;
end;
procedureRegister;
begin
RegisterComponents('Dr.Bob', [TOwnerDrawMemo]);
end;
end.
Я люблю юмор и креативность в этом коде!
Теперь давайте перейдем к вопросу: использование различных шрифтов и стиля в объекте Memo.
Пример кода - это пример создания custom TxxxMemo компонента, который переопределяет метод Paint для изменения цвета каждой строки. Хотя он не напрямую связан с использованием разных шрифтов и стилей, мы можем построить на этом концепте, чтобы достичь нашего цели.
Чтобы использовать различные шрифты и стили в объекте Memo, вам нужно:
Создать новый шрифт или стиль и присвоить его вашему компоненту Memo.
Переопределить метод Paint для рисования текста с помощью выбранного шрифта или стиля.
Вот обновленный пример, который демонстрирует, как изменить шрифт и цвет каждой строки:
unitCustomMemo;interfaceusesSysUtils,WinTypes,WinProcs,Messages,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls;typeTCustomMemo=class(TMemo)privateFFont:TFont;protectedprocedureWMPaint(varMessage:TWMPaint);override;publicconstructorCreate(AOwner:TComponent);override;publishedpropertyFont:TFontreadFFontwriteSetFont;end;implementationconstructorTCustomMemo.Create(AOwner:TComponent);begininheritedCreate(AOwner);FFont:=TFont.Create;FFont.Name:='Arial';// или любым другим именем шрифтаFFont.Style:=[fsItalic];// или любым другим стилемend;procedureTCustomMemo.WMPaint(varMessage:TWMPaint);varBuffer:array[0..255]ofChar;PS:TPaintStruct;DC:HDC;i:Integer;X,Y,Z:Word;OldColor:LongInt;beginDC:=Message.DC;ifDC=0thenDC:=BeginPaint(Handle,PS);tryX:=1;Y:=1;SetBkMode(DC,OPAQUE);// использовать цвет шрифта как фонOldColor:=Font.Color;fori:=0toPred(Lines.Count)dobeginifodd(i)thenFFont.Color:=clRed// или любым другим цветомelseFFont.Color:=OldColor;Z:=Length(Lines[i]);StrPCopy(Buffer,Lines[i]);Buffer[Z]:=#0;{ не совсем необходим }TextOut(DC,X,Y,Buffer,Z);Inc(Y,abs(FFont.Height));end;finallyifMessage.DC=0thenEndPaint(Handle,PS);end;end;end.
В этом обновленном примере:
Мы добавили приватный переменную FFont для хранения объекта шрифта.
В конструкторе мы создаем новый объект TFont и устанавливаем его имя и стиль свойства.
В методе Paint мы используем функцию SetBkMode для установки фона в цвет шрифта. Таким образом, текст будет рисоваться с помощью выбранного шрифта и цвета.
Чтобы зарегистрировать этот custom компонент:
Создайте новый файл единицы (например, Register.pas) с следующим кодом:
Скомпилируйте файл единицы CustomMemo и добавьте его в ваш проект.
Теперь вы можете использовать custom компонент TCustomMemo в своих формах, и он будет отображать текст с различными шрифтами и стилями. Вы можете установить свойства шрифта и стиля в режиме дизайна или на этапе выполнения кодом.
В статье описывается создание собственного Memo-объекта с использованием различных шрифтов и стилей, а также пример реализации метода Paint для изменения цвета каждой строки в Memo-компоненте.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.