Membuka formulir lain di c. Membuka formulir kedua dan meneruskan data ke formulir utama

Langganan
Bergabunglah dengan komunitas "shango.ru"!
Berhubungan dengan:

Hari ini saya ingin berbicara tentang cara membuat proyek Windows Forms di C++ di Visual Studio 2013 IDE Faktanya adalah, mulai VS 2012, item Aplikasi Windows Forms telah dihapus dari daftar proyek yang dapat dibuat. Sekarang saya sedang berbicara tentang yang ada di C++; Anda dapat membuat proyek seperti itu di C# dengan memilih item yang sesuai di bagian untuk proyek yang dibuat. Namun, fakta bahwa proyek semacam itu tidak dapat dipilih dari daftar tidak berarti Anda tidak dapat membuatnya sendiri. Inilah yang ingin saya bicarakan di artikel ini.

Hal pertama yang perlu Anda lakukan adalah meluncurkan Visual Studio. Setelah VS diluncurkan, klik File > Baru > Proyek

Setelah ini, sebuah jendela akan terbuka meminta Anda untuk memilih jenis proyek. Kita perlu memilih subbagian CLR di bagian Visual C++ dan memilih Proyek CLR Kosong.

Ketika proyek dibuat, di Solution Explorer, klik kanan pada proyek yang dibuat. Di menu konteks yang terbuka, pilih Tambah > Buat Elemen dan di menu yang terbuka, di bagian UI, pilih Formulir Windows

Setelah formulir ditambahkan, pilih file MyForm.cpp di Solution Explorer. Tab baru akan terbuka di depan Anda dengan satu baris kode:

#sertakan "Form Saya.h"

Kita perlu menambahkan kode berikut ke file ini:

Menggunakan Sistem namespace; menggunakan namespace System::Windows::Forms; batal Utama (array ^ args) ( Aplikasi::EnableVisualStyles(); Aplikasi::SetCompatibleTextRenderingDefault(false); Project1::Formulir Saya; Aplikasi::Jalankan(%form); )

Setelah itu di properti proyek. Pilih subbagian Sistem bagian Linker dan di baris Subsistem dari menu tarik-turun, pilih Windows (/ SUBSYSTEM:WINDOWS) dan klik Terapkan.

Tanpa menutup jendela properti proyek, buka subbagian Lanjutan dan di baris Titik masuk kami menulis Utama lalu tekan tombol OKE.
Ini menyelesaikan pengaturan proyek. Untuk mengedit tampilan formulir, Anda perlu masuk ke tab MyForm.h [Designer] dengan mengklik dua kali pada file MyForm.h di Solution Explorer.

Meskipun pendapat saya tentang Visual Studio Microsoft tetap sama, terkadang Anda harus melakukan sesuatu terhadapnya. Jika kita menerima kenyataan bahwa kita menulis, sebenarnya, bukan dalam C++, tetapi dalam apa yang disebut C++/CLI, bekerja dengan komponen visual yang familiar tidak akan jauh berbeda dari lingkungan Borland yang sama. Tapi itu bisa menimbulkan masalah, dibandingkan dengan Builder. Mari kita pertimbangkan 3 situasi umum bekerja dengan aplikasi yang berisi lebih dari satu formulir. Contoh lingkungannya adalah Visual C++ 2010 Express, diasumsikan bahwa formulir utama memiliki nama default Form1.

Contoh pembuatan dan pemanggilan formulir secara terprogram

Kode ini dapat dieksekusi, misalnya dengan mengklik tombol di form utama Form1.

Formulir^form2 = gcnew Formulir(); Tombol^ tombol2 = Tombol gcnew(); tombol2->Teks = L"OK"; button2->Lokasi = Titik(10,10); form2->Teks = L"Jendela saya"; form2->Tombol Bantuan = benar; form2->FormBorderStyle = Sistem::Windows::Forms::FormBorderStyle::FixedDialog; form2->StartPosition = FormStartPosition::CenterScreen; form2->Kontrol->Tambahkan(tombol2); form2->TampilkanDialog();

Untuk menambahkan pengendali untuk mengklik tombol tombol2 yang dihasilkan secara terprogram, cukup tulis sebelum baris kode terakhir:

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

Sebelum metode form2->ShowDialog() atau form2->Show() dipanggil;

Dalam hal ini, kode handler terletak di modul saat ini Form1.h:

Pribadi: System::Void button2_Click(System::Object^ pengirim, System::EventArgs^ e) ( MessageBox::Show("Here"); )

Panggil formulir lain dari formulir utama

Di menu, pilih Proyek - Tambahkan elemen baru - Formulir - nama Form2

Mari tambahkan operator

#sertakan "Formulir2.h"

sebelum namespace pertama di Form1.h (yaitu, di awal file).

Mari sertakan pointer ke instance kelas di bagian publik kelas Form1:

Bentuk2^F2;

Mari tambahkan kode di mana kita perlu membuat dan memanggil formulir kedua:

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

Untuk menghapus formulir kedua secara terprogram, kode berikut ini cocok:

Hapus F2;

Perlu dicatat bahwa penunjuk hanya menyimpan alamat satu formulir, formulir yang terakhir dibuat. Jika kita secara berurutan membuat beberapa form menggunakan kode ini, hanya yang terakhir yang akan dihapus. Alternatifnya, coba susunan bentuk yang dijelaskan di bawah.

Mari kita uraikan data yang diperlukan dalam formulir kelas Form1 (di sini nama dan namespace proyek Tabulator, jika perlu, ganti dengan milik Anda sendiri):

Konstanta statis int MAX_FORMS = 100; //Jumlah maksimum formulir int FormCount; //Bentuk susunan penghitung ^F2; //Penunjuk ke array formulir

Kemudian kami menginisialisasi data menggunakan event Load dari form utama:

Jumlah Formulir=0; F2 = array baru (MAX_FORMS);

Kemudian kita implementasikan kode tersebut untuk membuat form berikutnya

Jika (FormCount Menunjukkan();

) else MessageBox::Show("Terlalu banyak formulir!");

dan penghapusannya:

Jika (FormCount) ( hapus F2; ​​FormCount--; )

Jika kita ingin membuat formulir anak tidak secara terpisah, tetapi di dalam formulir induk, maka di properti Formulir1 kita perlu menunjukkan bahwa itu adalah "leluhur" (atur properti IsMdiParent = true), dan sebelum menampilkan formulir anak menggunakan F2->Show() operator, tandai sebagai anak Form1:

F2->MdiParent = ini;

Panggil metode formulir induk dari formulir anak

Kita hampir tidak dapat melakukannya tanpa menggunakan file .cpp, dan ini bukan hal yang buruk - menulis kode dalam file .h biasanya merusak sistem C yang benar :)

Mari kita jelaskan prosesnya langkah demi langkah.

1) Ada 2 form - Form1 dan Form2, pada Form1 ada Button (tombol1, akan membuka form kedua) dan Label (label1, disini kita akan mengubah teks). Pada Form2 - button1, ketika diklik maka teks pada label1 akan berubah.

2) Karena kita perlu memiliki akses ke bentuk kedua dari bentuk pertama, dan dari bentuk kedua ke bentuk pertama, masalah referensi silang akan muncul (ketika Form1.h merujuk ke Form2.h, yang, pada gilirannya, merujuk lagi ke Formulir1.h) . Untuk menghindari hal ini, kami akan memindahkan kode formulir pertama (Form1), yang akan memiliki akses ke formulir kedua (Form2), dari file .h ke file .cpp. Jadi, Anda perlu membuat file Form1.cpp.

3) Deklarasikan metode Set publik di Form1.h sehingga Anda dapat mengubah teks label1 (kode dapat ditulis di akhir file, setelah #pragma endregion):

Publik: void Set(String^ teks) ( label1->Teks = teks; )

4) Pada file Form2.h kita sertakan Form1.h (di awal):

#sertakan "Formulir1.h"

dan buat konstruktor yang akan menerima dan menyimpan tautan ke formulir pertama untuk digunakan lebih lanjut:

Form2(Form1^ parent) ( InitializeComponent(); parentForm = parent; ) //di bawah tepat di bawah Anda dapat menulis link: private: Form1^ parentForm;

5) Saat mengklik tombol di Form2, kita akan memanggil metode Set dari form induk:

Pribadi: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) ( parentForm->Set("hello from form2"); parentForm->Show(); this->Hide(); )

Pertanyaan yang dibahas dalam artikel ini lebih cenderung berhubungan dengan topik membangun arsitektur aplikasi, dan tidak secara spesifik dengan masalah yang sedang dipertimbangkan. Mentransfer data dari satu formulir ke formulir lainnya tidaklah sulit sama sekali. Untuk melakukan ini, cukup membuat kontrol yang datanya ingin kita peroleh terbuka, yaitu menandainya dengan pengubah publik. Pilihan lain juga dimungkinkan. Misalnya pada form pertama kita membuat objek form kedua dengan meneruskan referensi diri kita sendiri ke konstruktor, yaitu dengan meneruskan referensi ke form pertama dari form pertama ke form kedua.
SecondForm secondForm = new SecondForm(ini);
Tentu saja, sebelum melakukan ini, Anda harus berhati-hati dalam menciptakan kelebihan beban untuk konstruktor formulir kedua.

Dan cara ini cukup umum. Namun, dengan kesederhanaannya, hal ini membawa banyak potensi masalah, yang utama adalah pelanggaran prinsip enkapsulasi. Singkatnya, bentuk kedua seharusnya tidak mengetahui apapun tentang keberadaan bentuk pertama dan terlebih lagi, tidak dapat mempengaruhinya.

Solusi untuk masalah ini cukup sederhana. Mari kita lihat langsung kodenya. Di desainer, kami membuat formulir utama (akan diluncurkan saat aplikasi dimulai). Mari kita taruh satu Kolom tulisan, Label Dan Tombol.

Dengan mengklik tombol tersebut, formulir kedua akan terbuka dan teks dari kolom teks formulir utama akan ditransfer ke kolom teks formulir kedua. Awalnya, bentuk kedua terlihat seperti ini:

Mirip dengan yang pertama, kontrolnya sama. Kami tidak membutuhkannya lagi. Titik masuk aplikasi meluncurkan formulir utama:

Menggunakan Sistem; menggunakan System.Collections.Generik; menggunakan System.Linq; menggunakan System.Windows.Forms; namespace From1FormTo2 ( kelas statis Program ( // Titik masuk utama untuk aplikasi. static void Main() ( Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); ) ) )

Kode formulir utama terlihat seperti ini:

Menggunakan Sistem; menggunakan System.Collections.Generik; menggunakan Sistem.ComponentModel; menggunakan Sistem.Data; menggunakan Sistem.Gambar; menggunakan System.Linq; menggunakan Sistem.Teks; menggunakan System.Windows.Forms; namespace From1FormTo2 ( kelas parsial publik MainForm: Formulir ( //bentuk kedua SecondForm secondForm; //konstruktor public MainForm() ( InitializeComponent(); ) //pengendali peristiwa transfer data //dari formulir utama ke private void kedua btn_mainForm_Click(object pengirim, EventArgs e) ( secondForm = new SecondForm(tb_mainForm.Text.Trim()); secondForm.ShowDialog(); if (secondForm.DialogResult == DialogResult.OK) tb_mainForm.Text = secondForm.ReturnData(); ) ) )

Oleh karena itu, jangan lupa untuk menghubungkan tombol tersebut ke acara tersebut Klik. Di sini, di kelas formulir utama ada bidang Bentuk KeduaBentuk kedua, mewakili objek bentuk kedua. Ketika Anda mengklik tombol "Kirim", formulir kedua dibuat (konstruktor yang kelebihan beban dipanggil, kami akan membuatnya nanti) dan diluncurkan menggunakan metode ini TampilkanDialog(). Dalam hal ini, metode ini cocok untuk kita. Selain itu, setelah ini kami pastikan untuk memeriksa apakah formulir kedua sudah ditutup, tetapi tombolnya diklik. Jika tombol diklik pada formulir kedua, maka formulir pertama harus menerima data dari formulir kedua. Hal ini terjadi dengan memanggil metode tersebut Data Pengembalian() dalam bentuk kedua.

Sekarang bagian yang paling menarik adalah kode bentuk kedua:

Menggunakan Sistem; menggunakan System.Collections.Generik; menggunakan Sistem.ComponentModel; menggunakan Sistem.Data; menggunakan Sistem.Gambar; menggunakan System.Linq; menggunakan Sistem.Teks; menggunakan System.Windows.Forms; namespace From1FormTo2 ( kelas parsial publik SecondForm: Formulir ( //konstruktor kelebihan beban public SecondForm(string data) ( InitializeComponent(); tb_secondForm.Text = data; ) //pengendali peristiwa transfer data //dari formulir kedua ke formulir utama private void btn_secondForm_Click (pengirim objek, EventArgs e) ( this.DialogResult = DialogResult.OK; ) //metode publik untuk mengakses //bidang teks dari formulir ini string publik ReturnData() ( return (tb_secondForm.Text.Trim()); ) ) )

Seperti yang Anda lihat, ada satu konstruktor kelebihan beban yang menerima tipe string. Ingatlah bahwa kami mencoba mentransfer teks dari TextBox. Di konstruktor, komponen dijadwalkan untuk diinisialisasi dan teks bidang teks diatur ke nilai yang dikirimkan dari bentuk pertama. Selanjutnya dengan berlangganan event tersebut Klik untuk tombol formulir kedua, kami membuat penangan btn_secondForm_Klik, yang mensimulasikan pengoperasian tombol "Ok" di kotak dialog mana pun. Jadi, dengan mengklik tombol “Kirim” (dari formulir kedua), kami menjalankan ketentuan tersebut

(Bentuk kedua .DialogResult == DialogResult .OK)

Oleh karena itu, bentuk pertama dengan memanggil metode Formulir kedua .ReturnData(), kita atur kolom teks formulir pertama ke nilai kolom teks formulir kedua.

Pengoperasian metode ini, menurut saya, tidak memerlukan penjelasan lagi. Itu hanya mengembalikan teks dari satu bidang teks, sekaligus menjaganya tetap pribadi.

Hasilnya, kami mentransfer data ke bentuk kedua dari bentuk pertama dan dari bentuk kedua ke bentuk pertama tanpa melanggar prinsip enkapsulasi.

Coba masukkan teks “aaa” ke dalam kolom teks formulir pertama dan klik tombol. Anda akan melihat teks ini di bidang teks pada formulir kedua yang terbuka. Coba ubah teksnya menjadi “aaa ppp” dan klik tombolnya. Anda akan melihat bagaimana, setelah menutup formulir kedua, teks ini akan muncul di kolom teks formulir utama.

Sekarang, saya rasa Anda akan dapat mentransfer data antar formulir dengan lebih tepat. Pada artikel selanjutnya kita akan membahas tentang cara melakukannya di aplikasi ASP.NET.

Kadang-kadang diperlukan untuk mengakses elemen suatu formulir dari formulir lainnya selama eksekusi program. Misalnya, ada formulir Form1, dari situ kita membuka Form2 lain dan sekarang, saat bekerja di Form2, kita perlu mengakses elemen formulir induk Form1. Saya menemukan beberapa cara untuk melakukan ini.

metode pertama. Melewati referensi ke variabel publik.

Namespace WindowsApplication1 ( kelas parsial publik Form1: Formulir ( public Form1() ( InitializeComponent(); ) private void button1_Click(pengirim objek, EventArgs e) ( Form2 frm = new Form2(); frm.but1 = this.button1; // kirim tautan ke tombol dalam bentuk Form2 frm.ShowDialog();

Di Form2, variabel yang dilewati tautan sekarang akan sesuai dengan tombol1 dari Form1

Namespace WindowsApplication1 ( kelas parsial publik Form2: Formulir ( Tombol publik tapi1; // variabel ini akan berisi tautan ke tombol1 dari Formulir1 publik Formulir2() ( InitializeComponent(); ) private void button1_Click(pengirim objek, EventArgs e) ( but1.Teks = "test"; // mengubah teks pada tombol button1 dari Form1 ) ) )

metode ke-2. Melewati tautan ke formulir anak.

Esensinya kurang lebih sama pada metode pertama. Saat membuka Form2, kami meneruskan ke dalamnya tautan ke elemen yang ingin kami ubah nanti.

Namespace WindowsApplication1 ( kelas parsial publik Form1: Formulir ( public Form1() ( InitializeComponent(); ) private void button1_Click(pengirim objek, EventArgs e) ( Form2 frm = new Form2(this.button1); // meneruskan tautan ke tombol ke formulir Form2 frm.ShowDialog();

Sekarang di Form2 kita perlu membuat variabel yang berisi link ke tombol ini dan melaluinya kita akan mengakses tombol di Form1 (baris 5,7,9 dan 15).

Namespace WindowsApplication1 ( kelas parsial publik Form2: Formulir ( Tombol pribadi tapi1; // variabel ini akan berisi tautan ke tombol tombol1 dari formulir Form1 publik Form2(Tombol tapi) // dapatkan tautan ke tombol di variabel tapi ( tapi1 = but; // sekarang but1 akan menjadi tautan ke tombol button1 InitializeComponent(); ) private void button1_Click(pengirim objek, EventArgs e) ( but1.Text = "test"; // ubah teks pada tombol button1 dari Form1 ) ) )

metode ke-3. Akses ke seluruh formulir induk.

Untuk melakukan ini, Anda perlu membuat perubahan pada beberapa file, tetapi pada saat yang sama kita akan memiliki akses ke semua elemen formulir induk dan tidak perlu meneruskan tautan ke setiap elemen, seperti pada metode 1.

Langkah 1. Dalam berkas Program.cs buat variabel publik f1 (baris 5).

Namespace WindowsApplication1 ( kelas statis Program ( public static Form1 f1; // variabel yang akan berisi tautan ke formulir Form1 static void Main() ( Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1( ) );

Langkah 2. Pembukaan Formulir1.Desainer.cs dan di dalamnya, untuk elemen yang perlu diakses dari bentuk lain, kita ubah pribadi pada publik. Sebagai contoh, mari kita membuat button1 pada Form1 tersedia untuk perubahan.

Sistem Publik.Windows.Forms.Tombol Tombol1; // mengganti privat dengan publik

Langkah 3. Saat membuat Formulir1, kami menetapkan variabel f1 tautan ke formulir ini (baris 7)

Namespace WindowsApplication1 ( kelas parsial publik Form1: Formulir ( public Form1() ( Program.f1 = ini; // sekarang f1 akan menjadi tautan ke formulir Form1 InitializeComponent(); ) private void button1_Click(pengirim objek, EventArgs e) ( Form2 frm = Formulir2 baru(); frm.ShowDialog();

Langkah 4. Sekarang dari formulir apa pun atau dari kelas mana pun Anda dapat mengakses elemen button1 yang terletak di Form1 seperti ini: Program.f1.button1. Misalnya, biarkan tombol di Form2 mengubah teks tombol di Form1:

Namespace WindowsApplication1 ( kelas parsial publik Form2: Formulir ( public Form2() ( InitializeComponent(); ) private void button1_Click(pengirim objek, EventArgs e) ( Program.f1.button1.Text = "test"; // Ubah teks pada tombol formulir Formulir1 ) ) )



Kembali

×
Bergabunglah dengan komunitas "shango.ru"!
Berhubungan dengan:
Saya sudah berlangganan komunitas “shango.ru”.