webForumDet fria alternativet

Filstorlekar

17 svar · 670 visningar · startad av the proclaimer

the proclaimerMedlem sedan aug. 200088 inlägg
#1

Tjenare!

Jag har många gånger funderat över filstorlekarna på Delphiprojekt.
Ju nyare version av delphi desto större blir EXE filerna.
En applikation utan någon som helst funktion tar i Delphi 5 ca 300kB vilket är ganska mycket om man vill publicera sina filer på intenet.
Att lägga till/ta bort poster från uses listan påverkar inte heller storleken särskilt mycket.
(det är väl windows i uses listan som kräver utrymme eller?)
Om man gör an applikation utan TForm (eller en konsollapp.) sjunker storleken till et mera behändigt format.
Men det borde gå att tillverka program med formar, som inte tar extremt stor plats?
Då menar jag med runtimerutinerna inkluderade, och inte som i VB att man behöver en massa extrafiler.
Visst det kan man ju göra i delphi också men det är ju inte många som redan har delphis runtime filer i sin dator
Om man tittar på program som exempelvis Anteckningar, Kalkylatorn och Paint, så är de ju inte alls stora.
Det kanske är så att de använder tilläggsfiler som redan finns i systemet, men varför kan då inte delphi göra det också?

Någon som vet något som kan vara till hjälp?

------------------
/Per Skoglund

MuzzafarathMedlem sedan apr. 20002 487 inlägg
#2

Så går det när man använder RAD verktyg.

the proclaimerMedlem sedan aug. 200088 inlägg
#3

ligger något i det, men RAD gör det hela så mycket enklare...

jtMedlem sedan juni 2000350 inlägg
#4

Detta har inte mycket att göra med om man anväder ett Rad verktyg eller inte. Vill du skriva ett litet program får du använda windows API och inte TForm odyl.

Nedastående kod genererar ett windows program med lite kontroller på. Exe storleken blir 42 kb.

Vill du testa kopiera koden och döp filen till xx.dpr öppna filen i delphi och kompilera.

Program xx ;

Uses Windows, Messages, CommCtrl;
{$R *.RES}

Var WinClass: TWndClassA;
Inst: HINST;
hWindow: HWND;
TheMessage: TMsg;
Label1: HWND;
OldFont: HFONT;
Image1: HWND;
hImage1: HBITMAP;
Edit1: HWND;
Memo1: HWND;
Button1: HWND;
CheckBox1: HWND;
GroupBox1: HWND;
RadioButton1: HWND;
RadioButton2: HWND;
RadioButton3: HWND;
CheckBox2: HWND;
ListBox1: HWND;
ComboBox1: HWND;
CheckBox3: HWND;
CheckBox4: HWND;
BitBtn1: HWND;
hBitBtn1: HBITMAP;
TrackBar1: HWND;
StatusBar1: HWND;
ProgressBar1: HWND;
PaintStruct: TPaintStruct;
PaintDC: HDC;
OldPoint: PPoint;
OldPen: HPEN;
Pen1: HPEN;
Pen2: HPEN;
Pen3: HPEN;
OldBrush: HBRUSH;
Brush1: HBRUSH;
hFont1: HFONT;
hFont2: HFONT;

{ Custom WindowProc function }
function WindowProc(hWindow: HWnd; Message,wParam,lParam: Integer): Integer; stdcall;
begin
Result := 0;
{ Checks for messages }
case Message of
WM_CREATE: begin
{ Load Image }
hImage1 := LoadBitmap(Inst,PChar('BMP_Image1'));
{ Load Image }
hBitBtn1 := LoadBitmap(Inst,PChar('BMP_BitBtn1'));
InitCommonControls;
{ Create Pens }
Pen1 := CreatePen(PS_INSIDEFRAME,1,RGB(128,128,128));
Pen2 := CreatePen(PS_INSIDEFRAME,1,RGB(255,255,255));
Pen3 := CreatePen(PS_INSIDEFRAME,3,RGB(0,0,128));
{ Create Brushes }
Brush1 := CreateSolidBrush(RGB(255,255,0));
end;
WM_COMMAND: begin
if HWND(lParam) = Button1 then MessageBox(hWindow,'Button1Click','Check',MB_OK);
if HWND(lParam) = CheckBox1 then MessageBox(hWindow,'CheckBox1Click','Check',MB_OK);
if HWND(lParam) = CheckBox2 then MessageBox(hWindow,'CheckBox2Click','Check',MB_OK);
if HWND(lParam) = CheckBox3 then MessageBox(hWindow,'CheckBox3Click','Check',MB_OK);
if HWND(lParam) = CheckBox4 then MessageBox(hWindow,'CheckBox4Click','Check',MB_OK);
if HWND(lParam) = BitBtn1 then MessageBox(hWindow,'BitBtn1Click','Check',MB_OK);
exit;
end;
WM_SIZE: begin
SendMessage(StatusBar1,WM_SIZE,wParam,lParam);
end;
WM_PAINT: begin
PaintDC := BeginPaint(hWindow,PaintStruct);
{ Paint Colors text: Label2 }
OldFont := SelectObject(PaintDC,hFont1);
SetTextColor(PaintDC,RGB(0,0,128));
SetBkColor(PaintDC,GetSysColor(COLOR_BTNFACE));
TextOut(PaintDC,24,24,Pchar('Label2'),6);
SelectObject(PaintDC,OldFont);
{ Paint Colors text: Label3 }
OldFont := SelectObject(PaintDC,hFont2);
SetTextColor(PaintDC,RGB(0,128,0));
SetBkColor(PaintDC,GetSysColor(COLOR_BTNFACE));
TextOut(PaintDC,24,48,Pchar('Label3'),6);
SelectObject(PaintDC,OldFont);
{ Create bevel: Bevel1 }
OldPen := SelectObject(PaintDC,Pen1);
MoveToEx(PaintDC,328,168,OldPoint);
LineTo(PaintDC,465,168); LineTo(PaintDC,465,249); LineTo(PaintDC,328,249); LineTo(PaintDC,328,168);
OldPen := SelectObject(PaintDC,Pen2);
MoveToEx(PaintDC,329,169,OldPoint);
LineTo(PaintDC,466,169); LineTo(PaintDC,466,250); LineTo(PaintDC,329,250); LineTo(PaintDC,329,169);
{ Create shape: Shape1 }
OldBrush := SelectObject(PaintDC,Brush1);
OldPen := SelectObject(PaintDC,Pen3);
Rectangle(PaintDC,176,232,241,297);
EndPaint(hWindow,PaintStruct);
end;
WM_DESTROY: begin
DeleteObject(hImage1);
DeleteObject(hBitBtn1);
{ Delete Pens and Brushes }
DeleteObject(Pen1);
DeleteObject(Pen2);
DeleteObject(Pen3);
DeleteObject(Brush1);
{ Delete Fonts }
DeleteObject(hFont1);
DeleteObject(hFont2);
PostQuitMessage(0);
Exit;
end;
else
Result := DefWindowProc(hWindow, Message, wParam, lParam);
end;
end;

begin
{ Register Custom WndClass }
Inst := hInstance;
with WinClass do
begin
style := CS_CLASSDC or CS_PARENTDC;
lpfnWndProc := @WindowProc;
hInstance := Inst;
hbrBackground := color_btnface + 1;
lpszClassname := 'MyWindowClass';
hIcon := LoadIcon(0, IDI_APPLICATION);
hCursor := LoadCursor(0, IDC_ARROW);
end; { with }

RegisterClass(WinClass);

{ Create Main Window }
hWindow := CreateWindowEx(WS_EX_WINDOWEDGE, 'MyWindowClass','Form1',
WS_OVERLAPPEDWINDOW or WS_VISIBLE,
190,128,545,426,0, 0, Inst, nil);

{ Create a label (static) ========================================= }
Label1:= Createwindow('Static','Label1', WS_VISIBLE or WS_CHILD or SS_LEFT,
24,8,32,13, hWindow, 0, Inst, nil);

{ Create a static image =========================================== }
Image1:= CreateWindow('Static','', WS_VISIBLE or WS_CHILD or SS_BITMAP,
32,248,49,41, hWindow, 0, Inst, nil);
{ set image to static control }
SendMessage(Image1,STM_SETIMAGE,IMAGE_BITMAP,LParam(hImage1));

{ Create an edit field ============================================ }
Edit1:= CreateWindowEx(WS_EX_CLIENTEDGE, 'Edit','Edit1', WS_CHILD or WS_VISIBLE or WS_BORDER or WS_TABSTOP,
96,8,121,21, hWindow, 0, Inst, nil);

{ Create a memo =================================================== }
Memo1:= CreateWindowEx(WS_EX_CLIENTEDGE, 'Edit','', WS_CHILD or WS_VISIBLE or WS_BORDER or
ES_LEFT or ES_MULTILINE or ES_WANTRETURN or ES_AUTOVSCROLL or WS_VSCROLL,
96,40,185,89, hWindow, 0, Inst, nil);
{ add lines to memo }
SendMessage(Memo1,WM_SETTEXT, 0, lParam(pChar('Memo1')));

{ Create a button ================================================= }
Button1:= CreateWindow('Button','Button1',WS_VISIBLE or WS_CHILD or BS_PUSHLIKE or BS_TEXT or WS_TABSTOP,
304,16,75,25, hWindow, 0, Inst, nil);

{ Create a checkbox =============================================== }
CheckBox1:= CreateWindow('Button','CheckBox1',WS_VISIBLE or WS_CHILD or BS_AUTOCHECKBOX or WS_TABSTOP,
304,48,97,17, hWindow, 0, Inst, nil);

{ Create a groupbox =============================================== }
GroupBox1:= CreateWindow('Button','GroupBox1',WS_VISIBLE or WS_CHILD or BS_GROUPBOX,
328,72,121,89, hWindow, 0, Inst, nil);

{ Create a radiobox =============================================== }
RadioButton1:= CreateWindow('Button','RadioButton1',WS_VISIBLE or WS_CHILD or BS_AUTORADIOBUTTON or WS_TABSTOP,
344,88,113,17, hWindow, 0, Inst, nil);

{ Create a radiobox =============================================== }
RadioButton2:= CreateWindow('Button','RadioButton2',WS_VISIBLE or WS_CHILD or BS_AUTORADIOBUTTON or WS_TABSTOP,
344,112,113,17, hWindow, 0, Inst, nil);

{ Create a radiobox =============================================== }
RadioButton3:= CreateWindow('Button','RadioButton3',WS_VISIBLE or WS_CHILD or BS_AUTORADIOBUTTON or WS_TABSTOP,
344,136,113,17, hWindow, 0, Inst, nil);

{ Create a checkbox =============================================== }
CheckBox2:= CreateWindow('Button','CheckBox2',WS_VISIBLE or WS_CHILD or BS_AUTOCHECKBOX or WS_TABSTOP,
392,48,97,17, hWindow, 0, Inst, nil);

{ Create a listbox ================================================ }
ListBox1:= CreateWindow('listbox', 'listbox' ,WS_VISIBLE or WS_CHILD or LBS_STANDARD or WS_TABSTOP,
32,144,121,97, hWindow, 0, Inst, nil);
{ add items to listbox }
SendMessage(ListBox1,LB_ADDSTRING , 0 ,LParam(PChar('aaaa1')) );
SendMessage(ListBox1,LB_ADDSTRING , 0 ,LParam(PChar('aaaa2')) );
SendMessage(ListBox1,LB_ADDSTRING , 0 ,LParam(PChar('aaaa3')) );

{ Create a combobox =============================================== }
ComboBox1:= CreateWindow('combobox','ComboBox1',WS_VISIBLE or WS_CHILD or CBS_DROPDOWNLIST or WS_TABSTOP,
168,152,137,189, hWindow, 0, Inst, nil);
{ add items to combobox }
SendMessage(ComboBox1,CB_ADDSTRING , 0 ,LParam(PChar('kkkkk1')) );
SendMessage(ComboBox1,CB_ADDSTRING , 0 ,LParam(PChar('kkkkk2')) );
SendMessage(ComboBox1,CB_ADDSTRING , 0 ,LParam(PChar('kkkk3')) );
SendMessage(ComboBox1,CB_ADDSTRING , 0 ,LParam(PChar('kkkkk4')) );
SendMessage(ComboBox1,CB_ADDSTRING , 0 ,LParam(PChar('kkkkk5')) );
{ select current item }
SendMessage(ComboBox1,CB_SELECTSTRING,0,LParam(PChar('kkkkk1')) );

{ Create a checkbox =============================================== }
CheckBox3:= CreateWindow('Button','CheckBox3',WS_VISIBLE or WS_CHILD or BS_AUTOCHECKBOX or WS_TABSTOP,
344,184,97,17, hWindow, 0, Inst, nil);

{ Create a checkbox =============================================== }
CheckBox4:= CreateWindow('Button','CheckBox4',WS_VISIBLE or WS_CHILD or BS_AUTOCHECKBOX or WS_TABSTOP,
344,208,97,17, hWindow, 0, Inst, nil);

{ Create a bit button ============================================= }
BitBtn1:= CreateWindow('Button','', WS_VISIBLE or WS_CHILD or WS_TABSTOP or BS_BITMAP,
176,184,75,25, hWindow, 0, Inst, nil);
{ set image to button }
SendMessage(BitBtn1,BM_SETIMAGE,IMAGE_BITMAP,LParam(hBitBtn1));

{ Create a trackbar =============================================== }
TrackBar1:= CreateWindow('msctls_trackbar32','trackbar',WS_VISIBLE or WS_CHILD or WS_BORDER,
304,264,150,41, hWindow, 0, Inst, nil);
SendMessage(TrackBar1,TBM_SETRANGE,1,MakeLong( 0,10));
SendMessage(TrackBar1,TBM_SETPOS,1,3);

{ Create a statusbar ============================================== }
StatusBar1:= CreateStatusWindow(WS_VISIBLE or WS_CHILD ,''
, hWindow, 0);

{ Create a progressbar ============================================ }
ProgressBar1:= CreateWindow('msctls_progress32','progressbar',WS_VISIBLE or WS_CHILD or WS_BORDER,
48,320,150,18, hWindow, 0, Inst, nil);
SendMessage(ProgressBar1,PBM_SETRANGE,0,MakeLong(0,100));
SendMessage(ProgressBar1,PBM_SETPOS,50,0) ;

{ Create Font Handle =================================================== }
hFont1 := CreateFont(-13,0,0,0,700,0,0,0,DEFAULT_CHARSET,0,0,0,0,'MS Sans Serif');
hFont2 := CreateFont(-13,0,0,0,700,1,0,0,DEFAULT_CHARSET,0,0,0,0,'MS Sans Serif');

{ Change fonts ============================================== }
if hFont1 <> 0 then SendMessage(Memo1,WM_SETFONT,hFont1,0);

SetFocus(Edit1);

UpdateWindow(hWindow);

{the standard message loop}
while GetMessage(TheMessage,0,0,0) do begin
if not IsDialogMessage(hWindow,TheMessage) then begin
TranslateMessage(TheMessage);
DispatchMessage(TheMessage);
end;
end;
end.

the proclaimerMedlem sedan aug. 200088 inlägg
#5

TACKAR!

the proclaimerMedlem sedan aug. 200088 inlägg
#6

Funkar perfekt!

Finns det möjligtvis något program som generar API koden så att man själv slipper sitta och räkna på koordinater?

jtMedlem sedan juni 2000350 inlägg
#7

Här hittar du ett program som kanske kan hjälpa dig. Exemplet genererades av detta program. www.chat.ru/~ivs_d

Kolla även här om du är intresserad av att skapa små program. http://members.xoom.com/mr_bonanzas/xcl/
Xcl ersätter vcl och gör att dina program blir mycket mindre. Du hittar även lite info om vad du bör tänka på.

Alpha IIMedlem sedan maj 20002 993 inlägg
#8

Bra länkar jt! Den ena funkade inte och på den andra sidan kunde man ju inte ladda ner nånting!

------------------
Alpha II

[Ahhhaaa]

jtMedlem sedan juni 2000350 inlägg
#9

Det var den länken som följde med Readme filen till programmet dfm2dpr. Jag kommer inte ihåg var jag hämtade detta.
Finns kanske på http://www.torry.ru/.

Länken funkade tidigare idag. http://members.xoom.com/mr_bonanzas/xcl/

Denna kanske funkar bättre http://mercury.spaceports.com/~bonanzas/xcl_main_info.htm

svampträskMedlem sedan juni 200070 inlägg
#10

men finns det inget sätt att få ner storleken på sina program utan att använda API formar?

jag menar Delphi 5 program blir ju ohanterbart stora!

WiNNeMedlem sedan maj 2000192 inlägg
#11

Du kan få ner storleken lite genom att slå på "optimization" och slå av "debug information" i Projekt Options, Compiler fliken.

------------------
winne.net

jtMedlem sedan juni 2000350 inlägg
#12

Om du tycker delphi program blir ohanterbart stora vilka utvecklings miljöer/kompilatorer jämför du med då?

svampträskMedlem sedan juni 200070 inlägg
#13

Jag tänker bl.a. på alla program som följer med windows.

Är det skrivna i C kanske?

------------------
- - - - - - - - - - - -
//N99ASP

MuzzafarathMedlem sedan apr. 20002 487 inlägg
#14

Japp, skulle tro att det flesta program som följer med Windows är skrivna i C/C++.

svampträskMedlem sedan juni 200070 inlägg
#15

om nu c++ kan generera små program, varför skulle då inte delphi klara av det?

eller använder de någon slags runtime fil?

------------------
//N99ASP

MuzzafarathMedlem sedan apr. 20002 487 inlägg
#16

Som JT visade, _kan_ Delphi generera små program, om man nu inte använder "rad verktygen" i det. I C++ kan man inte bara "rita upp" knappar och dylikt, allt måste göras med kod. Om man nu ritar upp knappar och sånt lägger förmodligen Delphi med en massa extra kod när du kompilerar, vilket gör dina program stora.

SweyMedlem sedan apr. 20003 971 inlägg
#17

C++ Builder som är C++-varianten av Delphi genererar lika stora filer som Delphi gör OM man använder RAD-verktygen.

------------------
- Swey
Bäst, vackrast, styggast...

jtMedlem sedan juni 2000350 inlägg
#18

Visual C++ från microsoft genererar ochså stor program. Om man levererar dessa som en exe utan dll'er.

Det som gör detta är klassbiblioteken i delphis fall Vcl'en.

"I C++ kan man inte bara "rita upp" knappar och dylikt,allt måste göras med kod."

Kan man inte i Object pascal heller, finns inget som hindrar att använda notepad för att skriva delphi program och sedan kompilera dessa.

Man måste skilja på verktyg och språk.
C++ Builder ser nästan exakt ut som delphi, och använder samma vcl(skriven i delphi ;-).

142 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)