He leído varios artículos sobre la comparación de VC y Delphi, y también estoy interesado en escribir código para probarlo. El código es el siguiente:
#Include <Windows.h>
Hwnd hwndbutton;
int cx, cy;
LRESULT Callback MainwndProc (HWND HWINDOW, UINT NMSG, WPARAM WPRM, LPARAM LPRM)
{
HDC DC;
Pintura Eststrucción PS;
Rect rc;
Switch (NMSG)
{
Caso wm_create:
{
Textetric tm;
dc = getDC (hwindow);
SelectObject (DC, getStockObject (system_fixed_font));
GetTextMetrics (DC, & TM);
cx = tm.tmavecharWidth * 30;
cy = (tm.tmheight + tm.tmexternallading) * 2;
LibereC (Hwindow, DC);
hwndButton = createwindow (
"botón",
"Haga clic aquí",
WS_CHILD |
0, 0, CX, CY,
Hwindow,
(Hmenu) 1,
((LpCreateStruct) LPRM)-> Hinstance,
NULO
);
regresar 0;
romper;
}
Caso WM_DestrOY:
{
PostQuitMessage (0);
regresar 0;
romper;
}
Caso WM_Paint:
{
dc = beginPaint (hwindow, & ps);
GetClientRect (hwindow, & rc);
rc.bottom = rc.bottom / 2;
DrawText (DC, "¡Hola, mundo!", -1, y rc,
Dt_singline |
EndPaint (Hwindow, & PS);
regresar 0;
romper;
}
Caso Wm_Size:
{
if (hwndbutton && (wprm == sizefullScreen || wprm == Sizenormal)))
{
rc.left = (Loword (LPRM) - CX) / 2;
rc.top = HiWord (LPRM) * 3/4 - CY / 2;
MoveWindow (hwndButton, rc.left, rc.top, cx, cy, true);
}
regresar 0;
romper;
}
Caso WM_COMMAND:
{
if (Loword (WPRM) == 1 && HiWord (wprm) == bn_clicked &&
(Hwnd) LPRM == HWNDBUTTON)
{
DestroyWindow (Hwindow);
}
regresar 0;
romper;
}
}
return defwindowproc (hwindow, nmsg, wprm, lprm);
}
// Winmain
int __stdcall WinMain (Hinstance Hinst, Hinstance HPrev, LPSTR LPCMD, int nshow)
{
Hwnd hwindowmain;
Msg mymsg;
Wndclassex wcex;
wcex.cbsize = sizeof (wndclassex);
WCEX.Style = CS_HREDRAW |
wcex.lpfnwndproc = (wndproc) mainwndproc;
WCEX.CBCLSEXTRA = 0;
wcex.cbwndextra = 0;
wcex.hinstance = hinst;
wcex.hicon = loadicon (nulo, idi_application);
wcex.hcursor = loadCursor (nulo, idc_arrow);
wcex.hbrbackground = (Hbrush) (color_window+1);
WCEX.LPSZCLASSNAME = "WINTESTWIN";
wcex.hiconsm = loadicon (nulo, idi_application);
RegisterClassex (& WCEX);
hwindowmain = createwindow (
"Wintestwin",
"Hola",
Ws_overlappedWindow,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
0,
0,
Hinst,
NULO
);
Showwindow (hwindowmain, nshow);
UpdateWindow (hwindowmain);
Mientras (getMessage (& mymsg, 0, 0, 0))
{
TranslateMessage (y mymsg);
DispatchMessage (y mymsg);
}
return mymsg.wparam;
}
Seleccione la versión para compilar, active la optimización mínima del código de VC6 y el código de ejecución generado por la compilación es de 36.0kb.
Luego tradúdelo al código Delphi de la siguiente manera:
Programa Wintest;
usos
Windows, mensajes;
varilla
hwndButton: hwnd;
CX, CY: entero;
función mainwndproc (hwindow: hwnd; nmsg: uint; wprm: wparam; lprm: lParam): lResult; stdcall;
varilla
DC: HDC;
PD: Pintestructs;
RC: Trect;
TM: TextMetric;
PCTST: pCreatestruct;
Comenzar
Caso NMSG de
Wm_create:
Comenzar
dc: = getDC (hwindow);
SelectObject (DC, getStockObject (system_fixed_font));
GetTextMetrics (DC, TM);
cx: = tm.tmavecharWidth * 30;
cy: = (tm.tmheight + tm.tmexternallading) * 2;
LibereC (Hwindow, DC);
PCTST: = PCreateStruct (LPRM);
hwndButton: = createwindow (
'botón',
'Haga clic aquí',
Ws_child o ws_visible o bs_pushbutton,
0, 0, CX, CY,
Hwindow,
Hmenu (1),
pctst^.hinstance,
nulo
);
Resultados: = 0;
Salida;
fin;
Wm_destroy:
Comenzar
PostQuitMessage (0);
Resultados: = 0;
Salida;
fin;
WM_Paint:
Comenzar
dc: = beginPaint (hwindow, ps);
GetClientRect (hwindow, rc);
rc.bottom: = redonde (rc.bottom / 2);
DrawText (DC, '¡Hola, mundo!', -1, RC,
Dt_singleline o dt_center o dt_vcenter);
Pintura final (hwindow, ps);
Resultados: = 0;
Salida;
fin;
WM_SIZE:
Comenzar
if (hwndButton <> 0) y (wprm = sizefullscreen) o (wprm = sizenormal) entonces
Comenzar
rc.left: = Round ((Loword (LPRM) - Cx) / 2);
rc.top: = redonde (HIWORD (LPRM) * 3/4 - CY / 2);
MoveWindow (hwndButton, rc.left, rc.top, cx, cy, true);
fin;
Resultados: = 0;
Salida;
fin;
WM_COMMAND:
Comenzar
if (Loword (WPRM) = 1) y (HIWORD (WPRM) = bn_clicked) y
(Hwnd (LPRM) = hwndButton) Entonces
Comenzar
DestroyWindow (Hwindow);
fin;
Resultados: = 0;
Salida;
fin;
fin;
Resultado: = defwindowproc (hwindow, nmsg, wprm, lprm);
fin;
// Winmain
varilla
hwindowmain: hwnd;
Mymsg: msg;
WCEX: WndClassex;
Comenzar
wcex.cbsize: = sizeof (wndclassex);
wcex.style: = cs_hredraw o cs_vredraw;
wcex.lpfnwndproc: = @mainwndproc;
WCEX.CBCLSEXTRA: = 0;
WCEX.CBWNDEXTRA: = 0;
wcex.hinstance: = mainInstance;
wcex.hicon: = loadiCon (0, IDI_Application);
WCEX.HCURSOR: = LoadCursor (0, IDC_ARROW);
wcex.hbrbackground: = hbrush (color_window+1);
wcex.lpszClassName: = 'wintestwin';
WCEX.hiconsm: = LoadiCon (0, Idi_application);
RegisterClassex (WCEX);
hwindowmain: = createwindow (
'Wintestwin',
'Hola',
Ws_overlappedWindow,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
0,
0,
MainInstance,
nulo
);
Showwindow (hwindowmain, cmdshow);
UpdateWindow (hwindowmain);
mientras getMessage (mymsg, 0, 0, 0) = verdadero do
Comenzar
TranslateMessage (mymsg);
DispatchMessage (mymsg);
fin;
fin.
Finalmente, se descubrió que el código generado por Delphi era de solo 16.5k, que era más de la mitad más pequeño que VC. Esto muestra que Delphi tiene un buen compilador, y la función de visualización de VCL debería ser una buena herramienta de desarrollo. En mi opinión, Delphi no tiene ningún problema en el desarrollo de sistemas grandes, y su rendimiento puede incluso superar VC. . Delphi tampoco puede usar VCL para escribir programas.