لقد قرأت العديد من المقالات حول مقارنة VC و Delphi ، وأنا مهتم أيضًا بكتابة التعليمات البرمجية لتجربتها. الرمز كما يلي:
#include <lindows.h>
hwnd hwndbutton ؛
int cx ، cy ؛
Lresult Callback MainWndproc (Hwnd Hwindow ، Uint NMSG ، Wparam WPRM ، LPARAM LPRM)
{
HDC DC ؛
PaintStruct PS ؛
Rect RC ؛
التبديل (NMSG)
{
حالة wm_create:
{
Textmetric TM ؛
DC = GETDC (hwindow) ؛
SelectObject (DC ، getStockObject (system_fixed_font)) ؛
getTextMetrics (DC ، & tm) ؛
cx = tm.tmavecharwidth * 30 ؛
cy = (tm.tmheight + tm.tmexternAlleading) * 2 ؛
تم إصداره (Hwindow ، DC) ؛
hwndbutton = createwindow (
"زر"،
"انقر هنا" ،
WS_CHILD |
0 ، 0 ، cx ، cy ،
hwindow ،
(Hmenu) 1 ،
((LPCreatestruct) LPRM)-> Hinstance ،
باطل
) ؛
العودة 0 ؛
استراحة؛
}
حالة wm_destroy:
{
postquitmessage (0) ؛
العودة 0 ؛
استراحة؛
}
حالة wm_paint:
{
DC = BeginPaint (Hwindow ، & ps) ؛
getClientRect (Hwindow ، & rc) ؛
rc.bottom = rc.bottom / 2 ؛
DrawText (DC ، "Hello ، World!" ، -1 ، & RC ،
dt_singleline |
Endpaint (Hwindow ، & ps) ؛
العودة 0 ؛
استراحة؛
}
حالة 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 ؛
استراحة؛
}
حالة wm_command:
{
if (loword (wprm) == 1 && hiword (wprm) == bn_clicked &&
(hwnd) lprm == hwndbutton)
{
Destroywindow (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.CBSISE = 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.HBRBKGROUNG = (HBRUSH) (color_window+1) ؛
WCEX.LPSzClassName = "Wintestwin" ؛
WCEX.HICONSM = loadicon (null ، idi_application) ؛
registerClasSex (& wcex) ؛
hwindowmain = createWindow (
"Wintestwin" ،
"مرحبًا"،
WS_OVERLIPPEDWINDOW ،
cw_usedefault ،
cw_usedefault ،
cw_usedefault ،
cw_usedefault ،
0 ،
0 ،
هينست ،
باطل
) ؛
showwindow (hwindowmain ، nshow) ؛
UpdateWindow (Hwindowmain) ؛
بينما (getMessage (& mymsg ، 0 ، 0 ، 0))
{
TranslateMessage (& mymsg) ؛
DispatchMessage (& mymsg) ؛
}
إرجاع mymsg.wparam ؛
}
حدد الإصدار للتجميع ، وقم بتشغيل الحد الأدنى لتحسين الكود لـ VC6 ، ورمز التنفيذ الذي تم إنشاؤه بواسطة الترجم هو 36.0 كيلو بايت.
ثم ترجمته إلى رمز دلفي على النحو التالي:
برنامج Wintest ؛
يستخدم
ويندوز ، رسائل ؛
var
Hwndbutton: hwnd ؛
CX ، CY: عدد صحيح ؛
وظيفة mainwndproc (hwindow: hwnd ؛ nmsg: uint ؛ wprm: wparam ؛ lprm: lparam): lresult ؛ stdcall ؛
var
DC: HDC ؛
ملاحظة: Paintstruct ؛
RC: TRECT ؛
TM: Textmetric ؛
PCTST: pcreatestruct ؛
يبدأ
حالة NMSG من
wm_create:
يبدأ
DC: = getDC (hwindow) ؛
SelectObject (DC ، getStockObject (system_fixed_font)) ؛
getTextMetrics (DC ، TM) ؛
CX: = tm.tmavecharwidth * 30 ؛
cy: = (tm.tmheight + tm.tmexternalleading) * 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: = beginpaint (hwindow ، ps) ؛
getClientRect (Hwindow ، RC) ؛
rc.bottom: = جولة (rc.bottom / 2) ؛
DrawText (DC ، "Hello ، World!" ، -1 ، RC ،
dt_singleline أو dt_center أو dt_vcenter) ؛
Endpaint (Hwindow ، PS) ؛
النتائج: = 0 ؛
مخرج؛
نهاية؛
wm_size:
يبدأ
إذا (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:
يبدأ
إذا (Loword (WPRM) = 1) و (HiWord (WPRM) = BN_CLICKED) و
(hwnd (lprm) = hwndbutton) ثم
يبدأ
Destroywindow (Hwindow) ؛
نهاية؛
النتائج: = 0 ؛
مخرج؛
نهاية؛
نهاية؛
النتيجة: = defwindowproc (Hwindow ، NMSG ، WPRM ، LPRM) ؛
نهاية؛
// WinMain
var
Hwindowmain: hwnd ؛
mymsg: msg ؛
WCEX: wndclassex ؛
يبدأ
WCEX.CBSISE: = 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.hbrackground: = hbrush (color_window+1) ؛
WCEX.LPSzClassName: = 'Wintestwin' ؛
WCEX.HICONSM: = LOADICON (0 ، IDI_APPLICATION) ؛
registerClasSex (WCEX) ؛
Hwindowmain: = CreateWindow (
'Wintestwin' ،
'مرحبًا'،
WS_OVERLIPPEDWINDOW ،
cw_usedefault ،
cw_usedefault ،
cw_usedefault ،
cw_usedefault ،
0 ،
0 ،
Maininstance ،
لا شيء
) ؛
showwindow (hwindowmain ، cmdshow) ؛
UpdateWindow (Hwindowmain) ؛
بينما getMessage (mymsg ، 0 ، 0 ، 0) = صحيح تفعل
يبدأ
TranslateMessage (mymsg) ؛
DispatchMessage (mymsg) ؛
نهاية؛
نهاية.
أخيرًا ، تبين أن الكود الذي تم إنشاؤه بواسطة Delphi كان 16.5 ألف فقط ، والذي كان أكثر من نصف أصغر من VC. هذا يدل على أن Delphi لديها برنامج مترجم جيد ، وينبغي أن تكون وظيفة تصور VCL أداة تطوير جيدة. في رأيي ، ليس لدى Delphi مشكلة في تطوير أنظمة كبيرة ، وقد يتجاوز أدائها VC. . لا يمكن لـ Delphi أيضًا استخدام VCL لكتابة البرامج.