Bir shakldan boshqasini qanday ochish mumkin. Shakllarni qo'shish. Shakllar orasidagi o'zaro ta'sir. Shaklni qurish va dasturli chaqirishga misol

Ushbu maqolada ko'rib chiqilayotgan savol, ayniqsa, ko'rib chiqilayotgan muammoga emas, balki dastur arxitekturasini yaratish mavzusiga bog'liq. Ma'lumotlarni bir shakldan boshqasiga o'tkazish umuman qiyin emas. Buning uchun biz ma'lumotlarini olmoqchi bo'lgan boshqaruvni ochiq qilish, ya'ni uni ommaviy modifikator bilan belgilash kifoya. Bundan tashqari, boshqa variant ham mumkin. Masalan, birinchi shaklda konstruktorga o'zimizga havolani, ya'ni birinchi shakldan ikkinchisiga havolani o'tkazish orqali ikkinchi shakldagi ob'ektni yaratamiz.
SecondForm secondForm = new SecondForm(bu);
Tabiiyki, buni amalga oshirishdan oldin, siz ikkinchi shaklning konstruktori uchun ortiqcha yuk yaratish haqida g'amxo'rlik qilishingiz kerak.

Va bu usul juda keng tarqalgan. Biroq, uning soddaligi bilan u juda ko'p potentsial muammolarni o'z ichiga oladi, ularning asosiysi - inkapsulyatsiya printsipining buzilishi. Bir so'z bilan aytganda, ikkinchi shakl birinchisining mavjudligi haqida hech narsa bilmasligi va undan ham ko'proq ta'sir qila olmasligi kerak.

Ushbu muammoni hal qilish juda oddiy. Keling, to'g'ridan-to'g'ri kodni ko'rib chiqaylik. Biz dizaynerda yaratamiz asosiy shakli(ilova ishga tushganda ishga tushadi). Keling, bittasini qo'yaylik TextBox, Yorliq Va Tugma.

Tugmani bosish ikkinchi shakl va matnni ochadi matn maydoni asosiy shakl ikkinchi shaklning matn maydoniga o'tkaziladi. Dastlab, ikkinchi shakl quyidagicha ko'rinadi:

Birinchisiga o'xshash, u bir xil boshqaruvga ega. Bizga boshqa kerak emas. Ilovaga kirish nuqtasi asosiy shaklni ishga tushiradi:

Tizimdan foydalanish; System.Collections.Generic yordamida; System.Linq yordamida; System.Windows.Forms-dan foydalanish; nom maydoni From1FormTo2 ( statik sinf Dasturi ( // Ilova uchun asosiy kirish nuqtasi. statik void Main() ( Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(yangi MainForm()); ) ) )

Asosiy shakl kodi quyidagicha ko'rinadi:

Tizimdan foydalanish; System.Collections.Generic yordamida; System.ComponentModel yordamida; System.Data yordamida; System.Drawing yordamida; System.Linq yordamida; System.Text yordamida; System.Windows.Forms-dan foydalanish; nomlar maydoni From1FormTo2 ( umumiy qismli sinf MainForm: Form ( //ikkinchi shakl SecondForm secondForm; //constructor public MainForm() ( InitializeComponent(); ) //ma’lumotlarni uzatish hodisasi ishlovchisi //asosiy shakldan ikkinchi xususiy bekorga btn_mainForm_Click(object) jo'natuvchi, EventArgs e) ( secondForm = yangi SecondForm(tb_mainForm.Text.Trim()); secondForm.ShowDialog(); agar (secondForm.DialogResult == DialogResult.OK) tb_mainForm.Text = secondForm.ReturnData() ); ))

Shunga ko'ra, tugmani hodisaga ulashni unutmang bosing. Bu erda asosiy shakl sinfida maydon mavjud Ikkinchi shakl ikkinchi shakl, ikkinchi shakl ob'ektini ifodalaydi. “Yuborish” tugmasini bosganingizda ikkinchi shakl yaratiladi (ortiqcha yuklangan konstruktor chaqiriladi, biz uni keyinroq yaratamiz) va usul yordamida ishga tushiriladi. ShowDialog(). Bunday holda, bu usul bizga mos keladi. Bundan tashqari, shundan so'ng biz ikkinchi shakl yopilganligini tekshirib ko'ramiz, lekin uning tugmachasini bosamiz. Agar ikkinchi shaklda tugma bosilsa, birinchi shakl ikkinchidan ma'lumotlarni qabul qilishi kerak. Bu usulni chaqirish orqali sodir bo'ladi ReturnData() ikkinchi shaklda.

Endi eng qiziqarli qism ikkinchi shaklning kodi:

Tizimdan foydalanish; System.Collections.Generic yordamida; System.ComponentModel yordamida; System.Data yordamida; System.Drawing yordamida; System.Linq yordamida; System.Text yordamida; System.Windows.Forms-dan foydalanish; nom maydoni From1FormTo2 ( umumiy qisman sinf SecondForm: Form ( //ortiqcha yuklangan konstruktor umumiy SecondForm(string ma'lumotlar) ( InitializeComponent(); tb_secondForm.Text = ma'lumotlar; ) //ma'lumotlarni uzatish hodisasi ishlov beruvchisi //ikkinchi shakldan asosiy shaxsiy bo'shliqqa. btn_secondForm_Click (ob'ekt jo'natuvchisi, EventArgs e) ( this.DialogResult = DialogResult.OK; ) // ommaviy usul kirish uchun // ushbu shaklning matn maydoniga umumiy string ReturnData() ( qaytish (tb_secondForm.Text.Trim()); ) ) )

Ko'rib turganingizdek, satr turini qabul qiladigan bitta konstruktor ortiqcha yuki mavjud. Esda tutingki, biz matnni TextBox-dan o'tkazmoqchimiz. Konstruktorda komponentlarni ishga tushirish rejalashtirilgan va matn maydonining matni birinchi shakldan uzatilgan qiymatga o'rnatiladi. Keyinchalik, tadbirga obuna bo'lish orqali bosing ikkinchi shakl tugmasi uchun biz ishlov beruvchi yaratdik btn_secondForm_Click, bu har qanday dialog oynasining "Ok" tugmasi ishlashini simulyatsiya qiladi. Shunday qilib, "Yuborish" tugmasini bosish orqali (ikkinchi shaklda) biz shartni bajaramiz

(ikkinchi shakl .DialogResult == DialogResult .OK)

Birinchi shakl, shuning uchun usulni chaqiradi secondForm.ReturnData(), biz birinchi shaklning matn maydonini ikkinchi shaklning matn maydonining qiymatiga o'rnatamiz.

Ish bu usul, Menimcha, endi tushuntirishni talab qilmaydi. U faqat bitta matn maydonidan matnni maxfiy saqlagan holda qaytaradi.

Natijada, biz inkapsulyatsiya tamoyillarini buzmasdan ma'lumotlarni ikkinchi shaklga birinchi va ikkinchidan birinchisiga o'tkazdik.

Birinchi shaklning matn maydoniga "aaa" matnini kiritishga harakat qiling va tugmani bosing. Ushbu matnni ochilgan ikkinchi shakldagi matn maydonida ko'rasiz. Matnni "aaa ppp" ga o'zgartirib ko'ring va tugmani bosing. Ikkinchi shaklni yopgandan so'ng, ushbu matn asosiy shaklning matn maydonida qanday paydo bo'lishini ko'rasiz.

Endi siz shakllar o'rtasida ma'lumotlarni to'g'riroq uzatishingiz mumkin deb o'ylayman. Keyingi maqolada buni ASP.NET ilovalarida qanday qilish haqida gapiramiz.

Oxirgi yangilangan: 31.10.2015

Loyihaga boshqa shakl qo'shish uchun Solution Explorer oynasida loyiha nomini sichqonchaning o'ng tugmasi bilan bosing va Qo'shish-> Windows formasi...-ni tanlang.

Keling, yangi shaklga qandaydir nom beraylik, masalan, Form2.cs:

Shunday qilib, biz loyihamizga ikkinchi shaklni qo'shdik. Endi ikkita shakl o'rtasidagi o'zaro ta'sirni amalga oshirishga harakat qilaylik. Aytaylik, tugma bosilganda birinchi forma ikkinchi formani chaqiradi. Birinchidan, birinchi formaga Form1 tugmachasini qo'shamiz va kod fayliga o'tish uchun tugmani ikki marta bosamiz. Shunday qilib, biz tugmani ikki marta bosgandan so'ng sukut bo'yicha yaratilgan tugmani bosish hodisasi ishlovchisiga o'tamiz:

Shaxsiy bekor tugmasi1_Click(ob'ekt jo'natuvchi, EventArgs e) ( )

Endi unga ikkinchi formani chaqirish kodini qo'shamiz. Bizning ikkinchi formamiz Form2 deb ataladi, shuning uchun avval ushbu klass ob'ektini yaratamiz, so'ngra uni ekranda ko'rsatish uchun Show usulini chaqiramiz:

Maxfiy bekor tugmasi1_Click(ob'ekt jo'natuvchisi, EventArgs e) ( Form2 newForm = new Form2(); newForm.Show(); )

Endi teskarisini qilaylik - ikkinchi shakl birinchisiga ta'sir qilishi uchun. Ikkinchi shakl esa birinchisining mavjudligi haqida bilmaydi. Buni tuzatish uchun siz qandaydir tarzda birinchi shakl haqidagi ma'lumotlarni ikkinchi shaklga o'tkazishingiz kerak. Buning uchun konstruktorda formaga havolani uzatishdan foydalanamiz.

Shunday qilib, keling, ikkinchi shaklga o'tamiz va uning kodiga o'tamiz - formani o'ng tugmasini bosing va Kodni ko'rishni tanlang. Hozircha u bo'sh va faqat konstruktorni o'z ichiga oladi. C# usuli haddan tashqari yuklashni qo'llab-quvvatlaganligi sababli, biz turli xil parametrlarga ega bir nechta usullar va konstruktorlarni yaratishimiz va vaziyatga qarab ulardan birini chaqirishimiz mumkin. Shunday qilib, ikkinchi shakldagi kod faylini quyidagiga o'zgartiramiz:

Tizimdan foydalanish; System.Collections.Generic yordamida; System.ComponentModel yordamida; System.Data yordamida; System.Drawing yordamida; System.Linq yordamida; System.Text yordamida; System.Threading.Tasks dan foydalanish; System.Windows.Forms-dan foydalanish; nom maydoni HelloApp ( umumiy qisman sinf Form2: Shakl ( umumiy Form2() ( InitializeComponent(); ) umumiy Form2(Form1 f) ( InitializeComponent(); f.BackColor = Color.Yellow; ) ) )

Aslida biz bu yerga qo'shdik yangi konstruktor umumiy Form2(Form1 f), unda biz birinchi shaklni olamiz va uning fonini sariq rangga o'rnatamiz. Endi birinchi formaning kodiga o'tamiz, u erda biz ikkinchi shaklni chaqirdik va uni quyidagicha o'zgartiramiz:

Maxfiy bekor tugmasi1_Click(ob'ekt jo'natuvchisi, EventArgs e) ( Form2 newForm = new Form2(bu); newForm.Show(); )

Bu holda kalit so'z joriy ob'ektga - Form1 ob'ektiga havola bo'lganligi sababli, ikkinchi shaklni yaratishda u uni (havolani) oladi va u orqali birinchi shaklni boshqaradi.

Endi tugmani bosgandan so'ng ikkinchi forma yaratiladi, u darhol birinchi formaning rangini o'zgartiradi.

Shuningdek, biz joriy shakldagi ob'ektlarni yaratishimiz mumkin:

Maxfiy bekor tugmasi1_Click(ob'ekt jo'natuvchisi, EventArgs e) ( Form1 newForm1 = new Form1(); newForm1.Show(); Form2 newForm2 = new Form2(newForm1); newForm2.Show(); )

Bir nechta shakllar bilan ishlashda siz ulardan biri asosiy ekanligini hisobga olishingiz kerak - bu birinchi bo'lib Program.cs faylida ishga tushiriladi. Agar bizda bir vaqtning o'zida bir nechta shakllar ochilgan bo'lsa, asosiysini yopganimizda, butun dastur yopiladi va u bilan birga barcha boshqa shakllar.

Microsoft-ning Visual Studio dasturi haqidagi fikrim hali ham bir xil bo'lishiga qaramay, ba'zida siz bu haqda biror narsa qilishingiz kerak. Agar biz C++ da emas, balki C++/CLI deb ataladigan tilda yozayotganimiz bilan kelishsak, tanish vizual komponentlar bilan ishlash bir xil Borland muhitlaridan unchalik farq qilmaydi. Lekin u Builder bilan solishtirganda muammo tug'dirishi mumkin.Birdan ortiq formaga ega bo'lgan dastur bilan ishlashning 3 ta tipik holatini ko'rib chiqamiz.Misol muhiti bepul Visual C++ 2010 Express, asosiy formada standart Form1 nomi bor deb taxmin qilinadi.

Shaklni qurish va dasturli chaqirishga misol

Bu kodni, masalan, Form1 asosiy formadagi tugmani bosish orqali bajarish mumkin.

Form^form2 = gcnew Form(); Button^ tugmasi2 = gcnew Button(); button2->Matn = L"OK"; button2->Joylashuv = Point(10,10); form2->Matn = L "Mening oynam"; form2->HelpButton = rost; form2->FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedDialog; form2->StartPosition = FormStartPosition::CenterScreen; form2->Boshqarish->Qo'shish(tugma 2); form2->ShowDialog();

Dasturiy ravishda yaratilgan tugma tugmasi2 uchun bosish ishlovchisini qo'shish uchun kodning oxirgi qatoridan oldin yozing:

Button2->Click += gcnew System::EventHandler(bu, &Form1::button2_Click);

Form2->ShowDialog() yoki form2->Show() usuli chaqirilishidan oldin;

Bunday holda, ishlov beruvchi kodi joriy Form1.h modulida joylashgan:

Shaxsiy: System::Void button2_Click(System::Object^ jo'natuvchi, System::EventArgs^ e) ( MessageBox::Show("Bu yerda"); )

Asosiy shakldan boshqa shaklni chaqiring

Menyuda Loyiha - Qo'shish-ni tanlang yangi element- Shakl - Form2 nomi

Keling, operatorni qo'shamiz

# "Form2.h" ni o'z ichiga oladi

Form1.h dagi birinchi nom maydonidan oldin (ya'ni faylning eng boshida).

Form1 sinfining umumiy bo'limiga sinf misoliga ko'rsatgich qo'shamiz:

Form2^F2;

Keling, yaratishimiz kerak bo'lgan kodni qo'shamiz va ikkinchi shaklni chaqiramiz:

F2=gcnewForm2(); F2->Show();

Ikkinchi shaklni dasturiy ravishda o'chirish uchun quyidagi kod mos keladi:

F2-ni o'chirish;

Shuni ta'kidlash kerakki, ko'rsatgich faqat bitta shaklning manzilini saqlaydi, oxirgi yaratilgan. Agar biz ushbu kod yordamida ketma-ket bir nechta shakllarni yaratsak, faqat oxirgisi o'chiriladi. Shu bilan bir qatorda, quyida tasvirlangan shakllar qatorini sinab ko'ring.

Form1 sinfidagi kerakli ma'lumotlarni tavsiflaymiz (bu erda Tabulator loyihasining nomi va nom maydoni, agar kerak bo'lsa, o'zingizniki bilan almashtiring):

Statik const int MAX_FORMS = 100; //Shakllarning maksimal soni int FormCount; //Shakl hisoblagich massivi ^ F2; //Formalar massiviga ko'rsatgich

Keyin biz asosiy shaklning Load hodisasi yordamida ma'lumotlarni ishga tushiramiz:

FormCount=0; F2 = gcnew massivi (MAX_FORMLAR);

Keyin keyingi shaklni yaratish uchun kodni amalga oshiramiz

Agar (FormCount Show(); ) else MessageBox::Show("Juda ko'p shakllar!");

va uni olib tashlash:

Agar (FormCount) ( F2 o'chirish; FormCount--; )

Agar biz asosiy shakllarni alohida emas, balki ota-shakl ichida yaratmoqchi bo‘lsak, Form1 xossalarida uning “ajdod” ekanligini ko‘rsatishimiz kerak (IsMdiParent xossasini o‘rnating = true) va asosiy shaklni ko‘rsatishdan oldin F2->Show() operatori, uni asosiy Form1 sifatida belgilang:

F2->MdiParent = bu;

Bolalar formasidan ota-ona shakl usulini chaqiring

Biz .cpp fayllaridan foydalanmasdan qila olmaymiz, bu yomon emas - .h fayllariga kod yozish odatda to'g'ri C tizimini buzadi :)

Keling, jarayonni bosqichma-bosqich tasvirlab beraylik.

1) 2 ta shakl mavjud - Form1 va Form2, Form1 da Button (tugma1, ikkinchi forma ochiladi) va Label (label1, bu erda matnni o'zgartiramiz) mavjud. Form2 - tugma 1 da bosilganda label1 dagi matn o'zgaradi.

2) Birinchi shakldan ikkinchisiga, ikkinchisidan esa birinchisiga kirishimiz kerak bo'lganligi sababli, o'zaro havolalar muammosi paydo bo'ladi (Form1.h Form2.h ga murojaat qilganda, bu esa, o'z navbatida, yana murojaat qiladi. Form1.h ga). Bunga yo'l qo'ymaslik uchun biz ikkinchi shaklga (Form2) kirish huquqiga ega bo'lgan birinchi shakl (Form1) kodini .h faylidan .cpp fayliga o'tkazamiz. Shunday qilib, siz Form1.cpp faylini yaratishingiz kerak.

3) Form1.h da umumiy oʻrnatish usulini eʼlon qiling, shunda label1 matnini oʻzgartirishingiz mumkin (kod fayl oxirida, #pragma endregion dan keyin yozilishi mumkin):

Ommaviy: void Set(String^ text) ( label1->Text = text; )

4) Form2.h fayliga Form1.h ni kiritamiz (boshida):

#"Form1.h"ni o'z ichiga oladi

va keyingi foydalanish uchun birinchi shaklga havolani qabul qiladigan va saqlaydigan konstruktor yarating:

Form2(Form1^ parent) ( InitializeComponent(); parentForm = ota; ) //siz darhol quyidagi havolani yozishingiz mumkin: xususiy: Form1^ parentForm;

5) Form2-dagi tugmani bosgandan so'ng, biz ota-shaklning Set usulini chaqiramiz:

Xususiy: System::Void button1_Click(System::Object^ jo'natuvchi, System::EventArgs^ e) ( parentForm->Set("form2dan salom"); parentForm->Show(); this->Yashirish(); )

6) Birinchi shaklda ikkinchi shaklni ochish qoladi. Buning uchun biz tugmani bosish moslamasini Form1.h dan Form1.cpp ga o'tkazamiz va .h faylida biz faqat uning deklaratsiyasini qoldiramiz.

Ba'zan dasturni bajarish jarayonida bir shaklning elementlariga boshqasidan kirishga to'g'ri keladi. Masalan, Form1 formasi mavjud, undan biz boshqa Form2 ochamiz va endi Form2 da ishlagan holda Form1 asosiy formasining elementlariga kirishimiz kerak. Men buni qilishning bir qancha usullarini topdim.

1-usul. Umumiy o'zgaruvchiga havolani uzatish.

Nom maydoni WindowsApplication1 ( umumiy qisman sinf Form1: Shakl ( umumiy Form1() ( InitializeComponent(); ) xususiy bekor tugmasi1_Click(obyekt yuboruvchi, EventArgs e) ( Form2 frm = new Form2(); frm.but1 = this.button1; // yuborish Form2 frm.ShowDialog(); ) ) shakldagi tugmachaga havola.

Form2 da, havola uzatilgan o'zgaruvchi endi Form1 dagi tugma 1 ga mos keladi

Nomlar maydoni WindowsApplication1 ( umumiy qisman sinf Form2: Form ( umumiy tugma tugmasi 1; // bu o'zgaruvchida Form1 umumiy Form2() ( InitializeComponent(); ) shaxsiy bekor tugmasi1_Click(ob'ekt jo'natuvchisi, EventArgs e) ( but1. Matn = "test"; // Form1ning 1 tugmasidagi matnni o'zgartiring ) ) )

2-usul. Havolani bola shakliga o'tkazish.

Mohiyat 1-usulda taxminan bir xil. Form2 ni ochishda biz unga keyinroq o'zgartirishni rejalashtirgan elementga havolani o'tkazamiz.

Nom maydoni WindowsApplication1 ( umumiy qisman sinf Form1: Form ( umumiy Form1() ( InitializeComponent(); ) xususiy bekor tugmasi1_Click(ob'ekt jo'natuvchi, EventArgs e) ( Form2 frm = new Form2(this.button1); // tugmaga havolani o'tkazing Form2 frm.ShowDialog(); ) ) ) shakliga

Endi Form2 da biz ushbu tugmaga havolani o'z ichiga olgan o'zgaruvchini yaratishimiz kerak va u orqali biz Form1 dagi tugmachaga kiramiz (5,7,9 va 15-qatorlar).

Namespace WindowsApplication1 ( umumiy qisman sinf Form2: Form ( xususiy tugma tugmasi1; // bu o'zgaruvchi Form1 umumiy Form2 shaklidagi tugma1 tugmasiga havolani o'z ichiga oladi (Button lekin) // o'zgaruvchidagi tugmaga havolani oling, lekin ( but1) = lekin; // endi but1 tugmachasiga havola bo'ladi1 InitializeComponent(); ) private void button1_Click(ob'ekt jo'natuvchi, EventArgs e) ( but1.Text = "test"; // Form1 ning 1 tugmasidagi matnni o'zgartiring) ) ) )

3-usul. Butun ota-ona formasiga kirish.

Buning uchun siz bir nechta fayllarga o'zgartirishlar kiritishingiz kerak, lekin shu bilan birga biz ota-shaklning barcha elementlariga kirish huquqiga ega bo'lamiz va 1-usuldagi kabi har bir elementga havolani o'tkazish shart emas.

1-qadam. Fayl ichida Program.cs f1 umumiy o'zgaruvchisini yarating (5-qator).

Nom maydoni WindowsApplication1 ( statik sinf Dasturi ( umumiy statik Form1 f1; // Form1 formasiga havolani o'z ichiga olgan o'zgaruvchi statik void Main() ( Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(noto'g'ri); Application.Run(yangi Form1() ))) )))

2-qadam. Ochilish Form1.Designer.cs va unda boshqa shakldan kirish kerak bo'lgan elementlar uchun biz o'zgartiramiz xususiy yoqilgan ommaviy. Masalan, Form1 dagi tugma 1 ni o'zgartirishlar uchun mavjud qilaylik.

Umumiy tizim.Windows.Forms.tugmachasi1; // xususiy bilan umumiy bilan almashtirildi

3-qadam. Form1ni yaratishda f1 o'zgaruvchisiga ushbu formaga havola beramiz (7-qator)

Nomlar maydoni WindowsApplication1 ( umumiy qisman sinf Form1: Form ( umumiy Form1() ( Program.f1 = bu; // endi f1 Form1 formasiga havola bo'ladi InitializeComponent(); ) xususiy bekor tugmasi1_Click(ob'ekt jo'natuvchisi, EventArgs e) ( Form2 frm = yangi Form2(); frm.ShowDialog(); ) ) )

4-qadam. Endi mutlaqo istalgan shakldan yoki istalgan sinfdan Form1 da joylashgan button1 elementiga quyidagi tarzda kirishingiz mumkin: Program.f1.button1. Masalan, Form2-dagi tugma Form1-dagi tugma matnini o'zgartirsin:

Nom maydoni WindowsApplication1 ( umumiy qisman klassi Form2: Form ( public Form2() ( InitializeComponent(); ) private void button1_Click(obyekt yuboruvchi, EventArgs e) ( Program.f1.button1.Text = "test"; // Matnni o'zgartiring. forma tugmasi Form1 )))

Admin tomonidan.

C# ni o'rganish sekin. lekin u sodiqlik bilan davom etmoqda. Yaqinda men
Visual C# da bir shakldan boshqasini ochishga misol keltirdi. Aslida, hamma narsa oddiy.

Bugungi kunda quyidagi vazifa paydo bo'ldi: ilovaning asosiy shaklidan modal shaklni ishga tushirish; yopilganda, bu forma ba'zi ma'lumotlarni (matn, xususiyat qiymatlari va boshqalar) asosiy formadagi boshqaruv elementlariga o'tkazishi kerak. Shakllar haqida oldingi postda tasvirlangan usul yordamida bu muammoni hal qilish mumkin emas, chunki bu holda biz barcha xususiyatlar uchun yangi qiymatlar bilan yangi shakl ob'ektini yaratamiz. Yaxshiyamki, C# ning ajoyib axlat yig'uvchisi bor... Lekin gap kollektorda emas, C# da bola formasini qanday ochish va undan keyin asosiy formaga qaytish kerak?

Boshlash uchun boshlang'ich (dastlabki) ma'lumotlarni o'rnatamiz.

Shunday qilib. Bizda asosiy ariza shakli mavjud:

Ushbu shaklda TBDialog nomli TextBox va biz bosishimiz kerak bo'lgan tugma tugmasi ham mavjud:

  1. O'tish qiymati Matn xususiyatlari TBDialog-dan TBMain-ga;
  2. fDialogni yoping;

Endi butun jarayonni tartibda ko'rib chiqaylik.

Birinchidan, shuni yodda tutish kerakki, sukut bo'yicha C# da barcha xususiyatlar, o'zgaruvchilar va usullarga modifikator tayinlangan. xususiy- shuning uchun ikkinchi shakldan birinchisida boshqaruvga o'tish uchun biz TBMain uchun modifikatorni o'rnatishimiz kerak. ommaviy o'z-o'zidan. Buning uchun forma konstruktorida TBMain elementini tanlang, xususiyatlar oynasiga o'ting va mulk qiymatini o'zgartirish Modifikatorlar Bilan xususiy yoqilgan ommaviy

Endi TBMain boshqa ob'ektlarda ko'rinadi. Keling, davom etaylik. Shaklni modal rejimda ochish uchun ShowDialog() usuli uchun ikkita variantdan birini ishlatishimiz kerak:

ommaviy DialogResult ShowDialog() ; ommaviy DialogResult ShowDialog(IWin32Window egasi);

Birinchi holda, usul formani modal dialog oynasi sifatida joriy faol oyna egasi sifatida o'rnatgan holda ko'rsatadi, ikkinchisida esa modal oynamiz uchun qaysi shakl egasi bo'lishini mustaqil ravishda belgilashimiz mumkin.

Masalan, ShowDialog() usulining ikkinchi versiyasidan foydalanamiz va ikkinchi shaklni modal ko'rsatamiz. Buning uchun biz quyidagilarni yozamiz:

Bu erda men yana foyda oldim kalit so'z bu , bu joriy ob'ektga ishora qiladi, ya'ni. asosiy shaklni egasi sifatida belgilang ( fMain). Endi to'g'ridan-to'g'ri muammomizni hal qilishga o'tamiz va savolga javob beramiz: qiymatni bir shakldan boshqasiga qanday o'tkazish mumkin? Har bir nazorat o'ziga xos xususiyatga ega Egasi - bu ota-onaga ishora qiladi:

Endi siz loyihani ishga tushirishingiz va bolalar formasidagi TextBox-dagi matn birinchisidagi TextBox-ga mukammal tarzda uzatilishiga ishonch hosil qilishingiz mumkin. Har holda, men misolda muhokama qilingan loyihaning manba kodini joylashtiraman.