***21.11. MDI aplikacije (Multiple Document Interface)
Postoje dva osnovna tipa aplikacija SDI i MDI. Kod SDI aplikacija (Single-document interface) može se samo jedan dokument otvoriti u jednom trenutku. Primer SDI aplikacije je Notepad. Kod MDI aplikacija (Multiple document interface) nekoliko dokumenata se može otvoriti istovremeno. MDI aplikacija se sastoji od jednog roditeljskog prozora i jednog ili više prozora potomaka.
MDI (Multiple Document Interface) aplikacije omogućavaju korišćenje više prozora unutar jednog glavnog prozora.
Karakteristike MDI aplikacija:
- Glavna forma (Parent): Sadrži menije, alatne trake i podprozore (child windows).
- Podprozori (Child forms): Unutrašnje forme koje se otvaraju u glavnoj formi.
- Korišćenje menija: MDI aplikacije često koriste menije za upravljanje podprozorima, omogućavajući otvaranje novih, zatvaranje, i prebacivanje između prozora.
Koraci za kreiranje MDI aplikacije:
- Pokretanje Visual Studio-a: Napraviti novi projekat tipa Windows Forms App.
- Podešavanje glavne forme (Parent Form): U svojstvima glavne forme, postaviti svojstvo
IsMdiContainerna True. Ovo svojstvo označava da će forma biti MDI roditelj. - Dodavanje menija u glavnu formu:
- Dodati MenuStrip u glavnu formu i kreirati menije poput "File" i opcije "New" za otvaranje novih podprozora.
- dvoklikom na stavku u meniju treba programski kreirati instancu druge forme (forma dete koja će da se prikaže), postaviti da je to "dete" ove forme (this) i prikazati je
- za svaku stavku u meniju se programira šta se desi kada se klikne (sem za listu "dece" - formi)
- Za prebacivanje između otvorenih prozora se može postaviti posebna stavka u meniju
- stavka za prikaz postojeće "dece" (formi) se dodaje za ceo MenuStrip preko property: MdiWindowListItem -tu treba odabrati stavku u meniju koja će da služi za to
(Ovo nije jedini način rada - može se postaviti da se automatski sve učitava - podprozori u glani prozor. )
Kako bi to izgledalo:
Kod za kreiranje glavne forme (MDI roditelj)
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
// Postavi formu kao MDI roditelja
this.IsMdiContainer = true;
}
// Događaj za otvaranje nove podforme
private void newToolStripMenuItem_Click(object sender, EventArgs e)
{
// Kreiraj novu podformu (Child form)
ChildForm childForm = new ChildForm();
childForm.MdiParent = this; // Postavi roditelja
childForm.Show(); // Prikaži podformu
}
}
public partial class ChildForm : Form
{
public ChildForm()
{
InitializeComponent();
}
}
Primeri za pojedine stavke MenuStrip-a za MDI aplikaciju:
Ako želimo da zatvorimo aktivnu podformu: (klik da vidiš kod)
private void closeToolStripMenuItem_Click(object sender, EventArgs e)
{
if (this.ActiveMdiChild != null)
{
this.ActiveMdiChild.Close(); // Zatvori aktivnu podformu
}
}
Ako želimo da preuredimo kako su podprozori poređani: (klik da vidiš primer)
MDI aplikacije često omogućavaju preuređivanje otvorenih prozora koristeći opcije poput Tile ili Cascade. U nastavku su oba primera:
private void cascadeToolStripMenuItem_Click(object sender, EventArgs e)
{
this.LayoutMdi(MdiLayout.Cascade); // Preuredi podprozore u kaskadu
}
private void tileHorizontalToolStripMenuItem_Click(object sender, EventArgs e)
{
this.LayoutMdi(MdiLayout.TileHorizontal); // Preuredi podprozore horizontalno
}
Primer 1:
U nastavku je video predavanje - onako kako možemo da radimo prvu vežbu:
Kreirati aplikaciju sa glavnom formom i dve forme unutar nje. Na prvoj podformi treba da je dugme sa kojim se prikazuje slika (logo C#), a na drugoj da je dugme za prikaz kako radi naredba if (sliku napraviti u Paint-u). Na kraju predavanja je zadat i domaći zadatak:
Primer 2
Kreirati MDI aplikaciju u kojoj se nalazi meni sa sledećim opcijama:
- forma za unos,
- forma za prikaz,
- otvoreni podprozori,
- aktivni prozor u levo,
- aktivni prozor u desno,
- zatvori aktivni prozor,
- zatvori aplikaciju
- Klikom na opciju "forma za unos" treba da se otvori podforma za unos podataka: ime, prezime, godina rođenja, razred, smer. Kako se kuca, podaci treba da se smeštaju u odgovarajuće statičke promenljive na formi.
- Klikom na opciju "forma za prikaz" treba da se otvori prazna forma za prikaz na kojoj se nalazi samo jedno dugme. klikom na dugme se preuzimaju podaci sa prve forme i prikazuju u labelama druge forme.
- Klikom na opciju "aktivni prozori" treba da se vidi koje su sve forme otvorene
- Opcije "aktivni prozor u LEVO" i "aktivni prozor u DESNO" treba da "prilepi" aktivni podprozor u levu ili desnu polovinu glavnog prozora
- Klikom na opciju "zatvori aktivni prozor" treba da se zatvori podprozor na kojem je fokus
- Klikom na opciju "Zatvori aplikaciju" se zatvara kompletna aplikacija
Primer 3 (preuzet od 2. grupe ): pokušati ovo uraditi kod kuće
- Primer je preuzet iz 2. grupe, pa je i način postavljanja zadatka malo drugačiji - bliži nastavniku koji radi sa tom grupom. -
Napraviti novi projekat (windows forms aplikacija), sa početnom formom i još tri forme (ukupno 4 forme). Imena formi mogu ostati kao po default-u (Form1, Form2, Form3, Form4).
Prva forma treba da bude roditelj za ostale forme (proglasiti je MDI roditeljem). Na nju postaviti MenuStrip sa opcijom Forme, a kao podopcije: Forma 2 i Forma 4
Na drugu formu treba postaviti 4 TextBox-a: ime, prezime, smer, godina upisa i jedno dugme na kojem piše "Prebaci podatke". Klikom na dugme "Prebaci podatke" sa druge forme treba da se pojavi treća forma i u njenim labelama da se ispišu podaci koji su se nalazili u TextBox-ovima druge forme, koristeći odgovarajuće pomoćne promenljive koje su napravljene na formi 3.
(Na treću formu postaviti 4 labele sa istim nazivima ...)
Na četvrtu formu takođe postaviti 4 labele i ToolStrip meni. Klikom na prvo dugme u ToolStrip-u treba da se učitavaju podaci iz TextBox-ova druge forme korišćenjem pomoćne statičke instance forme 2, odnosno direktnim pristupom TextBox-ovima forme 2 sa forme 4. Drugo dugme u ToolStrip-u treba da zatvara formu 4.
Rešenja poslednjeg zadatka (jedna od verzija):
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication7
{
public partial class Form1 : Form
{
public static Form1 f1;
public Form1()
{
InitializeComponent();
f1 = this;
}
private void forma2ToolStripMenuItem_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.MdiParent = this;
f2.Show();
}
private void forma4ToolStripMenuItem_Click(object sender, EventArgs e)
{
Form4 f4 = new Form4();
f4.MdiParent = this;
f4.Show();
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication7
{
public partial class Form2 : Form
{
public static Form2 f2;
public TextBox txt1;
public TextBox txt2;
public TextBox txt3;
public TextBox txt4;
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
f2 = this;
txt1 = textBox1;
txt2 = textBox2;
txt3 = textBox3;
txt4 = textBox4;
}
private void button1_Click(object sender, EventArgs e)
{
Form3 f3 = new Form3();
f3.MdiParent = Form1.f1;
f3.ime = textBox1.Text;
f3.prezime = textBox2.Text;
f3.smer = textBox3.Text;
f3.godina = int.Parse(textBox4.Text);
f3.Show();
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication7
{
public partial class Form3 : Form
{
public string ime;
public string prezime;
public string smer;
public int godina;
public Form3()
{
InitializeComponent();
}
private void Form3_Load(object sender, EventArgs e)
{
label1.Text = ime;
label2.Text = prezime;
label3.Text = smer;
label4.Text = godina.ToString();
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication7
{
public partial class Form4 : Form
{
public Form4()
{
InitializeComponent();
}
private void toolStripButton2_Click(object sender, EventArgs e)
{
this.Close();
}
private void toolStripButton1_Click(object sender, EventArgs e)
{
label1.Text = Form2.f2.txt1.Text;
label2.Text = Form2.f2.txt2.Text;
label3.Text = Form2.f2.txt3.Text;
label4.Text = Form2.f2.txt4.Text;
}
}
}