Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.03.2011, 01:43
Iskatel_S Iskatel_S вне форума
Прохожий
 
Регистрация: 27.11.2010
Адрес: Москва (съёмное жильё)
Сообщения: 14
Репутация: 10
По умолчанию Hello, World

Про то как выводить данные через формы я разобрался. Следующий вопрос: разобраться как компилируется бинарный код.

Сначала я обнаружил, что написать программу которая выводит окно и в нём приветствует мир, можно двумя способами.

Способ первый:
Код:
{код проекта}
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  
Старый 14.03.2011, 02:53
Аватар для ryderx34
ryderx34 ryderx34 вне форума
Активный
 
Регистрация: 22.01.2010
Сообщения: 211
Версия Delphi: 7, 2010
Репутация: 1349
По умолчанию

Цитата:
Сообщение от Iskatel_S
Что у меня оказывается в готовом бинарном коде?
Всё что в uses:
Код:
uses
  Forms, Controls, StdCtrls, Classes, Buttons;
Открой соответствующие файлы *.pas и посмотри (в Delphi это можно сделать установив курсор на имя нужного модуля и нажав Ctrl + Enter).
Также ресурсы:
Код:
{$R *.dfm}
(смотри файл Unit1.dfm)

Последний раз редактировалось ryderx34, 14.03.2011 в 03:01.
Ответить с цитированием
  #3  
Старый 14.03.2011, 08:41
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

вообще-то 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  
Старый 14.03.2011, 11:08
Iskatel_S Iskatel_S вне форума
Прохожий
 
Регистрация: 27.11.2010
Адрес: Москва (съёмное жильё)
Сообщения: 14
Репутация: 10
По умолчанию

Что такое VCL, что за модуль Messages, что за класс WNDCLASS и подскажите какую-нибудь литературу где всё это подробно описано. В моей литературе всё через Forms.
Ответить с цитированием
  #5  
Старый 14.03.2011, 11:14
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

VCL - Visual Component Library, если память мне не изменяет. Это такая вещь, которая сокращает время разработки в столько же раз, насколько увеличивает размер exe

Погугли про WinAPI в Delphi. Если тебе, конечно, это интересно
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #6  
Старый 14.03.2011, 15:18
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Искатель, для начала освой визуальное программирование и только потом изучай WinAPI. Любители малых кодов тебе ещё предложат на Ассемблере делать ускорения, а то, что изучение, написание и отладка существенно замедлит создание твоих проектов - об этом задумайся.
Программа на Delphi хоть и начинается с 300К, но потом растёт медленно. Сишники пользуются тем, что основные библиотеки уже есть в Windows и их не надо пристёгивать к проекту. Кстати, переделывал Си-проекты у Адамса (трёхмерная графика DirectX) на Delphi, так у него, напр., еxe-шник 2М, а у меня 500К (код одинаковый).
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:02.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025