Hapja e një forme tjetër në shek. Hapja e një formulari të dytë dhe kalimi i të dhënave në formularin kryesor

Abonohu
Bashkohuni me komunitetin "shango.ru"!
Në kontakt me:

Sot dua të flas se si të krijoj një projekt Windows Forms në C++ në Visual Studio 2013 IDE Fakti është se, duke filluar me VS 2012, artikulli i aplikacionit Windows Forms u hoq nga lista e projekteve që mund të krijohen. Tani po flas për atë në C++, ju mund të krijoni një projekt të tillë në C# duke zgjedhur artikullin e duhur në seksionin për projektet e krijuara. Megjithatë, fakti që një projekt i tillë nuk mund të zgjidhet nga lista nuk do të thotë se nuk mund ta krijoni vetë. Kjo është pikërisht ajo për të cilën dua të flas në këtë artikull.

Gjëja e parë që duhet të bëni është të nisni Visual Studio. Pasi të jetë nisur VS, klikoni Skedar > I ri > Projekt

Pas kësaj, do të hapet një dritare që ju kërkon të zgjidhni një lloj projekti. Duhet të zgjedhim nënseksionin CLR në seksionin Visual C++ dhe të zgjedhim Blank CLR Project.

Kur të krijohet projekti, në Solution Explorer, kliko me të djathtën mbi projektin e krijuar. Në menynë e kontekstit që hapet, zgjidhni Shto > Krijo Element dhe në menynë që hapet, në seksionin UI, zgjidhni Format e Windows

Pasi të shtohet formulari, zgjidhni skedarin MyForm.cpp në Solution Explorer. Një skedë e re do të hapet para jush me një rresht të vetëm kodi:

#include "MyForm.h"

Ne duhet të shtojmë kodin e mëposhtëm në këtë skedar:

Përdorimi i sistemit të hapësirës së emrave; duke përdorur hapësirën e emrave System::Windows::Forms; void Kryesor (arresë ^ args) (Application::EnableVisualStyles();Application::SetCompatibleTextRenderingDefault(false);Project1::FormMyForm;Application::Run(%form); )

Pas kësaj në pronat e projektit. Zgjidhni një nënseksion Sistemi seksioni Linker dhe në rreshtin Subsystem nga menyja rënëse, zgjidhni Windows (/SUBSYSTEM:WINDOWS) dhe klikoni Apliko.

Pa mbyllur dritaren e vetive të projektit, shkoni te nënseksioni Advanced dhe në rresht Pika e hyrjes ne shkruajmë Kryesor dhe më pas shtypni tastin NE RREGULL.
Kjo plotëson cilësimet e projektit. Për të modifikuar pamjen e formularit, duhet të shkoni te skeda MyForm.h [Designer] duke klikuar dy herë në skedarin MyForm.h në Solution Explorer.

Përkundër faktit se mendimi im për Visual Studio-n e Microsoft-it mbetet i njëjtë, ndonjëherë ju duhet të bëni diçka për të. Nëse pajtohemi me faktin se ne shkruajmë, në fakt, jo në C++, por në të ashtuquajturën C++/CLI, puna me komponentë vizuale të njohura nuk do të jetë aq e ndryshme nga të njëjtat mjedise Borland. Por mund të krijojë probleme, në krahasim me Builder, le të shqyrtojmë 3 situata tipike të punës me një aplikacion që përmban më shumë se një formë.

Një shembull i ndërtimit dhe thirrjes programatike të një forme

Ky kod mund të ekzekutohet, për shembull, duke klikuar një buton në formën kryesore Form1.

Form^form2 = gcnew Form(); Butoni^ button2 = gcnew Button(); button2->Text = L"OK"; butoni2->Vendndodhja = Pika(10,10); form2->Text = L"Dritarja ime"; form2->HelpButton = e vërtetë; form2->FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedDialog; form2->StartPosition = FormStartPosition::CenterScreen; forma2->Kontrollet->Shto(butoni2); form2->ShowDialog();

Për të shtuar një mbajtës për klikim të një butoni të krijuar në mënyrë programore2, thjesht shkruani përpara rreshtit të fundit të kodit:

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

Përpara se të thirret metoda form2->ShowDialog() ose form2->Show();

Në këtë rast, kodi i mbajtësit ndodhet në modulin aktual Form1.h:

Privat: Sistemi:: Butoni i zbrazët2_Klikoni(Sistemi::Objekti^ dërguesi, Sistemi::EventArgs^ e) (Kutia e mesazheve:: Shfaq ("Këtu"); )

Thirrni një formë tjetër nga forma kryesore

Në meny, zgjidhni Projekt - Shto një element të ri - Forma - Emri Form2

Le të shtojmë një operator

#include "Form2.h"

përpara hapësirës së parë të emrave në Form1.h (d.m.th., në fillim të skedarit).

Le të përfshijmë një tregues për shembullin e klasës në seksionin publik të klasës Form1:

Forma2^F2;

Le të shtojmë kodin ku duhet të krijojmë dhe të thërrasim formularin e dytë:

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

Për të fshirë në mënyrë programore formën e dytë, kodi i mëposhtëm është i përshtatshëm:

F2 F2;

Duhet të theksohet se treguesi ruan adresën e vetëm një formulari, atij që është krijuar i fundit. Nëse krijojmë në mënyrë sekuenciale disa forma duke përdorur këtë kod, vetëm i fundit do të fshihet. Përndryshe, provoni grupin e formave të përshkruar më poshtë.

Le të përshkruajmë të dhënat e nevojshme në formën e klasës Form1 (këtu emri dhe hapësira e emrit të projektit Tabulator, nëse është e nevojshme, zëvendësojeni me tuajin):

Const statike int MAX_FORMS = 100; //Numri maksimal i formularëve në FormCount; //Formoni një grup numërues ^F2; //Treguesi drejt një grupi formash

Pastaj ne inicializojmë të dhënat duke përdorur ngjarjen Load të formës kryesore:

FormCount=0; F2 = grup gcnew (MAX_FORMA);

Pastaj ne implementojmë kodin për të krijuar formularin tjetër

Nëse (FormCount Shfaqje();

) else MessageBox::Show("Shumë forma!");

dhe heqja e tij:

Nëse (FormCount) (fshini F2; FormCount--;)

Nëse duam të krijojmë forma fëmijë jo veçmas, por brenda formës prind, atëherë në vetitë e Form1 duhet të tregojmë se është një "paraardhës" (vendosni vetinë IsMdiParent = e vërtetë), dhe përpara se të shfaqim formën e fëmijës duke përdorur F2->Trego operatorin(), shënojeni si fëmijë Form1:

F2->MdiParent = kjo;

Thirrni një metodë të formularit prind nga një formular fëmijë

Vështirë se mund të bëjmë pa përdorur skedarë .cpp, gjë që nuk është gjë e keqe - shkrimi i kodit në skedarët .h në përgjithësi thyen sistemin e duhur C :)

Le të përshkruajmë procesin hap pas hapi.

1) Ka 2 forma - Form1 dhe Form2, në Form1 ka një Buton (buton1, do të hapë formën e dytë) dhe Label (label1, këtu do të ndryshojmë tekstin). Në Form2 - butonin1, kur të klikohet, teksti në label1 do të ndryshojë.

2) Meqenëse duhet të kemi akses në të dytin nga forma e parë, dhe nga e dyta në të parën, do të lindë problemi i referencave të kryqëzuara (kur Form1.h i referohet Form2.h, i cili, nga ana tjetër, i referohet përsëri tek Forma1.h) . Për të shmangur këtë, kodin e formularit të parë (Form1), i cili do të ketë akses në formën e dytë (Form2), do ta zhvendosim nga skedari .h në skedarin .cpp. Kështu, ju duhet të krijoni një skedar Form1.cpp.

3) Deklaroni një metodë publike Set në Form1.h në mënyrë që të mund të ndryshoni tekstin e label1 (kodi mund të shkruhet në fund të skedarit, pas #pragma endregion):

Publike: grup i pavlefshëm (String^ tekst) ( label1->Text = tekst; )

4) Në skedarin Form2.h përfshijmë Form1.h (në fillim):

#include "Form1.h"

dhe krijoni një konstruktor që do të pranojë dhe ruajë një lidhje në formën e parë për përdorim të mëtejshëm:

Form2(Form1^ prind) ( InitializeComponent(); prindForm = prind; ) //më poshtë menjëherë më poshtë mund të shkruani një lidhje: private: Form1^ prindForm;

5) Duke klikuar butonin në Formularin2, ne do të thërrasim metodën Set të formularit prind:

Privat: Sistemi::Butoni i zbrazët1_Klikoni(Sistemi::Object^ dërguesi, Sistemi::EventArgs^ e) ( prindForm->Set("përshëndetje nga forma2"); parentForm->Shfaq(); this->Fshih(); )

Pyetja e trajtuar në këtë artikull ka më shumë gjasa të lidhet me temën e ndërtimit të një arkitekture aplikacioni, dhe jo në mënyrë specifike me problemin në shqyrtim. Transferimi i të dhënave nga një formë në tjetrën nuk është aspak e vështirë. Për ta bërë këtë, mjafton të hapim kontrollin, të dhënat e të cilit duam t'i marrim, domethënë ta shënojmë me modifikuesin publik. Gjithashtu, një opsion tjetër është i mundur. Për shembull, në formën e parë ne krijojmë një objekt të formës së dytë duke kaluar një referencë për veten tonë te konstruktori, domethënë duke kaluar një referencë tek e para nga forma e parë në të dytën.
SecondForm secondForm = i ri SecondForm(this);
Natyrisht, para se ta bëni këtë, duhet të kujdeseni për krijimin e një mbingarkese për konstruktorin e formës së dytë.

Dhe kjo metodë është mjaft e zakonshme. Sidoqoftë, me thjeshtësinë e tij, ajo mbart shumë probleme të mundshme, kryesore është një shkelje e parimit të kapsulimit. Me një fjalë, forma e dytë nuk duhet të dijë asgjë për ekzistencën e së parës dhe aq më tepër nuk duhet të jetë në gjendje të ndikojë në të.

Zgjidhja e këtij problemi është mjaft e thjeshtë. Le të shohim drejtpërdrejt kodin. Në projektues, ne krijojmë formën kryesore (ajo do të hapet kur të fillojë aplikacioni). Le të vendosim një Kuti teksti, Etiketa Dhe Butoni.

Duke klikuar në butonin, do të hapet forma e dytë dhe teksti nga fusha e tekstit të formularit kryesor do të transferohet në fushën e tekstit të formularit të dytë. Fillimisht, forma e dytë duket kështu:

Ngjashëm me të parën, ka të njëjtat kontrolle. Nuk na duhet më. Pika e hyrjes së aplikacionit hap formën kryesore:

Përdorimi i Sistemit; duke përdorur System.Collections.Generic; duke përdorur System.Linq; duke përdorur System.Windows.Forms; hapësira e emrave From1FormTo2 ( Programi i klasës statike ( // Pika kryesore e hyrjes për aplikacionin. static void Main() (Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); ) )

Kodi kryesor i formës duket si ky:

Përdorimi i Sistemit; duke përdorur System.Collections.Generic; duke përdorur System.ComponentModel; duke përdorur System.Data; duke përdorur System.Drawing; duke përdorur System.Linq; duke përdorur System.Text; duke përdorur System.Windows.Forms; hapësira e emrit From1FormTo2 ( klasa publike e pjesshme MainForm: Form ( //forma e dytë SecondForm secondForm; //konstruktor publik MainForm() ( InitializeComponent(); ) //trajtësi i ngjarjeve të transferimit të të dhënave //nga forma kryesore në voidin e dytë privat btn_mainForm_Click(objekt dërguesi, EventArgs e) ( secondForm = new SecondForm(tb_mainForm.Text.Trim()); secondForm.ShowDialog(); if (secondForm.DialogResult == DialogResult.OK) tb_mainForm.Text = secondForm.ReturnData())))

Prandaj, mos harroni të lidhni butonin me ngjarjen Klikoni. Këtu në klasën e formës kryesore ka një fushë SecondForm secondForm, që përfaqëson objektin e formës së dytë. Kur klikoni në butonin "Dërgo", krijohet një formë e dytë (konstruktori i mbingarkuar quhet, ne do ta krijojmë më vonë) dhe niset duke përdorur metodën ShowDialog(). Në këtë rast, kjo metodë është e përshtatshme për ne. Për më tepër, pas kësaj ne sigurohemi që të kontrollojmë nëse formulari i dytë ishte i mbyllur, por klikuar në butonin e tij. Nëse një buton është klikuar në formularin e dytë, atëherë formulari i parë duhet të pranojë të dhëna nga i dyti. Kjo ndodh duke thirrur metodën Të dhënat e kthimit () në formën e dytë.

Tani pjesa më interesante është kodi i formës së dytë:

Përdorimi i Sistemit; duke përdorur System.Collections.Generic; duke përdorur System.ComponentModel; duke përdorur System.Data; duke përdorur System.Drawing; duke përdorur System.Linq; duke përdorur System.Text; duke përdorur System.Windows.Forms; hapësira e emrit From1FormTo2 ( klasa publike e pjesshme SecondForm: Form ( //ndërtues i mbingarkuar publik SecondForm(të dhëna string) ( InitializeComponent(); tb_secondForm.Text = të dhëna; ) //trajtuesi i ngjarjeve të transferimit të të dhënave //nga forma e dytë në atë kryesore, zbrazëti private btn_secondForm_Click (dërguesi i objektit, EventArgs e) ( this.DialogResult = DialogResult.OK; ) //metoda publike për qasjen //fushën e tekstit të kësaj forme string publik ReturnData() ( return (tb_secondForm.Text.Trim()); ) )

Siç mund ta shihni, ekziston një mbingarkesë e vetme e konstruktorit që pranon një lloj vargu. Mos harroni se ne po përpiqemi të transferojmë tekst nga një TextBox. Në konstruktor, komponentët planifikohen të inicializohen dhe teksti i fushës së tekstit vendoset në vlerën e transmetuar nga forma e parë. Më pas, duke u abonuar në ngjarje Klikoni për butonin e formës së dytë, ne krijuam një mbajtës btn_secondForm_Click, i cili simulon funksionimin e butonit “Ok” të çdo kutie dialogu. Kështu, duke klikuar në butonin “Dërgo” (të formës së dytë), ekzekutojmë kushtin

(secondForm .DialogResult == DialogResult .OK)

Forma e parë, pra, duke thirrur metodën secondForm .ReturnData(), ne vendosim fushën e tekstit të formës së parë në vlerën e fushës së tekstit të formës së dytë.

Funksionimi i kësaj metode, mendoj, nuk kërkon më shpjegim. Ai thjesht e kthen tekstin nga një fushë e vetme teksti, duke e mbajtur atë private.

Si rezultat, ne transferuam të dhënat në formën e dytë nga e para dhe nga e dyta në të parën pa shkelur parimet e kapsulimit.

Provoni të futni tekstin "aaa" në fushën e tekstit të formularit të parë dhe të klikoni butonin. Këtë tekst do ta shihni në fushën e tekstit në formën e dytë që hapet. Provoni ta ndryshoni tekstin në "aaa ppp" dhe klikoni në butonin. Do të shihni se si, pas mbylljes së formularit të dytë, ky tekst do të shfaqet në fushën e tekstit të formularit kryesor.

Tani, mendoj se do të jeni në gjendje t'i transferoni të dhënat midis formularëve më saktë. Në artikullin vijues do të flasim se si ta bëjmë atë në aplikacionet ASP.NET.

Ndonjëherë është e nevojshme të aksesoni elementët e një forme nga një tjetër gjatë ekzekutimit të programit. Për shembull, ekziston një formë Form1, prej saj hapim një tjetër Form2 dhe tani, duke punuar në Form2, duhet të aksesojmë elementët e formës mëmë Form1. Kam gjetur disa mënyra për ta bërë këtë.

Metoda 1. Kalimi i një referimi në një ndryshore publike.

Hapësira e emrit WindowsApplication1 (klasa publike e pjesshme Form1: Form (publik Form1() ( InitializeComponent(); ) button private void1_Click(object sender, EventArgs e) (Form2 frm = new Form2(); frm.but1 = this.button1; // dërgo lidhje me butonin në formën Form2 frm.ShowDialog( ) )

Në Form2, ndryshorja të cilës i është kaluar lidhja tani do të korrespondojë me butonin1 nga Form1

Hapësira e emrit WindowsApplication1 ( klasa publike e pjesshme Form2: Form ( Button publik but1; // kjo variabël do të përmbajë një lidhje me butonin1 nga Form1 publike Form2() ( InitializeComponent(); = "test" // ndryshoni tekstin në butonin 1 të Formularit ) )

Metoda e 2-të. Kalimi i lidhjes në formularin e fëmijës.

Thelbi është afërsisht i njëjtë në metodën e parë. Kur hapim Form2, ne kalojmë në të një lidhje me elementin që planifikojmë ta ndryshojmë më vonë.

Hapësira e emrit WindowsApplication1 ( klasa publike e pjesshme Form1: Form ( publike Form1() ( InitializeComponent(); ) button private void1_Click(object sender, EventArgs e) (Form2 frm = New Form2(this.button1); // kaloni një lidhje te butoni në formularin Form2 frm.ShowDialog() ) )

Tani në Form2 duhet të krijojmë një variabël që do të përmbajë një lidhje me këtë buton dhe përmes tij do të aksesojmë butonin në Form1 (rreshtat 5,7,9 dhe 15).

Hapësira e emrave WindowsApplication1 ( klasa publike e pjesshme Form2: Form ( Button privat but1; // kjo ndryshore do të përmbajë një lidhje me butonin e butonit1 nga forma Form1 public Form2(Button but) // merrni një lidhje me butonin në variablin por ( but1 = but; )

Metoda e 3-të. Qasje në të gjithë formularin e prindit.

Për ta bërë këtë, ju duhet të bëni ndryshime në disa skedarë, por në të njëjtën kohë ne do të kemi akses në të gjithë elementët e formularit prind dhe nuk kemi nevojë të kalojmë një lidhje për secilin element, si në metodën 1.

Hapi 1. Në dosje Programi.cs krijoni një variabël publike f1 (rreshti 5).

Hapësira e emrave WindowsApplication1 ( Programi i klasës statike ( Publik statik Form1 f1; // variabël që do të përmbajë një lidhje me formularin Form1 static void Main() ( Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(forma e re1( ) ) ) )

Hapi 2. Hapja Form1.Designer.cs dhe në të, për elementet që do të duhet të aksesohen nga një formë tjetër, ne ndryshojmë privatepublike. Për shembull, le të vendosim butonin1 në Form1 të disponueshëm për ndryshime.

Sistemi Publik.Windows.Forms.Butoni i butonit1; // zëvendësohet private me publike

Hapi 3. Kur krijojmë Form1, ne i caktojmë variablit f1 një lidhje në këtë formë (rreshti 7)

Hapësira e emrit WindowsApplication1 ( klasa publike e pjesshme Form1: Form (publik Form1() ( Program.f1 = kjo; // tani f1 do të jetë një lidhje me formularin Form1 InitializeComponent(); frm = New Form2();

Hapi 4. Tani nga absolutisht çdo formë ose nga çdo klasë mund të aksesoni elementin button1 që ndodhet në Form1 si kjo: Program.f1.button1. Për shembull, lëreni butonin në Form2 të ndryshojë tekstin e butonit në Form1:

Hapësira e emrit WindowsApplication1 ( klasa publike e pjesshme Form2: Form ( publike Form2() ( InitializeComponent(); ) button private void1_Click(object sender, EventArgs e) ( Program.f1.button1.Text = "test"; // Ndrysho tekstin në butoni i formularit Forma1)))



Kthimi

×
Bashkohuni me komunitetin "shango.ru"!
Në kontakt me:
Unë jam abonuar tashmë në komunitetin "shango.ru".