Раздел "Кодинг". Содержание:
Статьи:
Создание заставок для ваших программ средствами Delphi
Анимируйте Ваше приложение с помощью Delphi!
Пособие по написанию своих компонентов на Delphi для начинающих. Часть 2
Раздел "Кодинг". Статьи:
| Создание заставок для ваших программ средствами Delphi |
|
Наверно,
каждый программист на Delphi хоть раз
хотел создать к какой-нибудь своей
программе заставку. В этой статье мы
рассмотрим создание заставок в Delphi.
Тому кто умеет работать более чем с
одной формой в приложении, будет очень
легко это понять. Чтобы не вдаваться в теорию,
начнем сразу с практики.
Откройте
какое-нибудь свое приложение, к
которому вы хотите добавить заставку,
или создайте новое (на чистом проще
разбираться). Теперь необходимо
добавить в наш проект еще одну форму,
которая будет заставкой. Для этого
нажмите File->New Form и Delphi создаст вам
новую форму. Измените ее размеры как
вам хочется. Потом установите свойство
Border Style вашей формы в bsNone (у формы не
будет заголовка и системных кнопок),
установите свойство Visible в false. Свойтсво
Position должно быть poScreenCenter - это значит,
что форма появится по центру экрана. И
чтобы не перепутать эту форму ни с
какой другой задайте ей имя Logo .
Настройка
формы заставки произведена, теперь
необходимо сделать, чтобы по щелчку
мышкой по этой форме или после нажатия
клавиши или по истечении 5 секунд форма-заставка закрывалась. Для этого
установите на форму Timer, его свойству
Interval задайте значение 5000 (форма будет
закрываться через 5 секунд). В
обработчик события OnTimer напишите всего
одно слово: Close;
В
обработчик события OnClick для формы-заставки
напишите тоже самое. Установите
свойство формы KeyPreview в true (это делается
для того, чтобы при нажатии любой
клавиши вначале реагировала форма, а
затем тот элемент, который был в фокусе
в момент нажатия). А в обработчик
события OnKeyPress (для формы-заставки
конечно же) опять-таки
напишите close;
Форма-заставка
готова полностью и теперь необходимо,
чтобы она запускалась перед главной
формой. Для этого сделайте активной
вашу главную форму, перейдите на
вкладку Events в Object Inspector'e и выберите
событие OnShow. В обработчике этого
события надо написать следующее:
logo.showmodal;
Меня
иногда спрашивают, чем отличаются
процедуры show и showmodal. У них только одно
принципиальное различие: если форма
открылась методом Showmodal, то пока она не
закроется пользователь не сможет
взаимодействовать с остальными
формами приложения. А если форма была
открыта методом Show, то пользователь
легко может перейти к любой форме
приложения.
Итак,
форма-заставка готова. Теперь мы слегка
ее усовершенствуем. Добавим такую же
штуку, как в формах-заставках Microsoft Office,
а именно на форме будет показываться
имя пользователя и организация. Для
этого разместите на форме-заставке две
метки (Label). Первую назовите UserName, а
вторую - Organization. Чтобы это сделать мы
воспользуемся реестром (тас вообще
очень много интересного можно найти). Теперь
откройте обработчик события OnCreate для
формы-заставки и объявите там
переменную R типа TRegistry, а в раздел Uses
всей программы добавьте Registry. Теперь
нам нужно создать объект R:
R:=TRegistry.Create;
R.RootKey:=HKEY_LOCAL_MACHINE;
R.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion', False);
//именно
здесь эта информация хранится
Теперь
необходимо прочитать нужные строки из
этого раздела реестра и присвоить их
соответствующим меткам:
UserName.Caption:=r.readstring('RegisteredOwner');
Organization.Caption:=r.readstring('RegisteredOrganization');
r.Free; //надо уничтожить этот объект, так
как он нам больше не нужен
Таким
образом весь этот обработчик должен
иметь примерно такой вид:
procedure
TLogo.FormCreate(Sender: TObject);
var R:Tregistry;
begin
R:=TRegistry.Create;
R.RootKey:=HKEY_LOCAL_MACHINE;
R.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion', False);
UserName.Caption:=r.readstring('RegisteredOwner');
Organization.Caption:=r.readstring('RegisteredOrganization');
r.Free;
end;
Ну
вот собственно и все что я хотел вам
рассказать о заставках. Теперь ваши
программы будут выглядеть более
солидно. Но помните, что при создании
небольших, вспомогательных программ,
объем которых не превышает килобайт
100-150 заставки лучше не использовать.
| Анимируйте Ваше приложение с помощью Delphi! |
|
Когда неделю назад я подумал сделать свое приложение более "живым",
то решил создать процедуру , которая бы анимировала средства управления. Это оказалось
более трудным делом, чем я предполагал.
Итак, нижеприведенный код - это результат почти недели "тяжелой"
работы. Вероятно много можно сделать для увеличения функциональности и
повышения скорости данной программы. Часть кода для данной процедуры я
подчерпнул в статье на сайте Delphi3000.com.
Небольшое описание используемых параметров:
Control: В качестве этой переменной используется любой компонент - наследник
класса TControl . Если компонент не является наследником TControl, но
имеет свойства Left и Top , все равно поместите его на месте TControl.
Поскольку процедура обращается только к Свойствам Top и Left , то это
сработает OK.
Dest: Величина типа TPoint , которая показывает , где остановится Control
(на текущей форме) после анимации.
PixPTick: Pixels Per Tick. Любая величина (рекомендуется 2-4) от 0 и выше.
Она не изменяет положение Control точно на каждый шаг (tick). Чем выше
эта величина , тем быстрее движение.
procedure MoveControl(var Control: TControl;
Dest: TPoint; PixPTick: Integer);
var
StartTick, OldTick, CurTick, TickDif: Cardinal;
Steps: Integer;
begin
StartTick :=3D GetTickCount;
CurTick :=3D StartTick;
Steps :=3D 0;
// Переводит Control в соответствии с Dest.y и PixPTick
if Control.Top <> Dest.y then // Проводит необходимые вычисления
if Control.Top < Dest.y then
while (Control.Top <> 0) and (Dest.y <> 0) and // Устраняет
деление на 0
// Проверка на необходимость дальнейшей регулировки
((Dest.y - Control.Top) mod PixPTick <> 0) do
Control.Top :=3D Control.Top - 1
else
while (Control.Top <> 0) and (Dest.y <> 0) and // Устраняет
деление на 0
// Проверка на необходимость дальнейшей регулировки
((Control.Top - Dest.y) mod PixPTick <> 0) do
Control.Top :=3D Control.Top + 1;
// Переводит Control в соответствии с Dest.x и PixPTick
if Control.Left <> Dest.x then // Проводит необходимые вычисления
if Control.Left < Dest.x then
while (Control.Left <> 0) and (Dest.x <> 0) and // Устраняет
деление на 0
// Проверка на необходимость дальнейшей регулировки
((Dest.x - Control.Left) mod PixPTick <> 0) do
Control.Left :=3D Control.Left - 1
else
while (Control.Left <> 0) and (Dest.x <> 0) and // Устраняет
деление на 0
// Проверка на необходимость дальнейшей регулировки
((Control.Left - Dest.x) mod PixPTick <> 0) do
Control.Left :=3D Control.Left + 1;
repeat
Application.ProcessMessages; // Реакция приложения на ввод пользователя
OldTick :=3D CurTick; // Время последнего фрейма
CurTick :=3D GetTickCount; // Текущее время
TickDif :=3D CurTick - OldTick; // Разница во времени
// По крайней мере 1 миллисекунда прошла с момента показа последнего фрейма
if TickDif > 0 then
begin
Inc(Steps);
if Control.Left > Dest.x then
Control.Left :=3D Control.Left - PixPTick
else if Control.Left < Dest.x then
Control.Left :=3D Control.Left + PixPTick;
if (Control.Top > Dest.y) then
Control.Top :=3D Control.Top - PixPTick
else if (Control.Top < Dest.y) then
Control.Top :=3D Control.Top + PixPTick;
end;
// Если прошло больше 150 шагов (что маловероятно), движение
// остановится, чтобы не войти в бесконечный цикл. Измените данную величину
// в соответствии с вашими требованиями, или удалите ее.
until ((Control.Left =3D Dest.x) and (Control.Top =3D Dest.y)) or (Steps
> 150);
end;
| Пособие по написанию своих компонентов на Delphi для начинающих. Часть 2 |
|
Если
вы прочли первую часть моего
руководства в AboutPC #7(30) или имеете хоть какие-то представления о
написании компонентов, то вам конечно же
хочется углубить свои знания и
создавать более интересные компоненты.
В этой части руководства мы рассмотрим
много интересных моментов, касающихся
создания компонентов.
Cодержание:
Редактирование значения, которое ввел
пользователь, изменяя какое-нибудь
свойство.
Простой
пример. Допустим у нас есть компонент (основанный
на Tedit), у него есть два свойства: FirstNumber и
SecondNumber. И у него есть процедура Division, в
которой первое число делится на второе и
результат присаивается свойству текст
нашего компонента. Вот код этого
компонента:
unit
DivEdit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TDivEdit = class(Tedit)
private
{ Private declarations }
FFirstNumber:integer;
FSecondNumber:integer;
FResult:Single; //в компонентах нельзя
использовать Real!!!
protected
{ Protected declarations }
public
{ Public declarations }
procedure Division;
published
{ Published declarations }
constructor create(aowner:Tcomponent);override;
property FirstNumber:integer read FFirstNumber write FFirstNumber;
property SecondNumber:integer read FSecondNumber write FSecondNumber;
property Result:Single read Fresult write FResult;
end;
procedure Register;
implementation
Constructor TDivEdit.create(aowner:Tcomponent);
begin
inherited create(aowner);
FFirtsNumber:=1;
FSecondNumber:=1;
end;
procedure TDivEdit.Division;
begin
FResult:=FFirstNumber/FSecondNumber;
text:=floattostr(FResult);
end;
procedure Register;
begin
RegisterComponents('Mihan Components', [TDivEdit]);
end;
end.
Хочется
обратить ваше внимание на то, что в
компонентах нельзя использовать
переменные и поля типа Real, вместо него
нужно брать переменные типов Single, Double,
Extended.
Здесь
все просто. Но вот если пользователю
вздумается поделить на ноль (ну вдруг он
математики не знает), то компонент
выдаст ошибку DivisionByZero, а кому они нужны. Обойти эту проблему можно так: в
код компонента добавить процедуру,
которая проанализирует данные
введенные пользователь и если все будет
в порядке, то она присвоит значения соответствующим
свойтсвам. В директиве Private объявите
такую процедуру:
procedure
SetSecondNumber(value:integer);
Обычно
такие процедуры начинаются с приставки
Set, затем идет имя свойства, и в конце тип
переменной. Теперь в директиве Published
надо сделать небольшие изменения:
property SecondNumber:integer read FSecondNumber write
SetSecondNumber;
А
теперь напишем саму процедуру:
procedure TDivEdit.SetSecondNumber(value:Integer);
begin
if value<>FSecondNumber then //надо проверить
совпадают ли исходное и вводимое
значения
FSecondNumber:=value; //если нет, то изменить
значение
if FSecondNumber=0 then
FSecondNumber:=1;
end;
Теперь
сколько бы пользователь не вводил
нулей значение SecondNumber будет единицей.
Такие процедуры проверки рекомендуется
использовать везде, где только
допустимо появление исключительной
ситуации.
Использование
другого компонента в вашем
Попробуем
создать такой компонент. Это будет
обычная метка (Label), у которой будет две
процедуры: ChangeBackColor и ChangeFontColor, которые соответственно
будут менять цвет фона метки и цвет
текста. Для этого нам понадобиться
ColorDialog, который будет создаваться вместе
с компонентом, а потом с помощью
процедур он будет активироваться.
Назовем компонент ColorLabel. Вначале
добавим в uses два модуля: Dialogs, StdCtrls (в
них находятся описания классаов диалога
и метки). Теперь нам надо объявить
переменную типа TColorDialog. Объявление идет
сразу после секции Uses. Примерно это
выглядит так:
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,StdCtrls;
var ColorDialog:TColorDialog;
type
...
Теперь
в конструкторе (Create), нам надо создать
этот компонент:
constructor TColorLabel.create(aowner:Tcomponent);
begin
Inherited Create(aowner);
ColorDialog:=TColorDialog.Create(self);
end;
Теперь
надо объявить процедуры ChangeBackColor,
ChangeFontColor. Чтобы они были доступны
пользователю их надо поместить в
директиву Public:
public
{ Public declarations }
procedure ChangeBackColor;
procedure ChangeFontColor;
published
Осталось
написать сами процедуры. Все очень
просто: открываете диалог методом Execute, а
затем присваиваете полученное значение
цвета метке. У меня эти процедуры имеют
такой вид:
procedure TColorLabel.ChangeBackColor;
begin
if ColorDialog.Execute then
color:=ColorDialog.color;
end;
procedure TColorLabel.ChangeFontColor;
begin
if ColorDialog.Execute then
font.color:=ColorDialog.color;
end;
Если
у вас вдруг что-то не получилось, то
взгляните на мой код целиком:
unit ColorLabel;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls;
var ColorDialog:TColorDialog;
type
TColorLabel = class(Tlabel)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
procedure ChangeBackColor;
procedure ChangeFontColor;
published
{ Published declarations }
constructor create(aowner:tcomponent);override;
end;
procedure Register;
implementation
constructor TColorLabel.create(aowner:Tcomponent);
begin
Inherited Create(aowner);
ColorDialog:=TColorDialog.Create(self);
end;
procedure TColorLabel.ChangeBackColor;
begin
if ColorDialog.Execute then
color:=ColorDialog.color;
end;
procedure TColorLabel.ChangeFontColor;
begin
if ColorDialog.Execute then
font.color:=ColorDialog.color;
end;
procedure Register;
begin
RegisterComponents('Mihan Components', [TColorLabel]);
end;
end.
Доступ к свойствам другого компонента
Сейчас
нам предстоит более сложная задача. Мы
будем создавать компонент, вместе с
которым будет создаваться какой-нибудь
визуальный компонент. Например создадим
кнопку, которая будет сопровождаться
поясняющей надписью сверху. За основу
возмем тип TButton. Нам надо будет создать
еще и Label. Здесь существует одна
проблемка: при перемещении компонента
по форме, метка должна двигаться вместе
с кнопкой, поэтому нам придется обрабатывать
сообщение WmMove. Итак, объявляем
переменную Label (в данном примере она
объявлена в директиве Private, что тоже
допустимо):
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls,buttons;
type
TLabelButton = class(TButton)
private
FLabel : TLabel ;
Теперь
я приведу весь код этого компонента и
походу буду вставлять необходимые
пояснения:
unit LabelBtn;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls,buttons;
type
TLabelButton = class(TButton)
private
FLabel : TLabel ; {создаем поле типа Tlabel}
procedure WMMove( var Msg : TWMMove ) ; message WM_MOVE ;{процедура
для обработки сообщения Wm_move, чтобы
метка перемещалась вместе с кнопкой}
protected
procedure SetParent( Value : TWinControl ) ; override ;{необходимо
воспользоваться и этой процедурой, так
как нужно убедиться, имеют ли кнопка и
метка общего предка}
function GetLabelCaption : string ; virtual ; {Вот пример
доступа из компонента к свойствам
другого. Эти две процедуры для изменения
текста метки}
procedure SetLabelCaption( const Value : string ) ; virtual ;
public
constructor Create( AOwner : TComponent ) ; override ;
destructor Destroy ; override ;
published
property LabelCaption : string read GetLabelCaption write
SetLabelCaption ;
end;
procedure Register;
implementation
constructor TLabelButton.Create( AOwner : TComponent ) ;
begin
inherited Create( AOwner ) ;
{ создаем TLabel }
FLabel := TLabel.Create( NIL ) ;
FLabel.Caption := 'Описание:' ;
end ;
procedure TLabelButton.SetParent( Value : TWinControl ) ;
begin
{надо убедиться, что у них предок один, чтоб
проблем потом не было}
if ( Owner = NIL ) or not ( csDestroying in Owner.ComponentState ) then
FLabel.Parent := Value ;
inherited SetParent( Value ) ;
end ;
destructor TLabelButton.Destroy ;
begin
if ( FLabel <> NIL ) and ( FLabel.Parent = NIL ) then
FLabel.Free ;{Уничтожаем метку, т.к. она нам
больше не нужна}
inherited Destroy ;
end ;
function TLabelButton.GetLabelCaption : string ;
begin
Result := FLabel.Caption ;
end ;
procedure TLabelButton.SetLabelCaption( const Value : string ) ;
begin
FLabel.Caption := Value ;
end ;
procedure TLabelButton.WMMove( var Msg : TWMMove ) ;
begin
inherited ;
if FLabel <> NIL then with Flabel do
SetBounds( Msg.XPos, Msg.YPos - Height, Width,Height ) ; {изменяем
левое и верхнее положение метки исходя
из полученных координат}
end;
procedure Register;
begin
RegisterComponents('Mihan Components', [TLabelButton]);
end;
initialization
RegisterClass( TLabel ) ; {Это делается для
обеспечения поточности, но об этом не
думайте, этим редко придется
пользоваться}
end.{Вы можете пользоваться этим
компонентом сколько угодно, но
распространять его можно только
указывая авторство}
Можно
сделать доступ к любым свойствам метки,
например, к шрифту, цвету и так далее,
используя необходимые процедуры.
Использование
в качестве предка класс TWinControl
Предыдущий
пример был очень сложным, к тому же
пришлось обрабатывать системные
сообщения. Есть другое решение этой
проблемы, более простое для понимания и
для реализации: использовать в качестве
контейнера класс TWinControl и в этот
контейнер помещать другие компоненты.
Теперь попробуем совместить Edit и Label.
Давайте вместе создадим такой компонент.
В качестве предка нужно выбрать класс
TWinControl, а в качестве типа вашего
компонента выберите TlabelEdit. Будем
разбирать код по кусочкам.
unit
LabelEdit;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, stdctrls;
type
TLabelEdit = class(TWinControl)
private
{ Private declarations }
FEdit: TEdit;
FLabel: TLabel;
Здесь
объявляются поля для метки и для Edit'a.
function
GetLabelCaption: string;
procedure
SetLabelCaption(LabelCaption: string);
function
GetEditText: string;
procedure
SetEditText(EditText: string);
Здесь
объявлены функции для работы со
свойствами Caption у метки и Text у Edit'a.
protected
{ Protected declarations }
public
{ Public declarations }
constructor
Create(AOwner: TComponent); override;
published
property
LabelCaption: string read GetLabelCaption write
SetLabelCaption;
property
EditText: string read GetEditText write
SetEditText;
{ Published declarations }
end;
procedure Register;
implementation
constructor TLabelEdit.Create(AOwner: TComponent);
begin
inherited
Create(AOwner);
FEdit := TEdit.Create(self);{создаем поле
редактирования Edit}
FLabel := TLabel.Create(self);{создаем Label}
with
FLabel do begin
Width := FEdit.Width;
visible := true;
Parent := self;
Caption := 'Описание:';
end;
with
FEdit do begin
Top := FLabel.Height+2;
Parent := self;
Visible := true;
end;
Top := 0;
Left := 0;
Width := FEdit.Width;
Height := FEdit.Height+FLabel.Height;{определяются
размеры и положение компонентов}
Visible := true;
end;
function TLabelEdit.GetLabelCaption: string;
begin
Result := FLabel.Caption;
end;
procedure TLabelEdit.SetLabelCaption(LabelCaption: string);
begin
FLabel.Caption := LabelCaption;
end;
function TLabelEdit.GetEditText: string;
begin
Result := FEdit.Text;
end;
procedure TLabelEdit.SetEditText(EditText: string);
begin
FEdit.Text := EditText;
end;
procedure Register;
begin
RegisterComponents('Mihan Components', [TLabelEdit]);
end;
end.
Попробуйте установить
этот компонент. Когда вы будете
размещать его на форме, то будет виден
"контейнер", на котором располагаются
Edit и Label. Использование в качестве предка
компонента класса TWinControl, очень удобно
если вы хотите объединить несколько
визуальных компонентов.
Обработка событий OnMouseDown, OnMouseMove и OnMouseUp
Часто
возникает необходимость обработки
событий нажатия и отпускания кнопки в
вашем компоненте. Сейчас мы это и
рассмотрим. Только ради примера сделаем
компонент, который будет считать
количество нажатий и отпусканий кнопки
в его области, допустим это будет панель
(Tpanel). Для этого в директиве Private надо
объявить следующие процедуры и поля:
FClickCount:integer;
FUpCount:integer;
procedure MouseDown(Button:TMouseButton; Shift: TShiftState; X,Y: Integer); override;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
procedure MouseUp(Button:TMouseButton; Shift:TShiftState; X, Y: Integer);
override;
А
в директиве Published надо написать:
constructor create(aowner:tcomponent);override;
property ClickCount:integer read FclickCount write FClickCount;
property UpCount:integer read FUpCount write FUpCount;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
Ну
и теперь осталось описать нужные
процедуры:
procedure TMpanel.MouseDown(Button:TMouseButton; Shift: TShiftState; X,Y: Integer);
begin
FClickCount:=FClickCount+1;
end;
procedure TMpanel.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
caption:=inttostr(x)+' '+inttostr(y);{для демонстрации
работы этой процедуры. Надпись на панели
будет отражать координаты курсора мыши
над этой панелью}
end;
procedure TMpanel.MouseUp(Button:TMouseButton; Shift:TShiftState; X, Y: Integer);
begin
FUpCount:=FUpCount+1;
end;
Таким
образом весь код компонента был таким:
unit Mpanel;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls;
type
TMpanel = class(TPanel)
private
{ Private declarations }
FClickCount:integer;
FUpCount:integer;
procedure MouseDown(Button:TMouseButton; Shift: TShiftState; X,Y: Integer); override;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
procedure MouseUp(Button:TMouseButton; Shift:TShiftState; X, Y: Integer); override;
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
constructor create(aowner:tcomponent);override;
property ClickCount:integer read FclickCount write FClickCount;
property UpCount:integer read FUpCount write FUpCount;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
end;
procedure Register;
implementation
constructor TMpanel.create(aowner:Tcomponent);
begin
inherited create(aowner);
end;
procedure TMpanel.MouseDown(Button:TMouseButton; Shift: TShiftState; X,Y: Integer);
begin
FClickCount:=FClickCount+1;
end;
procedure TMpanel.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
caption:=inttostr(x)+' '+inttostr(y);
end;
procedure TMpanel.MouseUp(Button:TMouseButton; Shift:TShiftState; X, Y: Integer);
begin
FUpCount:=FUpCount+1;
end;
procedure Register;
begin
RegisterComponents('Mihan Components', [TMpanel]);
end;
end.
Создание
и использование своей иконки для
компонента
Когда
вы создали свой компонент и установили
его, та на палитре компонентов, его
иконка будет такой же как и у компонента,
который вы выбрали в качестве предка.
Конечно же вам хотелось бы видеть свой
компонент со своей иконкой. Для этого
необходимо создать файл ресурсов
компонента. Сейчас я расскажу вам как
это делается.
Откройте
Image Editor (Tools->Image Editor) и выберите
File->New->Component Resourse File. Перед вами
появится небольшое окно с надписью
Untitled.dcr в нем будет только одно слово:
Contents. Нажмите на него правой кнопкой и в
появившемся меню выберите New->Bitmap.
Откроется диалоговое окно для настройки
параметров изображения. Они должны быть
такими: Размер 32x32, цветовой режим VGA (16
colors). Теперь нажмите ok. Теперь надо
нажать правой кнопкой на появившейся
надписи Bitmap1 и выбрать пункт Rename.
Название картинки должно совпадать с
названием класса компонента, для
которого вы делаете эту иконку (например,
TMPanel). Нажмите два раза на Bitmap1 и перед
вами появится окно для рисования.
Нарисуйте, что вам надо и перейдите на
окно с надписью Untitled.dcr и в меню File
выберите Save. Имя файла ресурса
компонента должно совпадать с именем
модуля компонента (без расширения
конечно же, например, Mpanel). Файл ресурса
готов. Теперь установите ваш компонент
заново и в палитре компонентов ваш
компонент будет уже с новой иконкой.
|