Ushbu maqolada biz pochta orqali pochta jo'natish va qabul qilish usullarini ko'rib chiqamiz Delphi. Pochtani qabul qilish va jo'natish juda oddiy, ammo hali ham ko'p tuzoqlar, shuning uchun ushbu maqolani diqqat bilan o'qib chiqish yaxshidir. Pochta yuborish uchun bizga komponent kerak idSMTP sahifadan IndyMijozlar komponentlar palitralari Delphi. Ushbu komponent yuborish uchun zarur bo'lgan hamma narsani amalga oshiradi elektron pochta protokolga muvofiq SMTP (Oddiy pochta uzatish protokoli), u odatda 25-portdan foydalanadi, lekin uni boshqasiga o'zgartirish mumkin (Port xususiyati). Shuningdek, shaklga (o'lcham, rang va boshqalar) tuzatishlar kiritish kerak.

Keling, mijozimizni amalga oshirishni boshlaylik, buning uchun biz uni formaga joylashtiramiz idSMTP.Shuningdek, sozlamalarni o'rnating ko'rinish shakllar (nomi, o'lchami va boshqalar). Agar kerak bo'lsa, siz portni o'zgartirishingiz mumkin, lekin asosiysi bu portni xavfsizlik devorida blokdan chiqarish kerakligini unutmaslikdir. Ulanish uchunSMTPserver o'z xostini ko'rsatishi kerak (xususiyat xost). Masalan: IdSMTP1.Host:= "smtp.pochta.ru "; Yoki (biz qilganimizdek) uni formaga joylashtiring Yorliq vaTahrirlash. Bir oz oldinga qarab, serverga ulanish ushbu usul yordamida amalga oshirilganligini aytaman Ulanish.

Misol:

tartibUlanish(constVaqt tugashi:Butun son);bekor qilish;

Qayerda Vaqt tugashi- ixtiyoriy parametr, javobni kutish uchun millisekundlarda maksimal vaqtni belgilaydi SMTP server, shundan so'ng ulanish o'rnatishga urinish to'xtatiladi. Masalan: IdSMTP1.Connect(5000);

Agar serverga ulanishda avtorizatsiya zarur bo'lsa, u holda mulk qiymati Autentifikatsiya turi ichiga o'rnatilishi kerak atLogin, ob'ekt tekshiruvchisida siz xususiyatlarni ham belgilashingiz kerak foydalanuvchi nomi ( foydalanuvchi nomi). Masalan, foydalanuvchi nomi pochta qutisi [elektron pochta himoyalangan] keyin foydalanuvchi nomi bu holatda Delphi va Parol (pochta qutisi uchun parol) yoki bo'ladi bu harakat dasturiy tarzda amalga oshirilishi mumkin.

IdSMTP1.AuthenticationType:=atLogin;
IdSMTP1.Foydalanuvchi nomi:="delphi";
IdSMTP1.Password:="parol";

IdSMTP1.AuthenticationType:=atNone;

Bizning misolimizda avtorizatsiya uchun login va parol kerak bo'ladi deb taxmin qilamiz.

Usulni qo'llashdan keyin Ulanish uning bajarilishi natijasini tekshirish kerak. Bu mulk yordamida amalga oshiriladi Ulangan agar bu to'g'ri bo'lsa, u holda ulanish normal edi.

Funktsiya xabarlarni yuborish uchun ishlatiladi Yuborish.

Misol:

IdSMTP1.Send(xabar);

Endi harfning tuzilishini batafsil ko'rib chiqamiz. Yuqorida aytib o'tilganidek, yuborish usuli xabarning asosiy qismini yuboradi, bu kabi tuzilmadir TIdMessage. Delphida harfning tuzilishi alohida komponentlar tomonidan amalga oshiriladi TIdMessage. U komponentlar palitrasida joylashgan Indy Boshqa.

Misol ta'rifi TIdMessage tuzilmalar:

var
Xabar: TIdMessage;
boshlanishi
Msg.Subject:="xabar mavzusi"; //xabar mavzusi matni
Msg.Recipients.EMailAddresses:=" [elektron pochta himoyalangan]";
//qabul qiluvchining manzilini ko'rsating
Msg.From.Adress:=" [elektron pochta himoyalangan]"; //xat muallifini ko'rsating
Msg.Body.Text:="xabar matni"; //xabar matnini joylashtiring
Msg.Date:=StrToDate("01.12.2004");//xat yuborilgan sana istalgan bo'lishi mumkin
oxiri;

Mulk Mavzu xabar mavzusini belgilaydi. Mulk Qabul qiluvchilar mulkni o'z ichiga oladi Elektron pochta manzillari u qabul qiluvchilarni belgilaydi. Ya'ni, oddiygina xat kimga mo'ljallangan bo'lsa, ikki yoki undan ortiq ajratuvchi pochta manzillari vergul xizmat qiladi.

Misol:

Msg.Recipients.EMailAddresses:="builder @mail.ru,[elektron pochta himoyalangan] ";

Mulk Kimdan tipdagi obyekt hisoblanadi TIdEmailAddressItem unda xatni jo'natuvchi haqidagi ma'lumotlar mavjud. Bu xususiyat uchta xususiyatni o'z ichiga oladi: Ism, manzil, matn. Mulk Manzil jo'natuvchining elektron pochta qutisi haqidagi ma'lumotlarni o'z ichiga oladi, u turiga ega String.

Misol:

Msg.From.Address:=" [elektron pochta himoyalangan]";

Mulk nomi jo'natuvchining nomini ifodalaydi, turiga ega String.

Misol:

Msg.From.Name:="Ivan Ivanovich";

Mulk Matn bu ikki xususiyatning umumiy ma'lumotlarini o'z ichiga oladi. Endi harfning tanasiga o'tamiz, uning turi bor TSstrings. Endi keling, fayllarni xatga biriktirish haqida gapiraylik, ya'ni haqida biriktirma. Agar siz xatga fayl biriktirishingiz kerak bo'lsa, sinf ob'ektini yaratishingiz kerak bo'ladi Tid Attachment. Buni amalga oshirish uchun siz quyidagi kabi konstruktordan foydalanishingiz kerak bo'ladi:

konstruktor Yaratish(To'plam: TIdMessageParts; const AFileName: TFileName = ""); qayta kiritish;

Qayerda To'plam maktubga qo‘shimchalar to‘plami, uning turi TIdMessageParts. TFileName tipidagi AFileName doimiysi oddiy matn qatoridir. U faylga to'g'ri yo'lni ko'rsatishi kerak.

Misol:

TIdAttachment.Create(Msg.MessageParts,"c:file.zip");

Xabar yuborilgandan so'ng, aloqa kanalini yuklamaslik uchun server bilan aloqani uzish tavsiya etiladi. Ulanishni uzish usuli yordamida uzish mumkin.

Misol:

IdSMTP1.Disconnect;

Standart Win2000/XP xabarlarni uzatish buyrug'i net sendidan foydalanish uchun interfeysni ta'minlaydigan dasturni ishlab chiqing. Foydalanuvchiga qabul qiluvchining manzilini, xabar matnini va yuboriladigan xabarlar sonini belgilashga ruxsat bering. Shuningdek, boshqa kompyuterlardan xabarlarni qabul qilish blokini o'rnatish imkoniyatini ham taqdim eting.

Shaklni rivojlantirish

Yaratish yangi loyiha Delphi. Shakl sarlavhasini (Caption xususiyati) Net Senderga o'zgartiring. Shaklning chap chetiga uchta Label toifasi komponentlarini bir-birining ustiga qo'ying. Standart va ularning Caption xususiyatini IP-manzil:, Xabar: va Miqdor: qilib o‘rnating.

Har bir yorliq yoniga Edit kategoriya komponentini joylashtiring Standart. Yuqoridagi IP-ga nom bering (Name xususiyati) va Text xususiyatiga 192.168.0.1 qiymatini belgilang; o'rta maydonga txt nom bering va ba'zi bir standart xabar matniga Text xususiyatini belgilang; Eng pastki maydonga qanday nom bering va Text xususiyatini 1 ga o'rnating.

Ro'yxatdagi komponentlar ostida "Category Checkbox" komponentini qo'ying Standart. Unga xavfsiz deb nom bering, uning Caption xususiyatini Xabarni qabul qilishni o‘chirishga va Checked xususiyatini Truega o‘rnating.

Shaklning eng pastki qismida tugmani qo'ying (Buton toifasi komponenti Standart), uning Caption xususiyatini Send ga o'rnatish. Shuningdek, bizga taymer kerak (komponent Taymer toifasi Tizim), buning uchun Interval xususiyati 10 ga o'rnatilishi kerak.

Olingan shakl rasmga mos kelishi kerak. 15.1.

Guruch. 15.1. Xabar yuborish uchun dastur uchun shakl mahalliy tarmoq

Dastur kodini ishlab chiqish

Avvalo, o'zimizning bomba protseduramizni yozamiz, u barcha sozlamalarni o'qiydi va xabar yuboradi. Ushbu protsedurani shakl sinfining shaxsiy a'zosi sifatida e'lon qiling:

Bizga i tipidagi global o‘zgaruvchi ham kerak:

Endi amalga oshirish bo'limida bomba protsedurasining amalga oshirilishini yaratamiz:

TForm1.bomb() protsedurasi;
agar how.Text= "" then how.Matn:= "1";
agar ip.Text = "" keyin ip.Text:= "127.0.0.1";(agar IP manzil ko'rsatilmagan bo'lsa, biz yuboramiz mahalliy kompyuter}
WinExec(PChar("net send " + ip.Text + """ + txt.Text + """), 0);//xabar yuborish

Ushbu protsedura barcha kerakli maydonlar to'ldirilganligini tekshiradi. Agar xabar matni bo'lmasa, "!" belgisini qo'ying; agar IP manzil ko'rsatilmagan bo'lsa, biz mahalliy kompyuterga 127.0.0.1 manzili bilan xabar yuboramiz; agar xabarlar soni ko'rsatilmagan bo'lsa, biz bitta xabar yuboramiz. Xabarlar quyidagi sintaksisga ega bo'lgan standart net send buyrug'i yordamida yuboriladi:

net IP manzilli xabarni yuborish.

Endi OnTimer hodisasini ko'rib chiqamiz:

h: HWND;// oyna identifikatorini saqlaydi
xavfsiz bo'lmasa. Keyin tekshiriladi//agar katakcha belgilanmagan bo'lsa
Timer1.Enabled:= False;// monitoringni o'chirish
xavfsiz bo'lsa. Keyin tekshiriladi//agar katakcha belgilansa
//xabar qutilarini qidiring
h:= FindWindow(nil, "Xabarlar xizmati");// barcha topilgan oynalarni yoping
agar h<>

Xabarlarni qabul qilishni o'chirish katagiga belgilansa, biz sarlavhasi bu xabar ekanligini ko'rsatadigan oynalarni kuzatishni boshlaymiz va barcha topilgan oynalarni yopamiz. Agar katakcha belgilanmagan bo'lsa, monitoring o'chirib qo'yiladi.

Ushbu ikki rejim oʻrtasida almashish uchun siz secure.OnClick hodisasi ishlov beruvchisini yaratishingiz kerak:

xavfsiz bo'lsa. Keyin tekshiriladi//agar katakcha belgilansa...
Timer1.Enabled:= Rost;//...monitoringni yoqish

Tugma bosilganda Yuborish biz shunchaki bomba protsedurasini chaqiramiz:

Foydalanuvchining hayotini osonlashtirish uchun biz tugmani bosish orqali xabar yuborilganligiga ishonch hosil qilamiz har qanday matn kiritish maydonida. Buni amalga oshirish uchun har bir maydon uchun OnKeyPress hodisasi ishlov beruvchisini yaratishingiz kerak. Ushbu ishlov beruvchining kodi ip maydoni uchun bo'lib, u keyinchalik txt va qanday maydonlarga tayinlanishi mumkin:

kalit bo'lsa= # 13 keyin//agar tugma bosilsa
bomba;//xabar yuborish

To'liq modul manba kodi

To'liq kod mahalliy tarmoq orqali xabarlarni jo'natish dasturining moduli 15.1 ro'yxatda keltirilgan.

Ro'yxat 15.1. Mahalliy tarmoq orqali xabarlarni yuborish uchun dastur moduli

Windows, Xabarlar, SysUtils, Variantlar, Sinflar, Grafika, Boshqaruv elementlari, Formalar, Dialoglar, StdCtrls, ExtCtrls;

protsedura Timer1Timer(Sender: TObject);
securityClick protsedurasi(Sender: TObject);
protsedura ipKeyPress(Sender: TObject; var Key: Char);
protsedura txtKeyPress(Yuborish: TObject; var Kalit: Char);
protsedura howKeyPress(Sender: TObject; var Key: Char);
protsedura Button1Click(Sender: TObject);


// bo'sh yoki yo'qligini tekshiring matnli xabar
agar txt.Text = "" keyin txt.Text:= "!";
//agar miqdor ko'rsatilmagan bo'lsa, biz bitta xabar yuboramiz
agar how.Text= "" then how.Text:= "1";
agar ip.Text = "" keyin ip.Text:= "127.0.0.1"; (agar IP-manzil ko'rsatilmagan bo'lsa, biz uni mahalliy kompyuterga yuboramiz)
//belgilangan sonli xabarlarni yuborish
i:=1 uchun StrToInt(how.Text) qilish
WinExec(PChar("net send " + ip.Text + """ + txt.Text + """), 0); //xabar yuborish

protsedura TForm1.Timer1Timer(Sender: TObject);
h: HWND; // oyna identifikatorini saqlaydi
agar xavfsiz bo'lmasa.Checked keyin //agar belgilash katakchasi belgilanmagan bo'lsa
Timer1.Enabled:= False; // monitoringni o'chirish
agar xavfsiz.Checked keyin //agar belgilash katakchasi belgilansa
//xabar qutilarini qidiring
h:= FindWindow(nil, "Xabar xizmati"); // barcha topilgan oynalarni yoping
agar h<>0 keyin PostMessage(h, WM_QUIT, 0, 0);

protsedurasi TForm1.secureClick(Sender: TObject);
agar xavfsiz bo'lsa.Checked keyin //agar katakcha belgilansa...
Timer1.Enabled:= Rost; //...monitoringni yoqish

procedure TForm1.ipKeyPress(Sender: TObject; var Key: Char);
agar kalit = #13 bo'lsa, //agar tugma bosilsa
bomba; //xabar yuborish

protsedurasi TForm1.Button1Click(Sender: TObject);

⊚ Barcha loyiha fayllari va bajariladigan fayl Ko'rib chiqilgan dasturlar kitob bilan birga 15-bob papkasida joylashgan kompakt diskda joylashgan.

shunga o'xshash joyda

IdTCPClient1.Host:= "127.0.0.1"; IdTCPClient1.Connect;// ulangan IdTCPClient1.Socket.WriteLn("buyruq"); // yuborilgan buyruq buyrug'i va satr tasmasi // Javobni kuting va ulanishni yoping txtResults.Lines.Append(IdTCPClient1.Socket.ReadLn); IdTCPClient1.Disconnect;

bu holda, buyruq faqat satr tasmasi bo'lgan matndir. Bu buyruqni boshqa tomondan qabul qilishni ancha osonlashtiradi (faqat ReadLn). Umumiy holatda, siz (yoki tayyor) protokolni o'ylab topishingiz kerak.

Yuqorida u mijoz edi. Va endi server. Server bilan hamma narsa biroz murakkabroq. Serverning faqat bitta emas, balki ko'p mijozlarga xizmat ko'rsatishi odatiy hol ekanligi aniq. Va buning uchun bir nechta "sxema" mavjud.

    Klassik - bitta mijoz - bitta ip. Sxemani kodlash oson va intuitiv. U yadrolar bo'ylab yaxshi parallellashtirilgan. Kamchilik shundaki, odatda ko'plab iplarni yaratish juda qiyin va bu mijozlar sonini cheklaydi. 32-bitli dasturlar uchun yuqori chegara har bir jarayon uchun taxminan 1500 (bir yarim ming) ipni tashkil qiladi. Ammo bu holda, ularni almashtirish uchun qo'shimcha xarajatlar butun foizni "eyishi" mumkin. Bu indyda ishlatiladigan sxema.

    Ikkinchi klassik - barcha mijozlar bitta ipda. Ushbu sxema ko'pincha kodlash uchun murakkabroq, ammo to'g'ri yondashuv bilan u yadroda deyarli hech qanday yuklamasdan 20-30 ming "sekin foydalanuvchilarni" saqlashga imkon beradi. Ushbu sxemaning kuchli afzalligi shundaki, siz mutekslar va boshqa sinxronizatsiya primitivlarisiz bajarishingiz mumkin. Ushbu sxema NodeJS va Qt tarmog'ida tarmoq bilan ishlash uchun standart sinflar tomonidan qo'llaniladi.

    Aralash. Bunday holda, bir nechta iplar yaratiladi, ularning har biri ma'lum miqdordagi mijozlarga xizmat qiladi. Kodlash eng qiyin, ammo apparat resurslaridan maksimal darajada foydalanish imkonini beradi.

Bu Indyda qanday amalga oshiriladi. Indy tcp serveri har bir ulanish uchun alohida ip (TThread) yaratadi va mijoz bilan keyingi ish unda amalga oshiriladi. Indy buni yaxshi yashiradi va foydalanuvchini faqat IdTCPServer.onExecute usulini amalga oshirish uchun qoldiradi. Lekin, yuqorida aytganimdek, bu usul alohida mavzuda ishga tushirilgan va u har bir mijoz uchun shaxsiydir. Bu quyidagilarni anglatadi:

  • bu usulda siz uyquga qo'ng'iroq qilishingiz mumkin va faqat bitta mijoz kutadi. Qolganlarning hammasi ishlaydi (lekin agar siz tugmani bosish moslamasida uyquni chaqirsangiz, natija ma'lum bo'ladi)
    • Global o'zgaruvchilarga faqat sinxronizatsiya primitivlari orqali kirish yaxshiroqdir.
    • Siz gui elementlariga ehtiyotkorlik bilan va to'g'ri kirishingiz kerak. Buni to'g'ridan-to'g'ri qilmaslik yaxshiroqdir (ba'zi komponentlar ularga boshqa mavzulardan kirishga imkon beradi, lekin siz hujjatlarni diqqat bilan o'qib chiqishingiz kerak).
    • Bloklash orqali boshqa mijozlarga kirishingiz kerak (chunki ikkita mavzu bitta foydalanuvchiga yozishni xohlasa, undan yaxshi narsa bo'lmaydi).

Keling, juda oddiy misolni ko'rib chiqaylik. Biz mijozning har qanday so'roviga javob beramiz va ulanishni yopamiz (echo server turi).

Protsedura TForm1.IdTCPServer1Execute(ACContext: TIdContext); var strText: String; start //Mijozdan satr olish strText:= AContext.Connection.Socket.ReadLn;

//Javob berish AContext.Connection.Socket.WriteLn(strText);

//AContext.Connection.Disconnect foydalanuvchisi bilan ulanishni yoping; oxiri;

AContext - mijoz haqidagi barcha kerakli ma'lumotlarni o'z ichiga olgan maxsus ob'ekt. idTcpServerning o'zi ushbu kontekstlarning ro'yxatini o'z ichiga oladi va ularga kirish mumkin. Keling, yanada murakkab translyatsiyani ko'rib chiqaylik. Ya'ni hammaga bitta xabar yuboring

Boshqalar uni o'zgartira olmasligi uchun ro'yxat qulflangan. Aks holda, tsiklning o'zi ancha murakkablashadi. Va eng muhimi, qulfni ochishni unutmang!

Oxirgi savol qoldi. Muayyan mijozga qanday qilib xabar yuborish kerak. Buning uchun siz aloqani aniqlashni o'rganishingiz kerak. Buni bir necha usul bilan amalga oshirish mumkin - IP/portga qarang. Lekin yaxshiroq bor. IdContext (aniqrog'i, uning ajdodi idTask) TObject tipidagi Data xossasiga ega. Unga ob'ektingizni yozishingiz va u erda barcha kerakli ma'lumotlarni saqlashingiz mumkin. Oddiy foydalanish holati quyidagicha bo'ladi. Mijoz endigina ulangan bo'lsa, bu maydon bo'sh. U ism-parol tekshiruvidan o'tganda, biz ob'ektni (o'zimizniki) yaratamiz, nomni u erda saqlaymiz va uni Data xususiyatiga yozamiz. Va keyin, ulangan mijozlar orqali aylanishingiz kerak bo'lganda, biz uni shunchaki o'qiymiz. Albatta, minglab foydalanuvchilar bo'lsa, har safar barcha foydalanuvchilarni ko'rish qimmatga tushadi. Ammo buni qanday qilib optimalroq qilish - bu boshqa katta maqolaning mavzusi.

Xabarlarni yuborish

Shu qatorda; shu bilan birga Windows tizimi o'z xabarlarini turli oynalarga yuboradi, ilovaning o'zi ham o'z oynalari va boshqaruv elementlari o'rtasida xabar almashishi kerak bo'lishi mumkin. Xabarlarni yuborishning bir necha usullari mavjud: PerForm() usuli (Windows API’dan mustaqil ishlaydi), shuningdek Win32 API funksiyalari SendMessage() va PostMessage().

TControl sinfining barcha avlodlarida mavjud bo'lgan PerForm() usuli:

funktsiya TControl.Perform(Msg: Cardinal; WParam, LParam: Longint): Longint;

Shakl yoki boshqaruvga xabar yuborish uchun quyidagi sintaksisdan foydalaning:

RetVal:= ControlName.PerForm(MessageID, wParam, lParam);

PerForm() chaqirilganda, boshqaruv qo'ng'iroq qilish dasturi xabar qayta ishlanmaguncha qaytib kelmaydi. Ushbu usul xabarni Windows API xabar almashish tizimidan o'tmasdan uzatadi.

SendMessage() va PostMessage() API funksiyalari Windows modulida quyidagicha e'lon qilingan:

funksiya SendMessage(hWnd: HWND; Xabar: UINT; wParam: WPARAM;

lParam: LPARAM): LRESULT; stdcall;

Funktsiya PostMessage(hWnd: HWND; Xabar: UINT;

wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;

hWnd – xabarni qabul qiluvchi oynasi dastagi; Msg - xabar identifikatori; wParam va lParam - qo'shimcha ma'lumotlar.

SendMessage() funktsiyasi, PerForm() usuli kabi, xabarni bevosita oyna protsedurasiga yuboradi va uni qayta ishlashni kutadi, PostMessage() funksiyasi xabarni xabarlar navbatiga qo'yadi va boshqaruvni chaqirilgan dasturga qaytaradi. uni qayta ishlash natijalarini kutmasdan.

SendMessage() funksiyasi xabarni qayta ishlash natijasida olingan qiymatni qaytaradi. PostMessage() funktsiyasi - xabarning xabarlar navbatiga muvaffaqiyatli joylashtirilganligini ko'rsatadigan qiymatni qaytaradi.

Foydalanuvchi xabarlari

Ilovalarni ishlab chiqishda dastur qandaydir harakatlarni bajarish uchun o'ziga yoki boshqa ilovaga maxsus xabar yuborishi kerak bo'lgan vaziyat bo'lishi mumkin. Foydalanuvchi tomonidan yaratilgan xabarlar uchun Windows WM_USER dan $7FFF gacha bo'lgan qiymatlarni saqlaydi.

Maxsus xabarga misol:

TestMsg = WM_USER + 100; // xabar identifikatori

TForm1 = sinf (TForm)

// xabarni qayta ishlash usuli:

protsedura MyMessage(var Msg: TMessage); TestMsg xabari;

procedure TForm1.MyMessage(var Msg: TMessage);

ShowMessage ("TestMsg xabar ishlayapti");

Msg.Result:= 1; // qaytarilgan natija

Shaklga xabar yuborish misollari:

agar Form1.PerForm(TestMsg, 0, 0) = 1 bo'lsa

agar SendMessage(Form1.Handle, TestMsg, 0, 0) = 1 bo'lsa

ShowMessage("Xabar muvaffaqiyatli qayta ishlandi");

agar PostMessage(Form1.Handle, TestMsg, 0, 0) bo'lsa

ShowMessage("Xabar xabarlar navbatiga qo'yildi");

Delphi voqealari

Voqea - bu dastur ishlayotgan vaqtda sodir bo'ladigan narsa. nuqtai nazaridan Delphi tili, hodisa protsessual tipdagi xususiyat bo'lib, uning qiymati qandaydir usulga ko'rsatgich hisoblanadi. Bunday xususiyatga qiymat berish hodisa sodir bo'lganda bajariladigan usulning manzilini ko'rsatishni anglatadi. Bunday usullar hodisalarni ishlov beruvchilar deb ataladi.

Voqealardan foydalanish avlod sinfini yaratmasdan mavjud sinfga yangi funksiyalar qo'shish imkonini beradi.

Hodisa xossalari “On” so‘zidan keyin voqea nomi bilan boshlashga harakat qiladi.

Xabarlar va hodisalar o'rtasidagi munosabat

Delphi hech bo'lmaganda ularning ba'zilari bilan Windows xabarlari bilan ishlash uchun interfeysni taqdim etadi. Ko'pgina VCL komponent voqealari WM_XXX tipidagi Windows xabarlari bilan bevosita bog'liq.