Я прочитал несколько статей о сравнении VC и Delphi, и я также заинтересован в написании кода, чтобы попробовать его. Код заключается в следующем:
#include <windows.h>
Hwnd hwndbutton;
int cx, cy;
LRESULT обратный вызов MainWndProc (Hwnd Hwindow, Uint NMSG, WPARAM WPRM, LPARAM LPRM)
{
HDC DC;
Ряд PS;
Прямо RC;
Переключатель (NMSG)
{
case wm_create:
{
TextMetric TM;
DC = getDC (hwindow);
SelectObject (DC, getStockObject (System_fixed_font));
GetTextMetrics (DC, & TM);
cx = tm.tmavecharwidth * 30;
cy = (tm.tmheight + tm.tmexternaleading) * 2;
Выпущенные (Hwindow, DC);
hwndbutton = createwindow (
"кнопка",
"Кликните сюда",
Ws_child |.
0, 0, CX, CY,
hwindow,
(Hmenu) 1,
((Lpcreatestruct) lprm)-> hinstance,
НУЛЕВОЙ
);
возврат 0;
перерыв;
}
case wm_destroy:
{
PostQuitMessage (0);
возврат 0;
перерыв;
}
case wm_paint:
{
DC = startPaint (hwindow, & ps);
GetClientRect (hwindow, & rc);
rc.bottom = rc.bottom / 2;
DrawText (DC, "Привет, мир!", -1, & rc,
Dt_singleline |.
Endpaint (hwindow, & ps);
возврат 0;
перерыв;
}
case 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);
}
возврат 0;
перерыв;
}
case wm_command:
{
if (loword (wprm) == 1 && hiword (wprm) == bn_clicked &&
(Hwnd) lprm == hwndbutton)
{
DissultWindow (hwindow);
}
возврат 0;
перерыв;
}
}
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 (null, idi_application);
wcex.hcursor = loadcursor (null, idc_arrow);
wcex.hbrbackground = (hbrush) (color_window+1);
wcex.lpszclassname = "wintestwin";
wcex.hiconsm = loadicon (null, idi_application);
RegisterClassex (& wcex);
hwindowmain = createwindow (
"Винтвтвин",
"Привет",
Ws_overladwindow,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
0,
0,
Хинст,
НУЛЕВОЙ
);
ShowWindow (HWINDOWMAIN, NSHOW);
UpdateWindow (hwindowmain);
While (getmessage (& mymsg, 0, 0, 0))
{
TranslateMessage (& mymsg);
DispatchMessage (& MyMSG);
}
вернуть mymsg.wparam;
}
Выберите «Выпуск». Чтобы скомпилировать, включите минимальную оптимизацию кода VC6, а код выполнения, сгенерированный компиляцией, составляет 36,0 КБ.
Затем переведите его в код Delphi следующим образом:
программа Wintest;
Использование
Windows, сообщения;
вар
hwndbutton: hwnd;
CX, Cy: целое число;
функция mainwndproc (hwindow: hwnd; nmsg: uint; wprm: wparam; lprm: lparam): lresult; stdcall;
вар
DC: HDC;
PS: Paintruct;
RC: TRECT;
TM: TextMetric;
PCTST: PCREATESTRUCT;
Начинать
Case nmsg of
Wm_create:
Начинать
DC: = getDC (hwindow);
SelectObject (DC, getStockObject (System_fixed_font));
GetTextMetrics (DC, TM);
cx: = tm.tmavecharwidth * 30;
cy: = (tm.tmheight + tm.tmexternaleading) * 2;
Выпущенные (Hwindow, DC);
pctst: = pcreatestruct (lprm);
hwndbutton: = createwindow (
'кнопка',
'Кликните сюда',
Ws_child или ws_visible или bs_pushbutton,
0, 0, CX, CY,
hwindow,
Hmenu (1),
pctst^.hinstance,
ноль
);
Результаты: = 0;
Выход;
конец;
Wm_destroy:
Начинать
PostQuitMessage (0);
Результаты: = 0;
Выход;
конец;
Wm_paint:
Начинать
DC: = startpaint (hwindow, ps);
GetClientRect (HWINDOW, RC);
RC.Bottom: = Round (RC.Bottom / 2);
DrawText (DC, «Привет, мир!», -1, RC,
Dt_singleline или dt_center или dt_vcenter);
Endpaint (hwindow, ps);
Результаты: = 0;
Выход;
конец;
Wm_size:
Начинать
if (hwndbutton <> 0) и (wprm = sizefullscreen) или (wprm = sizenormal), тогда
Начинать
rc.left: = Round ((Loword (LPRM) - CX) / 2);
rc.top: = Round (Hiword (LPRM) * 3/4 - CY / 2);
MoveWindow (Hwndbutton, Rc.left, RC.Top, CX, CY, True);
конец;
Результаты: = 0;
Выход;
конец;
Wm_command:
Начинать
if (loword (wprm) = 1) и (Hiword (wprm) = bn_clicked) и
(Hwnd (lprm) = hwndbutton) тогда
Начинать
DissultWindow (hwindow);
конец;
Результаты: = 0;
Выход;
конец;
конец;
Результат: = defWindowProc (HWINDOW, NMSG, WPRM, LPRM);
конец;
// Winmain
вар
hwindowmain: hwnd;
MyMSG: MSG;
WCEX: wndclassex;
Начинать
wcex.cbsize: = sizeof (wndclassex);
wcex.style: = cs_hredraw или 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',
'Привет',
Ws_overladwindow,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
0,
0,
Горнично,
ноль
);
ShowWindow (HWINDOWMAIN, CMDSHOW);
UpdateWindow (hwindowmain);
в то время как getMessage (mymsg, 0, 0, 0) = true do
Начинать
TranslateMessage (mymsg);
DispatchMessage (mymsg);
конец;
конец.
Наконец, было обнаружено, что код, сгенерированный Delphi, составил всего 16,5 тыс., Который был более чем наполовину меньше, чем VC. Это показывает, что Delphi имеет хороший компилятор, а функция визуализации VCL должна быть хорошим инструментом разработки. На мой взгляд, Delphi не имеет проблем в разработке больших систем, и его производительность может даже превышать VC, просто высокий уровень упаковки VCL делает программы, которые используют VCL, обычно большие, но эффективность разработки не сопоставима. Полем Delphi также не может использовать VCL для написания программ.