25 выпуск
|
||||||||||||
От ведущего Всем привет! Сегодня уже четверг, и вот уже новый выпуск Клуба программистов. В выпуске 25 мы продолжим говорить об KOL и MCK . Читайте 3-ю часть статьи. Ну а также, я сегодня сделал небольшой обзор интересных тем форума. Также, как и все прошлые разы рассылаю вам самые лучшие и юморные анекдоты. А также, у меня есть новость, которую я спешу вам рассказать. Как всегда, все что интересненького знаю, все в народ! В ближайшем будущем (наверно уже на неделе) откроется новый проект Клуба программистов. А именно, это Блог программистов. Будет коллективный блог... больше тайн раскрывать не буду, наберитесь терпения... |
||||||||||||
__________________________________________________________ |
||||||||||||
KOL и MCK - компактные программы на Delphi (часть 3) С появлением KOL, а после и MCK в программировании под Delphi началась новая эпоха - стало возможно создавать быстро, быстрый и легкий код, не отказываясь от любимого языка. Но среди достоинств этого, на данной стадии развития - есть и недостатки, нехватка компонентов, сравнимая почти с нехваткой воздуха, и что самое главное, нехватка людей, которые могут их написать. Данная статья ставит себе целью изменить ситуацию и перевести написание компонентов для KOL и MCK из разряда "для избранных" в разряд "для всех". При этом она не в коей мере не ставит себе целью обучением вас Delphi, KOL, MCK считается, что эти знания у вас уже есть. Материал преподносится в форме "от простого к сложному", и так начнем.
Создание не визуального KOL
компонента: Шапка невидимка
TNewKOLUnVisual =
object
(TObj)
private
public
end ; Заметьте, что когда я сказал объект, я имел в виду именно объект, а не класс! Такова особенность модели наследования KOL, к ней придется привыкнуть. Данный переход на "устаревшую" модель обусловлен ее эффективностью и спецификой внутренней реализации, что дало возможность построить на ее основе KOL. Далее, чтобы наше повествование не было некой абстракцией, давайте перейдем на построение компонента, я взял за пример постройку AboutDialog. Хочу сделать небольшое отступление по поводу названия файла, ныне принят негласный стандарт kolComponentName.pas либо KOLComponentName.pas, я придерживаюсь второго, поскольку KOL - это аббревиатура и по правилам ее надо писать в верхнем регистре (тем более так она логически выделяется в имени). Я и далее буду вставлять рекомендации, они сделаны на фоне моего опыта и наблюдений, и исходят из неких соображений, я ни в коем случаи их вам не навязываю, причем, если вы не согласны с моими посылами - дискуссия открыта, адрес вы знаете unit KOLMHAboutDialog;
interface
uses KOL;
type
PMHAboutDialog =^TMHAboutDialog;
TKOLMHAboutDialog = PMHAboutDialog;
TMHAboutDialog =
object
(TObj)
private
public
end
;
implementation end. Как можно заметить модуль называется, как и файл, знакомьтесь это шаблон компонента. После беглого просмотра можно увидеть две строки значение коих еще не объяснялось: PMHAboutDialog =^TMHAboutDialog; TKOLMHAboutDialog = PMHAboutDialog; Эти строки также результат специфики KOL, поскольку мы в KOL работаем не с самими объектами, а с указателями на них. Потому мы и написали первую строку. Вторая нужна для психологического успокоения нас и компилятора, поскольку механизм MCK, как мы увидим позже, использует именно этот тип. Хочу обратить ваше внимание на череду имен (PMHAboutDialog, TMHAboutDialog, TKOLMHAboutDialog) и правила их образования (думаю их комментировать не стоит) - это тоже устоявшееся положение. Далее давайте добавим немного свойств, для нашего нового компонента, получим нечто такое.
При создании
компонентов для KOL и MCK (будь то визуальные компоненты или нет) я
руководствуюсь следующими правилами:
unit KOLMHAboutDialog;
interface
uses KOL, Windows, ShellAPI;
type
TIconType=(itShell,itApplication,itCustom);
PMHAboutDialog =^TMHAboutDialog;
TKOLMHAboutDialog = PMHAb
outDialog;
TMHAboutDialog =
object
(TObj)
private
FTitle:
String
;
FCopyRight:
String
;
FText:
String
;
FIcon: HIcon;
&nbs
p; FIconType: TIconType;
public
property
Title:
String
read FTitle write FTitle;
property
CopyRight:
String
read FCopyRight write FCopyRight;
property
Text:
String
read FText write FText;
property
Icon: HIcon read FIcon write FIcon;
property
IconType: TIconType read FIconType write FIconType;
end
;
implementation end. Думаю, что никто для себя ничего нового не нашел. Но мог возникнуть вопрос, зачем все вынесено в свойства, когда в этом нет необходимости (чтение и запись идут напрямую), отвечу - как пример, и поскольку необходимости в этом действительно нет, мы переделаем код: unit KOLMHAboutDialog;
interface
uses KOL, Windows, ShellAPI;
type
TIconType=(itShell,itApplication,itCustom);
PMHAboutDialog =^TMHAboutDialog;
TKOLMHAboutDialog = PMHAboutDialog;
TMHAb
outDialog =
object
(TObj)
private
public
Title:
String
;
CopyRight:
String
;
Text:
String
;
Icon: HIcon;
&nbs
p; IconType: TIconType;
end
;
implementation end. Если посмотреть размер, после этих несложных манипуляций уменьшился почти в 2 раза. Да, если кого удивило появление модулей Windows и ShellAPI, не пугайтесь, они понадобиться чуть позже. Ну что же пора вносить работоспособность в компонент, сделаем это добавив два метода Destroy и Execute: unit KOLMHAboutDialog;
interface
uses KOL, Windows, ShellAPI;
type
TIconType=(itShell,itApplication,itCustom);
PMHAboutDialog =^TMHAboutDialog;
TKOLMHAboutDialog = PMHAboutDialog;
TMHAboutDialog =
o
bject
(TObj)
private
public
Title:
String
;
CopyRight:
String
;
Text:
String
;
Icon: HIcon;
IconType:&nbs
p; TIconType;
destructor
Destroy;
virtual
;
procedure
Execute;
end
;
implementation
destructor TMHAboutDialog.Destroy;
begin
DestroyIcon(Icon);
inherited
;
end ;
procedure TMHAboutDialog.Execute;
var
HWndOwner:THandle;
TMPIcon:HIcon;
begin
if
Assigned(Applet)
then
HWndOwner := Applet.Handle
else
HWndOwner := 0;
&n
bsp;
case
IconType
of
itShell: TMPIcon := 0;
itApplication: TMPIcon := Applet.Icon;
itCustom: TMPIcon := Icon;
end
;
//case
ShellAbout(HWndOwner,PChar(Title+'#'+Text),PChar(CopyRight),TMPIcon);
end ; end. Начнем разбираться, Destroy (не забывайте virtual, а то компилятор не пустит). Фактически в нем идет освобождение ресурса иконки (Проверку на наличие иконки делать не надо, поскольку мы используем функцию DestroyIcon - если иконку уничтожить нельзя она вернет не нуль, но программа будет работать корректно), а далее выполнения Destroy предка. Метод Execute не должен вызывать испуга у людей знакомых с API. Вопрос может возникнуть только по поводу переменной Applet - это глобальная переменная из KOL типа PControl, аналог Application из Delphi. У наблюдательных читателей, возможно, возник вопрос: Destroy есть, а где Create? Будет , вот он : unit KOLMHAboutDialog;
interface
uses KOL, Windows, ShellAPI;
type
TIconType=(itShell,itApplication,itCustom);
PMHAboutDialog =^TMHAboutDialog;
TKOLMHAboutDialog = PMHAboutDialog;
< SPAN lang=EN-US> TMHAboutDialog = object (TObj)
private
public
Title:
String
;
CopyRight:
String
;
Text:
String
;
Icon: HIcon;
IconType: TIconType;
destructor
Destroy;
virtual
;
procedure
Execute;
end
;
function NewMHAboutDialog:PMHAboutDialog;
implementation
function NewMHAboutDialog:PMHAboutDialog;
begin
New(Result, Create);
end ;
destructor TMHAboutDialog.Destroy;
begin
DestroyIcon(Icon);
inherited
;
end ;
procedure TMHAboutDialog.Execute;
var
HWndOwner:THandle;
TMPIcon:HIcon;
begin
if
Assigned(Applet)
then
HWndOwner := Applet.Handle
else
HWndOwner := 0;
case
IconType
of
itShell: TMPIcon := 0;
itApplication: TMPIcon := Applet.Icon;
itCustom: TMPIcon := Icon;
end
;
//case
ShellAbout(HWndOwner,PChar(Title+'#'+Text),PChar(CopyRight),TMPIcon);
end ; end. Те кто задавали этот вопрос, наверное, ждали нечто иное чем внешнюю функцию NewMHAboutDialog, но ничего не поделаешь - это KOL! Помните, я говорил, что нам придется работать с указателями, да и ООП модель у нас на базе объектов, а не классов. Сама функция как мы видим, выделяет память для объекта. Теперь немного о самой форме New функции, опять же обратите внимание на название - без комментариев. Могут возникнуть вопросы: что делать внутри функции, и какие передавать ей параметры? Ответ, внутри функция должна выполнять минимум операций, т.е. тот минимум, который необходим для начала работы с компонентом. С параметром так же, передаются только необходимые непосредственно функции New и обязательно используемые с нею (обычно эти группы неразделимы). Вы можете сказать, что тогда надо добавить в New загрузку иконки, ведь мы ее всегда уничтожаем - но это неправильно, мы ее всегда уничтожаем, Но не всегда создаем! И как можно заметить не одно из свойств не является обязательным, т.е. метод Execute можно вызвать сразу после New. Возможно, это не самый удачный пример, будут и лучше. Таким образом, мы экономим немного кода, а в итоге выигрываем в скорости и размере. Надеюсь, я вас убедил. Хммм… неслышу возгласа "ура". Почему? Так ведь мы KOL компонент сделали! Теперь давайте проверим его в деле. Возьмем, какой-нибудь проект (KOL конечно) и добавим строки: uses … KOLMHAboutDialog;
…
var
TMP:TKOLMHAboutDialog;
begin
TMP:=NewMHAboutDialog;
TMP.Execute;
TMP.Free;
end ;Замечаете, мы фактически задаем ненужный параметр, да к тому же сама функция New потолстела (правда несильно). Тут мы выигрываем не много (байты), но это принципиальный момент. Много помалу - много! Продолжение будет в следующем выпуске. А потом и в Клубе ))) |
||||||||||||
__________________________________________________________ |
||||||||||||
Интересненькое с Форума программмистов ! Как и с чего начать при создании 2д игрушки Уважаемые программисты. Я совсем недавно начал изучать Delphi, и очень захотелось написать свою простенькую 2д игру. У меня к вам есть несколько вопросов... *** Visual J# from Microsoft Visual Studio .NET В Microsoft Visual Studio одним из языков, перенесённым на платформу .NET является Visual J#. Так вот вопрос - это какое-то новое "воплощение" Java от Майкрософта (вроде как C# от C++) или что-то координально новое? *** Как связать таблицы в Access 2003 ? П омогите ! 2-й час тупо пытаюсь понять, как связать две таблицы. Есть таблицы: Таблица1 (есть поля ФИО и ПОДРАЗДЕЛЕНИЕ) Таблица2 (есть поля ПОДРАЗДЕЛЕНИЕ и ФИО) ... *** B orland Delphi и Visual Basic В чём отличие между Borland Delphi и Visual Basic? Какие основные преимущества того и другого. Область применения, простота программирования, оффициальная поддержка и т.д. и т.п. *** S .T.A.L.K.E.R. Shadow of CHernobyl В марте этого года выйдет эта игра. Жду не дождусь! Вот только сможет ли она конкурировать? С момента заявки о выпуске (2001 год) выпустили множество игр: Half-live 2, GTA SAN ANDREAS, GTA VICE SITY, World of Warcraft, Call of Duty, Точка кипения. СТАЛКЕРУ действительно надо быть таким классным, что бы возглавить хит-парады игр. А что вы думаете по этому поводу? *** Решил поставить себе на комп линукс, но оказалось, что версий данной ОС существует огромное множество... Мне больше всего понравился ASPLinux 11.2 Что вы думаете по этому поводу??? Какой линукс вы посоветуете? *** Здравствуйте посетители этой темы. Я хотел бы в этой теме чтобы люди рассказали и объяснили как с пакетом DelphiX лучше всего работать(по направлению создание 3Д игр)... Приглашаем всех на " Форум программистов " |
||||||||||||
__________________________________________________________ |
||||||||||||
Немного юмора
Разговаривают два активных
пользователя Сети:
***
Уважаемые
абоненты!
***
- Что делает хакер, чтобы
взломать банкомат?
*** Это уже не смешно, но до сих пор многие не могут найти на клавиатуре клавишу Any Key. *** Компьютер - это электронное устройство, которое не заменит человека до тех пор, пока не научится смеяться над шутками босса и сваливать свои собственные ошибки на соседний компьютер. ***
Двое общаются в чате
***
Программисту жена приносит
кофе.
Юмор от членов клуба программистов здесь . |
||||||||||||
__________________________________________________________ |
||||||||||||
Программистам на заметку Если у вас есть желание поделиться своим опытом с читателями, вы являетесь обладателем ценных, интересных статей или авторских программ, а может вы просто хотите высказать свое мнение или замечание о рассылке, просто напишите мне . Я постараюсь уделить внимание каждому. А " Клуб программистов " всегда рад приветствовать в своих рядах новых пользователей. |
||||||||||||
© 2006, Кочари Арнольд и "Клуб программистов" |