Создаём форму весом 1,5 кб!

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by CraftR14, 26 Aug 2010.

Thread Status:
Not open for further replies.
  1. CraftR14

    CraftR14 New Member

    Joined:
    23 May 2010
    Messages:
    10
    Likes Received:
    3
    Reputations:
    0
    Чтобы создать форму таких маленьких размеров потребуется использование апи, а также создать экземпляр класса формы.

    На форме средствами апи можно создать такие компоненты как 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
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    А Если написать это на Си, по то можно получить форму и 1-2 кб без сжатия.
    А еще лучше не угукаться с созданием классов и размещением элементов, а взять любой визуальный редактор диалов, навоять там диалог. В итого и кода меньше будет и быстрее делать всё
     
  3. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Не знаю почему такой большой размер. Возможно из System не все вырезано(по DCU видно, наверно менеджер памяти не вырезан), просто на D7 добивался таких же размеров, но там была форма и на ней GIF проигрывался(смайлик из QIP), то есть форма+GIF декопрессор и все где то в полтора килобайта.
     
  4. keen6

    keen6 New Member

    Joined:
    7 Apr 2010
    Messages:
    46
    Likes Received:
    4
    Reputations:
    0
    Охренеть, какой большой... В чем прикол, расскажите. :) Это такой спорт, у кого меньше сайз?
     
  5. Redeemer

    Redeemer Member

    Joined:
    3 Jul 2010
    Messages:
    203
    Likes Received:
    24
    Reputations:
    1
    Ага, только вы забыли "взвесить" еще 10 метров рантаймовых библиотек.

    За холивар, святая сила может анально покарать, так что лучше не использовать это слово
     
    #5 Redeemer, 26 Aug 2010
    Last edited by a moderator: 26 Aug 2010
  6. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 Redeemer не умничай!

    Когда пишеш на си и юзаеш тока винапи, то никаких левых либ не юзается, потому что даже CRT не юзается. И по этому, что написал то и будет.
    А в делфи, даже если на винапи писать, то всё равно он какуюнить хню вкомпилит. И надо хорошо пошаманить чтобы он этого не делал.

    Это всё к тому, что это статья - не мего открытие. Вообще давным давно была статья как на делфи писать проги размером меньше килобайта.

    2 keen6 А так всегда. В реале меряются у кого писька длинее, а у кодеров - у кого прога меньше. А у быдлодельфистов - кто заюзал больше компонентов.

    А так вообще делфи классный язык, но не для этой целе. Сам знаком с профессиональным разработчиком бизнес приложений. Так то, что он пишет на делфи, хрен напишеш даже на С#
     
    #6 slesh, 26 Aug 2010
    Last edited: 26 Aug 2010
  7. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Забыл добавить: Код вообще мего пздц. Неоформлен нефига, видимо его автор по клачкам надергал отовлюду, даже не разбираясь что и как.
    hInstance:=777; - просто убило. Еслибы человек знал для чего юзается hInstance то онбы такое не писал. Конечно в данном случае всё прокатит и будет норм, но для более сложных прог может настать ****ц
     
  8. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Это чисто ради интереса, а размер действительно великоват если ТС решил на Delphi мелкий EXE с формами написать.
    Да, пихает много чего, это исправимо.
     
  9. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Класс!!! xD
    Почему бы не 666, запуск под адским загрузчиком.
     
    1 person likes this.
  10. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 Jingo Bo ага, 777 это он надеется что при поиске ресурсов это ему точно поможет.
    АГа 666 лучше. В аду много чего есть, авось и ресурсы найдутся тамже)
     
  11. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    На ошибку ТСу уже указал slesh. Вы вот издеваетесь, а вы сами в курсе, что есть HINSTANSE?
    slesh, не подсказывайте =)
     
  12. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    hInstance адрес(начальный), по которому программа загружена в память. По данному значеию API функции опредляют из какого модуля грузить ресурс к примеру.
     
  13. Redeemer

    Redeemer Member

    Joined:
    3 Jul 2010
    Messages:
    203
    Likes Received:
    24
    Reputations:
    1
    Адрес экземпляра модуля.

    Джинго опередил:)
     
  14. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Ответ вполне верный, но это написано на многих сайтах, открыть гугл не составляет труда. Вот скажите лучше, какая структура лежит по этому конкретно адресу?
     
  15. Redeemer

    Redeemer Member

    Joined:
    3 Jul 2010
    Messages:
    203
    Likes Received:
    24
    Reputations:
    1
    slesh, С++ тоже классный язык, но, как говорится, "кесарю - кесарево".
    Если нужно разработать огромное приложение с сотней форм - Дельфи самое то. Ну еще C#. По факту и то и то опирается на свою кучу компонент, только в дельфи они вкомпиливаются в EXE, а в шарме идут отдельно дотнетом.

    В настоящее время все же ключевое значение имеет не скорость работы программы, а скорость ее разработки. Вы можете неделю писать на чистом API какой-нибудь датагрид, а можете просто кинуть на форму "быдлокомпонент" и получить результат за полчаса.

    P.S. Сам я себя не считаю тем, кого принято называть "быдлодельфист", и невизуальную часть критичную к скорости выполнения пишу почти всегда на API. Но клепать формы в редакторе диалогов - это выше моих сил.
     
  16. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Хехе, я не знаю какая там лежит структура, но меня это не останавливает использовать hInstance по ее назначению, знать что это такое и отуда берется:)
     
  17. Redeemer

    Redeemer Member

    Joined:
    3 Jul 2010
    Messages:
    203
    Likes Received:
    24
    Reputations:
    1
    GRRRL Power, по этому адресу нет никакой структуры, там лежит проекция PE
     
  18. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Хотите пофлеймить что лучще?) Почитайте вот эту тему...over 4000 флейма
    http://www.gamedev.ru/flame/forum/?id=11707
     
  19. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    А как же IMAGE_DOS_HEADER? А за ней по hInstance + 0x3C лежат IMAGE_NT_HEADERS =)

    Откуда же оно берется изначально?
     
  20. Redeemer

    Redeemer Member

    Joined:
    3 Jul 2010
    Messages:
    203
    Likes Received:
    24
    Reputations:
    1
    Не хочу абсолютно. Я вообще считаю что лучше не спорить, а обмениваться опытом и знаниями.
     
Thread Status:
Not open for further replies.