Удобство 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.
извини ща оффтоп но меня сейчас интересует озин вопрос когда ты начел кодить на делфине то ты сначала учил паскаль а потом переходил на делфина или сразу учил делфина ? я вот сейчас изучаю турбо паскаль и мне просто интересно кстати ты случайно не тот F1reFox который был на videohack ? ещё у вас там в команде был чел Sourse
весьма и весьма спорно, просто *не_у_нас* непринято более-или менее серьёзные проекты писать на делфи ага, use asm
а почему не стоит, вить паскаль проще делфина а потом когда выучил паскаль то с делфином проще будет,, а насчёт делфина только в россии то это я не знал... вот это плоховато выходит, сам не в россии живу...
Просто паскаль к делфи имеет такое же отношение как С к С#(читай - никакого), а если ты до этого коддингом не занимался, то тебе вообще без разницы будет, что с паскаля начинать, что с делфи, это раз; и делфи это не язик программирования, а интегрированая среда разработки для языка object-pascal, это два;
2 Афтар: А зачем модуль SysUitis ? И ещё кое-что: Ты пишешь сначало: result:= defwindowproc(hwn, msg, wpr, lpr); а надо наоборот, первым делом обрабатываем мессаги, а потом defwindowproc. Вобщем типа того: http://night444.narod.ru/delphi_min.rar
Гм ... и какие ф-ции используются в показанном тобой примере, которые обьявленны в модуле SysUtils ? (но те ф-ции что в SysUtils не являются ф-циями winapi, там ф-ции "утилиты", чтобы нам с тобой проще кодить было)