ฉันได้อ่านบทความหลายเรื่องเกี่ยวกับการเปรียบเทียบ VC และ Delphi และฉันก็สนใจที่จะเขียนโค้ดเพื่อลองใช้ รหัสมีดังนี้:
#include <windows.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 | WS_VISIBLE |
0, 0, cx, cy,
Hwindow
(hmenu) 1,
((lpcreatestruct) lprm)-> hinstance,
โมฆะ
-
กลับ 0;
หยุดพัก;
-
กรณี wm_destroy:
-
PostquitMessage (0);
กลับ 0;
หยุดพัก;
-
กรณี wm_paint:
-
dc = artpaint (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:
-
ถ้า (loword (wprm) == 1 && hiword (wprm) == bn_clicked &&
(hwnd) lprm == hwndbutton)
-
DestroyWindow (Hwindow);
-
กลับ 0;
หยุดพัก;
-
-
ส่งคืน 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 | cs_vredraw;
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 (
"Wintestwin",
"สวัสดี",
WS_OVERLAPPEDWINDOW
cw_usedefault
cw_usedefault
cw_usedefault
cw_usedefault
0,
0,
Hinst
โมฆะ
-
showwindow (hwindowmain, nshow);
UpdateWindow (Hwindowmain);
ในขณะที่ (getMessage (& mymsg, 0, 0, 0)))
-
TranslateMessage (& mymsg);
dispatchMessage (& mymsg);
-
กลับ mymsg.wparam;
-
เลือกรีลีสเพื่อคอมไพล์เปิดการเพิ่มประสิทธิภาพรหัสขั้นต่ำของ VC6 และรหัสการดำเนินการที่สร้างโดยการรวบรวมคือ 36.0KB
จากนั้นแปลเป็นรหัส Delphi ดังนี้:
โปรแกรม Wintest;
ใช้
Windows, ข้อความ;
วาจา
hwndbutton: hwnd;
CX, CY: จำนวนเต็ม;
ฟังก์ชั่น mainwndproc (hwindow: hwnd; nmsg: uint; wprm: wparam; lprm: lparam): lresult; stdcall;
วาจา
DC: HDC;
PS: 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: = รอบ (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
วาจา
Hwindowmain: hwnd;
Mymsg: ผงชูรส;
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_OVERLAPPEDWINDOW
cw_usedefault
cw_usedefault
cw_usedefault
cw_usedefault
0,
0,
Maininstance
ไม่มี
-
showwindow (hwindowmain, cmdshow);
UpdateWindow (Hwindowmain);
ในขณะที่ getMessage (mymsg, 0, 0, 0) = true do
เริ่ม
TranslateMessage (MyMSG);
DispatchMessage (MYMSG);
จบ;
จบ.
ในที่สุดก็พบว่ารหัสที่สร้างโดย Delphi มีเพียง 16.5k ซึ่งมีขนาดเล็กกว่า VC มากกว่าครึ่ง นี่แสดงให้เห็นว่า Delphi มีคอมไพเลอร์ที่ดีและฟังก์ชั่นการสร้างภาพ VCL ควรเป็นเครื่องมือการพัฒนาที่ดี ในความคิดของฉัน Delphi ไม่มีปัญหาในการพัฒนาระบบขนาดใหญ่และประสิทธิภาพของมันอาจเกิน VC . Delphi ไม่สามารถใช้ VCL เพื่อเขียนโปรแกรมได้