Чтобы создать форму таких маленьких размеров потребуется использование апи, а также создать экземпляр класса формы. На форме средствами апи можно создать такие компоненты как Button,Edit,Static (аналог Lable), ComboBox и ListBox т.к это системные классы, то есть предоставляемые системой а не средой программирования этим мы и уменьшаем размер. При создании формы необходимо обрабатывать её события с помощью специальной оконной процедуры, и так же создать очередь сообщений или так называемую петлю сообщений чтобы окно постоянно висело в памяти. Выкидываем всё ненужное из модулей SYSINIT.PAS, SYSTEM.PAS в подробности вдаваться не буду, просто приатачу http://multi-up.com/325644. закидываем в папку с проектом. Исходный текст проекта Code: program form; const MyClassName = 'MyClass'; //Имя класа окна WS_VISIBLE = $10000000; //Стиль окна WS_CHILD = $40000000; //Принадлежность к форме WS_EX_STATICEDGE = $20000; //Стиль для Эдита (выделение) KERNEL32 = 'kernel32.dll';//Имена библиотек user32 = 'user32.dll'; // type HWND = INTEGER; //Переопределение типов DWORD = integer; BOOL = BOOLEAN; THandle = integer; HINST = Integer; UINT = INTEGER; //Запись для позиций TPoint = packed record X : Longint; Y : Longint; end; //Запись Сообщений TMSG = packed record hwnd : Integer; message : integer; wParam : Longint; lParam : Longint; time : integer; pt : TPoint; end; //Записи скласса TWndClassEx = packed record cbSize : Integer; style : Integer; lpfnWndProc : Pointer; cbClsExtra : Integer; cbWndExtra : Integer; hInstance : integer; hIcon : Integer; hCursor : Integer; hbrBackground : Integer; lpszMenuName : PChar; lpszClassName : PChar; hIconSm : Integer; end; //Экспорты некоторый необходимый функций function DefWindowProc(hWnd: Integer; Msg: UINT; wParam: Integer; lParam: Integer): Integer; stdcall; external user32 name 'DefWindowProcA'; function RegisterClassEx(const WndClass: TWndClassEx): Word; stdcall; external user32 name 'RegisterClassExA'; function GetMessage(var lpMsg: TMsg; hWnd: integer; wMsgFilterMin, wMsgFilterMax: integer): boolean; stdcall; external user32 name 'GetMessageA'; function TranslateMessage(const lpMsg: TMsg): boolean; stdcall; external user32 name 'TranslateMessage'; function DispatchMessage(const lpMsg: TMsg): integer; stdcall; external user32 name 'DispatchMessageA'; function CreateWindowEx(dwExStyle: integer; lpClassName: PChar; lpWindowName: PChar; dwStyle: integer; X, Y, nWidth, nHeight: Integer; hWndParent: integer; hMenu: integer; hInstance: integer; lpParam: Pointer): integer; stdcall; external user32 name 'CreateWindowExA'; var Msg : Tmsg; //Сообщения окну WinClass : TWndClassEx;//Клас окна hw : hwnd; //Хендл окна bu : hwnd; //Хендл кнопки lb : hwnd; //Хендл текстовой метки ed : hwnd; //Хендл Эдита top : integer; //} left : integer; //}позиции окна width : integer; //} height : integer; //} (* Оконная процедура обработки сообщений *) function WndProc(hnd, wmsg, wparam, lparam: integer): integer; stdcall; begin case wparam of //Опреденляем по id нажатую кнопку 7: begin halt;//Убиваемся end else Result:=DefWindowProc(hnd, wmsg, wparam, lparam);//Возвращаем параметры в функцию end; end; (* Создание класса окна *) Procedure CreateMyFofm; begin with WinClass do //Для класса определяем begin cbSize:=SizeOf(WinClass); // lpszClassName:=MyClassName; //Имя lpfnWndProc:=@WndProc; //Поцедура обрботки cbClsExtra:=0; //Параметр cbWndExtra:=0; //Параметр hInstance:=777; //Итанс который мы убрали из модулей lpszMenuName:=nil; //Парамерт style:=0; //Стили никчему hbrBackground:=5; //Цвет окна белый end; RegisterClassEx(WinClass); //Регистрируем клас в системе {Определяем позиции} top:=100; left:=100; width:= 400; height:= 300; {Создаём компоненты на форме} hw:=CreateWindowEx(0, MyClassName, 'Окно', WS_VISIBLE, left, top, width, height, 0, 0,777, nil); Bu:=CreateWindowEx(0,'Button','Кнопка',WS_VISIBLE or WS_CHILD,5,120,100,25,hw,7,0,nil); lb:=CreateWindowEx(0,'Static', 'Это типо...'+#13#10+'Lable!!1 Но на самом деле статик текст',WS_VISIBLE or WS_CHILD,5,5,230,100,hw,0,0,nil); ed:=CreateWindowEx(0{WS_EX_STATICEDGE},'Edit','Компонент Edit',WS_VISIBLE or WS_CHILD,5,90,185,25,hw,0,0,nil); end; begin CreateMyFofm;//Создали форму {Пример простой петли сообщений} while GetMessage(Msg, 0, 0, 0) do begin TranslateMessage(Msg); DispatchMessage(Msg); end; end. При копмпиляции получаем размер проекта 4096!!! При Упаковке FSG - 1461- байт!!! © Dolphin, codingworld.ru
А Если написать это на Си, по то можно получить форму и 1-2 кб без сжатия. А еще лучше не угукаться с созданием классов и размещением элементов, а взять любой визуальный редактор диалов, навоять там диалог. В итого и кода меньше будет и быстрее делать всё
Не знаю почему такой большой размер. Возможно из System не все вырезано(по DCU видно, наверно менеджер памяти не вырезан), просто на D7 добивался таких же размеров, но там была форма и на ней GIF проигрывался(смайлик из QIP), то есть форма+GIF декопрессор и все где то в полтора килобайта.
Ага, только вы забыли "взвесить" еще 10 метров рантаймовых библиотек. За холивар, святая сила может анально покарать, так что лучше не использовать это слово
2 Redeemer не умничай! Когда пишеш на си и юзаеш тока винапи, то никаких левых либ не юзается, потому что даже CRT не юзается. И по этому, что написал то и будет. А в делфи, даже если на винапи писать, то всё равно он какуюнить хню вкомпилит. И надо хорошо пошаманить чтобы он этого не делал. Это всё к тому, что это статья - не мего открытие. Вообще давным давно была статья как на делфи писать проги размером меньше килобайта. 2 keen6 А так всегда. В реале меряются у кого писька длинее, а у кодеров - у кого прога меньше. А у быдлодельфистов - кто заюзал больше компонентов. А так вообще делфи классный язык, но не для этой целе. Сам знаком с профессиональным разработчиком бизнес приложений. Так то, что он пишет на делфи, хрен напишеш даже на С#
Забыл добавить: Код вообще мего пздц. Неоформлен нефига, видимо его автор по клачкам надергал отовлюду, даже не разбираясь что и как. hInstance:=777; - просто убило. Еслибы человек знал для чего юзается hInstance то онбы такое не писал. Конечно в данном случае всё прокатит и будет норм, но для более сложных прог может настать ****ц
Это чисто ради интереса, а размер действительно великоват если ТС решил на Delphi мелкий EXE с формами написать. Да, пихает много чего, это исправимо.
2 Jingo Bo ага, 777 это он надеется что при поиске ресурсов это ему точно поможет. АГа 666 лучше. В аду много чего есть, авось и ресурсы найдутся тамже)
На ошибку ТСу уже указал slesh. Вы вот издеваетесь, а вы сами в курсе, что есть HINSTANSE? slesh, не подсказывайте =)
hInstance адрес(начальный), по которому программа загружена в память. По данному значеию API функции опредляют из какого модуля грузить ресурс к примеру.
Ответ вполне верный, но это написано на многих сайтах, открыть гугл не составляет труда. Вот скажите лучше, какая структура лежит по этому конкретно адресу?
slesh, С++ тоже классный язык, но, как говорится, "кесарю - кесарево". Если нужно разработать огромное приложение с сотней форм - Дельфи самое то. Ну еще C#. По факту и то и то опирается на свою кучу компонент, только в дельфи они вкомпиливаются в EXE, а в шарме идут отдельно дотнетом. В настоящее время все же ключевое значение имеет не скорость работы программы, а скорость ее разработки. Вы можете неделю писать на чистом API какой-нибудь датагрид, а можете просто кинуть на форму "быдлокомпонент" и получить результат за полчаса. P.S. Сам я себя не считаю тем, кого принято называть "быдлодельфист", и невизуальную часть критичную к скорости выполнения пишу почти всегда на API. Но клепать формы в редакторе диалогов - это выше моих сил.
Хехе, я не знаю какая там лежит структура, но меня это не останавливает использовать hInstance по ее назначению, знать что это такое и отуда берется
Хотите пофлеймить что лучще?) Почитайте вот эту тему...over 4000 флейма http://www.gamedev.ru/flame/forum/?id=11707
А как же IMAGE_DOS_HEADER? А за ней по hInstance + 0x3C лежат IMAGE_NT_HEADERS =) Откуда же оно берется изначально?