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

Да, мне это интересно. Я знаю как программировать на Паскале под DOS. Пытался изучить ассемблер, ничего не понял по WinAPI, к тому же не определился MASM или FASM использовать. Сейчас наверное серьёзно возьмусь за Delphi, он вроде наследник Паскаля.

По поводу вопроса. Моя природная любознательность очень хочет знать, что у меня будет в конечном коде. Я так понимаю програмирование через VCL делает то, что в конечный код добавляется множество вызывающих друг друга процедур, которые в конце вызывают всё те же функции WinAPI? Или вы мне советуете сначала изучить визуальное программирование, а только потом такие вопросы задавать. И ещё вопрос, как вообще технически осуществляется вызов функций WinAPI?
Ответить с цитированием
  #8  
Старый 15.03.2011, 15:18
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Цитата:
Сообщение от Iskatel_S
...Я знаю как программировать на Паскале под DOS. Пытался изучить ассемблер...

По поводу вопроса. Моя природная любознательность очень хочет знать, что у меня будет в конечном коде. Я так понимаю програмирование через VCL делает то, что в конечный код добавляется множество вызывающих друг друга процедур, которые в конце вызывают всё те же функции WinAPI? Или вы мне советуете сначала изучить визуальное программирование, а только потом такие вопросы задавать. И ещё вопрос, как вообще технически осуществляется вызов функций WinAPI?
Для начала уяснить, чем Windows отличается от DOS.
Итак, прогресс пошёл в таком направлении: Windows, объектное программирование, визуальное программирование. Кратко особенности:
1). В DOS'e алгоритм делал вычисления по порядку. В Windows'е программа большую часть времени ничего не делает (как паук ждёт появления мухи). Пишутся процедуры, назывуемые "обработчики событий" (нажатие кнопки, таймер...).
2). Вводится тип class. Вам надо почитать, что такое экземпляр класса, свойство, методы, события.
3). Многие визуальные компоненты создают прямоугольные окна (кнопки, списки, формы...). Языки визуального программирования вызовы процедур низкого уровня (WinAPI) берут на себя, программисту надо только во время разработки разместить компоненты на форме, установить некоторые свойства, запрограммировать алгоритм в обработчиках (таких как OnClick...).
Но конечно, никто не мешает вызывать в любом подходящем месте любую функцию, в том числе и WinAPI.
Ответить с цитированием
  #9  
Старый 15.03.2011, 16:28
Аватар для AND_REY
AND_REY AND_REY вне форума
Активный
 
Регистрация: 31.03.2009
Адрес: Украина, г.Днепропетровск
Сообщения: 324
Версия Delphi: Delphi7
Репутация: 3877
По умолчанию

WinApi - это набор функций и процедур расположенных в kernel32.dll, user32.dll, gdi32.dll и т.д. Эти дллки находятся в папке C:\windows\system32\...
У 99% приложений имеется таблица импорта. В ней прописываются имена дллок, ф-нц, процедур которые использует приложение. (можно посмотреть с помощью проги PEExplorer).
При обычном программировании на Delphi в прогу пихается куча ненужных ф-нц и т.д.
А если на WinApi писать то в прогу пихается де то в половину меньше лишней инфы.
На Асме ты сам прописываешь импортируемые функции.
WinApi я не изучал я изучил работу и создание длл и всё понял.
Нужно только знать для чего какая ф-нц. и в какой длл находится.
__________________
If end Then begin;
Ответить с цитированием
  #10  
Старый 15.03.2011, 17:31
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

Цитата:
Сообщение от AlexSku
В Windows'е программа большую часть времени ничего не делает
Не согласен, для компьютера ожидание это тоже работа, ничего не делает только не запущенная программа или отключенный компьютер.
Цитата:
Сообщение от AlexSku
Вводится тип class.
Во первых это не тип, а во вторых понятие класса существовало и до виндовса. Поэтому оно не вводится, а начинает активно использоваться.
В паскале под ДОС есть классы, а так же, есть Object, описание экземпляра класса.
Цитата:
Сообщение от 'AlexSku
Многие визуальные компоненты создают прямоугольные окна (кнопки, списки, формы.

Ничего они не создают, создает средство VCL, так как оно предоставляет огромное количество готовых к использованию компонентов.
Ответить с цитированием
  #11  
Старый 15.03.2011, 21:54
Iskatel_S Iskatel_S вне форума
Прохожий
 
Регистрация: 27.11.2010
Адрес: Москва (съёмное жильё)
Сообщения: 14
Репутация: 10
По умолчанию

Цитата:
Сообщение от AND_REY
WinApi - это набор функций и процедур расположенных в kernel32.dll, user32.dll, gdi32.dll и т.д. Эти дллки находятся в папке C:\windows\system32\...
У 99% приложений имеется таблица импорта. В ней прописываются имена дллок, ф-нц, процедур которые использует приложение.
Так, как я это понимаю. Программирование для многозадачной операционной системы отличается от программирования для DOS тем, что тут нельзя напрямую обращаться к ресурсам компьютера. В WINDOWS для этого следует обращаться к функциям WinAPI, который располагается в библиотеках kernel32.dll, user32.dll, gdi32.dll.
То есть при работе большинства WINDOWS-программ вычисления в основном производятся не в самой программе, а в этих библиотеках?
И вот, что мне не понятно, при обрачении к дллкам программа всякий раз грузит их с диска? Как же тогда избежать сбоев, если одновременно несколько процессов пытаются открыть для ыполнения один и тот же файл? Или библиотеки постоянно загружены в оперативную память? Тогда как технически осуществляется обращение к другому процессу находящимуся в оперативной памяти?
Ответить с цитированием
  #12  
Старый 15.03.2011, 21:57
Assistant Assistant вне форума
Продвинутый
 
Регистрация: 20.02.2011
Адрес: там где правят идиоты
Сообщения: 603
Версия Delphi: 7
Репутация: выкл
По умолчанию

какие-то постоянно загружены, при загрузке Windows, какие-то сам подгружаешь в своей программе (тебе решать, в памяти будет DLL жить или один раз использовать её и убить из памяти)
__________________
взялся из неоткуда, ничего не прошу, помогаю просто так
ICQ: 593977748 - стучать в случае КРАЙНЕЙ необходимости, ну, или если вы со Ставрополя
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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