Разместите нашу кнопку!

Новые статьи:

Programming articles

Создание сайтов на шаблонах

Множество вариантов работы с графикой на канве

Шифруем файл с помощью другого файла

Перехват API функций - Основы

Как сделать действительно хороший сайт

Создание почтового клиента в Delphi 7

Применение паскаля для решения геометрических задач

Управление windows с помощью Delphi

Создание wap сайта

Операционная система unix, термины и понятия

SQL враг или друг

Возникновение и первая редакция ОС UNIX

Оптимизация проекта в Delphi

Ресурсы, зачем нужны ресурсы

Термины программистов 20 века

Советы по созданию собственного сайта с нуля

Шифруем файл с помощью пароля

Фракталы - геометрия природы

Crypt - Delphi программа для шифрования

Рассылка, зачем она нужна и как ее организовать?

Учебник по C++ для начинающих программистов

Уроки для изучения ассемблера

Загадочный тип PCHAR

Средства по созданию сайтов

Операторы преобразования классов is и as

Borland Developer studio 2006. Всё в одном

Создание базы данных в Delphi, без сторонних БД


Software engineering articles



Архив рассылки

    В нашей рассылке вы узнаете о новых статьях, программах, и темах на форуме. Рассылка выходит один раз в неделю, каждый четверг.
Подписаться на рассылку можно в этой форме:
Клуб программистов
Последний выпуск

25 выпуск

КЛУБ ПРОГРАММИСТОВ

в рассылке статьи, ссылки, инфо и многое другое о программировании и программистах

Новости

Лабораторные работы

Справочники

Книги

Основы Delphi

Клуб

Чат

Форум

От ведущего

Всем привет! Сегодня уже четверг, и вот уже новый выпуск Клуба программистов. В выпуске 25 мы продолжим говорить об KOL и MCK . Читайте 3-ю часть статьи. Ну а также, я сегодня сделал небольшой обзор интересных тем форума. Также, как и все прошлые разы рассылаю вам самые лучшие и юморные анекдоты.

А также, у меня есть новость, которую я спешу вам рассказать. Как всегда, все что интересненького знаю, все в народ! В ближайшем будущем (наверно уже на неделе) откроется новый проект Клуба программистов. А именно, это Блог программистов. Будет коллективный блог... больше тайн раскрывать не буду, наберитесь терпения...

__________________________________________________________

 

KOL и MCK - компактные программы на Delphi (часть 3)

С появлением KOL, а после и MCK в программировании под Delphi началась новая эпоха - стало возможно создавать быстро, быстрый и легкий код, не отказываясь от любимого языка. Но среди достоинств этого, на данной стадии развития - есть и недостатки, нехватка компонентов, сравнимая почти с нехваткой воздуха, и что самое главное, нехватка людей, которые могут их написать. Данная статья ставит себе целью изменить ситуацию и перевести написание компонентов для KOL и MCK из разряда "для избранных" в разряд "для всех". При этом она не в коей мере не ставит себе целью обучением вас Delphi, KOL, MCK считается, что эти знания у вас уже есть. Материал преподносится в форме "от простого к сложному", и так начнем.

Создание не визуального KOL компонента: Шапка невидимка
Кладов при создании KOL оставил возможность создавать невизуальные компоненты. Для этого нам необходимо объявить новый объект, наследуясь от TObj (из модуля 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 (будь то визуальные компоненты или нет) я руководствуюсь следующими правилами:
1. Раньше мы работали на VCL, потому переход на KOL и MCK будет безболезненным, если KOL и MCK компонент будет повторять VCL (его свойства, методы и прочее).
2. Мы делаем KOL и MCK фактически как инструмент для упрощения работы с API, поэтому логично, что мы должны перенести все возможности API.
3. Код который будет в KOL части большей частью перейдет в наш проект и от качества кода (и его размера) будет зависеть качество полученного exe-файла (или модуля или dll-библиотеки), по этому:
- Не бойтесь использовать ассемблер
- Не делайте лишнего или громоздкого кода
- Но оптимизация не должна идти за счет удобства



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

Здравствуйте посетители этой темы. Я хотел бы в этой теме чтобы люди рассказали и объяснили как с пакетом DelphiX лучше всего работать(по направлению создание 3Д игр)...

Приглашаем всех на " Форум программистов "

__________________________________________________________

 

Немного юмора

Разговаривают два активных пользователя Сети:
- Ну как дела?
- Да как тебе сказать… все нормально, только пальцы болят.
- А с чего вдруг?
- Да вчера с друзьями в чате встретились, так всю ночь песни орали.

***

Уважаемые абоненты!
Компания МТС начинает бесплатную sms-рассылку произведений классиков мировой литературы.
К выпуску готовится 1 том Л. Толстого “Война и мир”.
Стоимость отказа от услуги 1$!

***

- Что делает хакер, чтобы взломать банкомат?
- Берёт молоток и ноутбук, подходит к банкомату, разбивает его молотком, забирает деньги и уходит.
- А зачем ему тогда ноутбук?
- А какой же хакер без ноутбука?

***

Это уже не смешно, но до сих пор многие не могут найти на клавиатуре клавишу Any Key.

***

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

***

Двое общаются в чате
Он: Ты, наверное, очень красивая
Она: (кокетливо) Почему ты так думаешь?
Он: Только так природа могла компенсировать такую тупость

***

Программисту жена приносит кофе.
Он, не отрывая очков от монитора, берет чашку, отхлебывает, с искореженным лицом говорит жене:
- Я же терпеть не могу без сахара!
- Знаю, дорогой, - отвечает жена.
- Просто хотелось услышать твой голос…

Юмор от членов клуба программистов здесь .

__________________________________________________________

 

Программистам на заметку

Если у вас есть желание поделиться своим опытом с читателями, вы являетесь обладателем ценных, интересных статей или авторских программ, а может вы просто хотите высказать свое мнение или замечание о рассылке, просто напишите мне . Я постараюсь уделить внимание каждому. А " Клуб программистов " всегда рад приветствовать в своих рядах новых пользователей.

 

© 2006, Кочари Арнольд и "Клуб программистов"