![]() |
|
|
#1
|
|||
|
|||
![]() Про то как выводить данные через формы я разобрался. Следующий вопрос: разобраться как компилируется бинарный код.
Сначала я обнаружил, что написать программу которая выводит окно и в нём приветствует мир, можно двумя способами. Способ первый: Код:
{код проекта} program Project1; uses Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. {код модуля} unit Unit1; interface uses Forms, Controls, StdCtrls, Classes, Buttons; type TForm1 = class(TForm) btn1: TBitBtn; lbl1: TLabel; procedure FormCreate(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin lbl1.Caption:='Hello, World' end; end. Способ второй: Код:
{код проекта} program Project1; uses Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Unit1.Form1.lbl1.Caption:='Hello, World'; Application.Run; end. {код модуля} unit Unit1; interface uses Forms, Controls, StdCtrls, Classes, Buttons; type TForm1 = class(TForm) btn1: TBitBtn; lbl1: TLabel; end; var Form1: TForm1; implementation {$R *.dfm} end. Скажите, какой из этих двух способов, идеалогически более верный? И вот что, в обоих случаях размер конечного exe-файла у меня получается 382Кбайт. Почему так много? Что у меня оказывается в готовом бинарном коде? Ведь я так понимаю, сама программа рисованием на экране окна не занимается, это делает Windows, а программа просто передаёт ей инструкцию, вывести на экран окно и вывести в нём надпись "Hello, World". |
#2
|
||||
|
||||
![]() Цитата:
Код:
uses Forms, Controls, StdCtrls, Classes, Buttons; Также ресурсы: Код:
{$R *.dfm} Последний раз редактировалось ryderx34, 14.03.2011 в 03:01. |
#3
|
||||
|
||||
![]() вообще-то 1 и 2 способы идентичны - они используют всю мощь VCL. из-за этого теряют в размере. на самом деле вот следующий способ, наиболее "многотекстный", но наиболее "малоразмерный" (exe = 15Кб):
Код:
program CreateWindow; uses Windows, Messages; var AWndClass: WNDCLASS; AWnd: HWND; AMsg: TMsg; function WindowProc(AWnd: HWND; Msg: Integer; wParam: WPARAM; lParam: LPARAM): Longint; stdcall; begin case Msg of WM_CREATE: begin Windows.CreateWindow('STATIC', 'Hello, world', WS_CHILD+WS_VISIBLE, 10, 10, 100, 40, AWnd, 0, HInstance, nil); Result:=0; end; WM_DESTROY: begin Result:=0; end; WM_CLOSE: begin PostQuitMessage(0); Result:=0; end; else Result:=DefWindowProc(AWnd, Msg, wParam, lParam); end end; begin AWndClass.Style:=CS_HREDRAW or CS_VREDRAW; AWndClass.lpfnWndProc:=@WindowProc; AWndClass.cbClsExtra:=0; AWndClass.cbWndExtra:=0; AWndClass.hInstance:=HInstance; AWndClass.hIcon:=0; AWndClass.hCursor:=LoadCursor(0, IDC_ARROW); AWndClass.hbrBackground:=HBRUSH(COLOR_WINDOW); AWndClass.lpszMenuName:=nil; AWndClass.lpszClassName:='TWINAPIFORM'; RegisterClass(AWndClass); AWnd:=CreateWindowEx( 0, AWndClass.lpszClassName, AWndClass.lpszClassName, WS_OVERLAPPEDWINDOW, Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), 320, 120, 0, 0, HInstance, nil); SetWindowText(AWnd, 'MyWinAPIForm'); ShowWindow(AWnd, SW_SHOWNORMAL); UpdateWindow(AWnd); while GetMessage(AMsg, 0, 0, 0) do begin TranslateMessage(AMsg); DispatchMessage(AMsg); end; DestroyWindow(AWnd); UnregisterClass(AWndClass.lpszClassName, HInstance); ExitProcess(0); end. Пишу программы за еду. __________________ |
#4
|
|||
|
|||
![]() Что такое VCL, что за модуль Messages, что за класс WNDCLASS и подскажите какую-нибудь литературу где всё это подробно описано. В моей литературе всё через Forms.
|
#5
|
||||
|
||||
![]() VCL - Visual Component Library, если память мне не изменяет. Это такая вещь, которая сокращает время разработки в столько же раз, насколько увеличивает размер exe
![]() Погугли про WinAPI в Delphi. Если тебе, конечно, это интересно ![]() Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#6
|
|||
|
|||
![]() Искатель, для начала освой визуальное программирование и только потом изучай WinAPI. Любители малых кодов тебе ещё предложат на Ассемблере делать ускорения, а то, что изучение, написание и отладка существенно замедлит создание твоих проектов - об этом задумайся.
Программа на Delphi хоть и начинается с 300К, но потом растёт медленно. Сишники пользуются тем, что основные библиотеки уже есть в Windows и их не надо пристёгивать к проекту. Кстати, переделывал Си-проекты у Адамса (трёхмерная графика DirectX) на Delphi, так у него, напр., еxe-шник 2М, а у меня 500К (код одинаковый). |