Удобство vs размер.
Intro.
Новчики часто удивляются почему даже программа "Hello world!" занимает 300 килобайт на диске, а всё потмоу что Delphi объектный язык. Конечно всё это хорошо. Но зачем нам тратить лишнее место, если например у метки (Label) чаще всего мы используем свойство Caption не трогая другие, а другие свойства всё равно занимают биты, байты, килобайты памяти. А если например вы пишете троян? То как незаметно впарить exe который весит 700 - 800 kb? Как сделать минимальное приложение? Не использовать объекты и писать на WinApi. Сейчас мы напишем программу которая просто выводит окно. На чистом WinApi.
begin
Когда вы открываите Delphi оно по умолчанию создаёт форму. Заходим View > Project manager и удаляем всё кроме Project1. Теперь открой исходник Project1. Ты должен увидеть что то вроде:
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Смело удаляй всё кроме верхней строчки. Тут мы напишем свой код.
program Mini;
uses
Windows,
messages,
sysutils;
var // Обявление перменных
Instance: HWnd;
WindowClass: TWndClass;
Handle: Hwnd;
msg: TMsg;
procedure DoExit; // процедура выхода из программы
begin
Halt;
end;
function WindowProc (Hwn, msg, wpr, lpr: longint): longint; stdcall; // функция обработки событий
begin
result:= defwindowproc(hwn, msg, wpr, lpr);
if msg=wm_destroy
then // Если сообщение сообщение что окно будет закрыто то выполнить процедуру DoExit
DoExit;
if msg=wm_KeyDown
then // Если сообщение сообщение что нажата клавиша, и если это клавиша esc то выполнить процедуру DoExit
if wpr=VK_ESCAPE
then
DoExit;
end;
begin
// получения описания модуля
instance:= GetModuleHandle(nil); // WinApi функция GetModuleHandle считывает описания модуля instance
WindowClass.style:= CS_HRedraw or CS_Vredraw;
// Стиль окна. В данном случае указано что оно будет переисовыватся как только изменится вертикальный или горизонтальный размер
WindowClass.Lpfnwndproc:= @windowproc;
// Указатель на структуру которая будет реогировать на все события
WindowClass.Hinstance:= Instance;
// Укзатель на модуль
WindowClass.LpszClassName:= 'DX';
//Имя класса
WindowClass.HCursor:= LoadCursor(0, IDC_ARROW);
//Использовать стандартный курсор
RegisterClass (WindowClass);
// регистрация нового класса
// Создание окна
Handle:= CreateWindowEX (0, 'DX', 'Mini', WS_EX_CLIENTEDGE , 500, 200, 200, 200, 0, 0, Instance, nil);
// 'DX' - имя класса окна. 'Mini' - заголовок окна. WS_EX_CLIENTEDGE - вид окна. 500 - X окна. 200 - Y окна. 0 - родительское или нет окно. 0 - Идентификатор меню ил дочернего окна. Instance - Окно модуля.
ShowWindow(Handle, SW_Show);
// WinApi функция показать окно. Handle - Указатель на это окно. SW_Show - Активизирует окно и выводит его в текущей позиции.
UpdateWindow (Handle);
// Посылает сообщение, что надо перерисовть окно.
// цикл обработки сообщений
while (GetMessage(msg, 0, 0, 0)) do
begin
translatemessage(msg);
// Переводит комбинации сообщений
dispatchmessage (msg);
// Передаёт сообщение оконной функции
end;
end.
End;
Теперь можно запускать. Для выхода нажми "Esc". Тепрь сохрани это всё дело и откомпилируй. У меня размер программый получился 30 kb и это без сжатия компрессором! Вот и всё. Напоследок хочу посоветовать хороший учебник по WinApi который лежит тут
http://www.progers.ru/e-books/cat1/17.htm. Хорошего конекта тебе

.
Автор: F1reF0x, пожелания на e-mail F1reFox[DoG]rin[тчк]ru или в icq 343222.