![]() |
|
|
|
|
#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. Если тебе, конечно, это интересно ![]() |
|
#6
|
|||
|
|||
|
Искатель, для начала освой визуальное программирование и только потом изучай WinAPI. Любители малых кодов тебе ещё предложат на Ассемблере делать ускорения, а то, что изучение, написание и отладка существенно замедлит создание твоих проектов - об этом задумайся.
Программа на Delphi хоть и начинается с 300К, но потом растёт медленно. Сишники пользуются тем, что основные библиотеки уже есть в Windows и их не надо пристёгивать к проекту. Кстати, переделывал Си-проекты у Адамса (трёхмерная графика DirectX) на Delphi, так у него, напр., еxe-шник 2М, а у меня 500К (код одинаковый). |