Что нового?

Вопрос Среда разработки Delphi

aLLeXUs

Участник
На сколько я знаю, то на данном форуме должно быть много Delphi программистов. И вот у меня есть такой вопрос. Какую среду разработки вы используете? Сам я использую Embercadero RAD Studio XE5. У меня такой вопрос возник потому что получаемые файлы после компиляции получаются большого размера. Вот допустим если я скомпилирую пустой проект в режиме Release, то есть без отладочной информации то exe получается примерно 2 мб, что достаточно много. Подскажите что вы делаете что бы добиться маленького размера исполняемого файла или библиотеки. Ведь я не видел ни программ ни библиотек которые много бы весили при столь незначительном функционале.
 

Mailchik

Старожил
Проверенный
Какую среду разработки вы используете?
Embercadero RAD Studio XE3.
получаемые файлы после компиляции получаются большого размера
VCL. Можно ненамного уменьшить размер исполняемого файла, в интернете есть несколько статей.
что бы добиться маленького размера исполняемого файла или библиотеки
Из того, что я знаю - KOL, либо писать на чистом WinAPI.
 

ReFLeXx

Новичок
Какую среду разработки вы используете?
Embercadero RAD Studio XE4 / Delphi 7.
Подскажите что вы делаете что бы добиться маленького размера исполняемого файла или библиотеки.
Это беда новых Delphi XE. Хочешь писать быстро с хорошим функционалом - приходится чем-то жертвовать. Попробуй Delphi 7, если не нужны фичи новых Delphi XE. Либо писать на WinApi, но тогда смысла оставаться на Delphi не вижу, переходи на C/C++.
 

aLLeXUs

Участник
Либо писать на WinApi
А что это даст? Я создал пустой проект и в uses удалил все кроме Vcl.Forms, но после компиляции файл все равно занимает 2 мб. Не думаю что компонент форм сколько весил бы
Embercadero RAD Studio XE3
а можно узнать, сколько весит exe пустого проекта в режиме release? Думаю может перейти на эту версию
переходи на C/C++
это совсем другой язык, не схожий с delphi, для меня сложный.
VCL. Можно ненамного уменьшить размер исполняемого файла, в интернете есть несколько статей.
не нашел, не понял как сформулировать. Можно пример статьи?
 

ReFLeXx

Новичок
А что это даст? Я создал пустой проект и в uses удалил все кроме Vcl.Forms, но после компиляции файл все равно занимает 2 мб. Не думаю что компонент форм сколько весил бы
Никаких модулей не будет. Будет лишь динамическая линковка майковских dll.
Например:
Код:
function CreateWindowExW(dwExStyle: DWORD; lpClassName: PChar;
  lpWindowName: PChar; dwStyle: DWORD; X, Y, nWidth, nHeight: Integer;
  hWndParent: HWND; hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND;
  stdcall; external 'user32.dll' name 'CreateWindowExW';
Затем используешь функцию для своих нужд.
 

Mailchik

Старожил
Проверенный
а можно узнать, сколько весит exe пустого проекта в режиме release?
2,17 МБ (2 283 008 байт)
не нашел, не понял как сформулировать. Можно пример статьи?
https://www.google.ru/?gws_rd=ssl#newwindow=1&q=delphi xe3 exe size
----
Замена дефолтной иконки Delphi XE3 на свою, весом в 386 байт даёт: 1,89 МБ (1 985 536 байт).
----

Если отключить RTTI
Код:
{$WEAKLINKRTTI ON}
{$RTTI EXPLICIT METHODS([]) FIELDS([]) PROPERTIES([])}
размер exe уменьшится до 1,53 МБ (1 612 288 байт)
----
В конце можно пройтись UPX'ом, что даст 431 КБ (441 856 байт)
А что это даст? Я создал пустой проект и в uses удалил все кроме Vcl.Forms, но после компиляции файл все равно занимает 2 мб. Не думаю что компонент форм сколько весил бы
Скомпильте этот код:
Код:
uses
  Windows,
  Messages;

var
  Msg        : TMSG;
  LWndClass  : TWndClass;
  hMainHandle: HWND;
  hButton    : HWND;
  hStatic    : HWND;
  hEdit      : HWND;
  hFontText  : HWND;
  hFontButton: HWND;

procedure ReleaseResources;
begin
  DestroyWindow(hButton);
  DestroyWindow(hStatic);
  DestroyWindow(hEdit);
  DeleteObject(hFontText);
  DeleteObject(hFontButton);
  PostQuitMessage(0);
end;

function WindowProc(hWnd,Msg:Longint; wParam : WPARAM; lParam: LPARAM):Longint; stdcall;
begin
  case Msg of
      WM_COMMAND: if lParam = hButton then
                    MessageBox(hMainHandle,'You pressed the button Hello', 'Hello',MB_OK or MB_ICONINFORMATION);
      WM_DESTROY: ReleaseResources;
  end;
  Result:=DefWindowProc(hWnd,Msg,wParam,lParam);
end;

begin
  //create the window
  LWndClass.hInstance := hInstance;
  with LWndClass do
    begin
      lpszClassName := 'MyWinApiWnd';
      Style         := CS_PARENTDC or CS_BYTEALIGNCLIENT;
      hIcon         := LoadIcon(hInstance,'MAINICON');
      lpfnWndProc   := @WindowProc;
      hbrBackground := COLOR_BTNFACE+1;
      hCursor       := LoadCursor(0,IDC_ARROW);
    end;

  RegisterClass(LWndClass);
  hMainHandle := CreateWindow(LWndClass.lpszClassName,'Window Title', WS_CAPTION or WS_MINIMIZEBOX or WS_SYSMENU or WS_VISIBLE, (GetSystemMetrics(SM_CXSCREEN) div 2)-190,
      (GetSystemMetrics(SM_CYSCREEN) div 2)-170, 386,200,0,0,hInstance,nil);

  //Create the fonts to use
  hFontText := CreateFont(-14,0,0,0,0,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,VARIABLE_PITCH or FF_SWISS,'Tahoma');
  hFontButton := CreateFont(-14,0,0,0,0,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,VARIABLE_PITCH or FF_SWISS,'Tahoma');

  //create the static
  hStatic:=CreateWindow('Static','This is static text, like a TLabel',WS_VISIBLE or WS_CHILD or SS_LEFT, 10,10,360,44,hMainHandle,0,hInstance,nil);
  SendMessage(hStatic,WM_SETFONT,hFontText,0);

  //create the edit
  hEdit:=CreateWindowEx(WS_EX_CLIENTEDGE,'Edit','This a Edit like and TEdit', WS_VISIBLE or WS_CHILD or ES_LEFT or ES_AUTOHSCROLL,10,35,360,23,hMainHandle,0,hInstance,nil);
  SendMessage(hEdit,WM_SETFONT,hFontText,0);

  //create the button
  hButton:=CreateWindow('Button','Hello', WS_VISIBLE or WS_CHILD or BS_PUSHBUTTON or BS_TEXT, 10,130,100,28,hMainHandle,0,hInstance,nil);
  SendMessage(hButton,WM_SETFONT,hFontButton,0);

  //message loop
  while GetMessage(Msg,0,0,0) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;

end.
 

aLLeXUs

Участник
Mailchik, большое спасибо за наглядный пример. Я создал консольное приложение и заменил код на Ваш, в итоге получил exe размером 30 кб (после пакера 14 кб), чего я даже не ожидал... Только вот консольное окно тоже появилось.
Наверное попробую еще более ранние версии IDE (например RAD Studio 2010) и Delphi 7. Тогда наверное и определюсь окончательно что мне нужно.

Всем спасибо за внимание.
 

shidow

Новичок
Delphi XE по умолчанию пакует все VCL в программу. В Project-Options-Packages убери все что не используешь, если будешь юзать программу только на своем компьютере включи опцию Build With Runtime Packages. В Delphi 7 такого нет, размер ехе намного меньше.
 

ObiVan Cinobi

Мимокрокодил
aLLeXUs, делал как то простой проигрыватель под андроид да ХЕ6, при том что внешние изображения не использовал вообще так размер скомпилированного апк файла был аж 15мб. следует отписать в русскоязычную поддержку программы (адекватная поддержка, да и отвечают быстро) ну или идти на киберфорум где уж точно есть профессиональные программисты нежели здесь
 

ProFrager

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