Szoftverfejlesztés .NET platformon - MCP 70-526 tanfolyam
Időpont: 2007.04.16-2007.04.20. 16:00:00-19:30:00
A tanfolyam végén MCP vizsgalehetőséget lehet kapni, annak, aki
- mind az 5 alkalmon bent volt
- a pénteki teszten a jobbik 50%-ban szerepelt
A vizsgához MCTS könyvet lehet kölcsönözni. 10 példány van belőle, de a CD mellékletén fenn van a teljes könyv kereshető formában. A tanfolyam a könyv 15 fejezetéből 10-et fed le.
Előadók:
- Követelmények ismertetése: Lippé Szabolcs
- Fóliák: Kereskényi Robi
2007.04.16. Windows Forms alapok
- Form propertyk: mi a neve, mi a hatása. Említettük: StartPosition (felülbírálja a sima Position-t), Opacity, TopMost.
- Form példányosítása, megjelenítése.
- Események, létrehozásuk designerből vagy kódból.
- Egyedi alakú form: megjelenítés előtt Region propertyt kell állítani, GraphicsPath típusú objektumot vár.
Ilyenkor nincs címsor, bezáró gomb. stb.
Controlok elhelyezése
- Controlok rakhatók közvetlenül a formra vagy helyőrzőbe (Panel, GroupBox, stb.)
- Panel: benne lévő controlok öröklik a panel tulajdonságait (pl. Enabled, Visible, Position, Font), lehet benne scrollozni (AutoScroll=true)
- GroupBox: Panel + keret + cím, nem tud automatikusan scrollozni. Használják pl. RadioButtonok csoportosítására.
- FlowLayoutPanel: a benne lévő controlokat folytatólagosan helyezi el a megadott irányban, támogatja a sortörést. Manuális sortörés: SetFlowBreak(control): a megadott control elé sortörést illeszt be.
- TableLayoutPanel: táblázatos megjelenítés. Alapból az első üres cellába teszi be a controlt. Sorok számozása 0-tól kezdődik, oszlopoké 1-től. 1 cellába csak 1 control mehet. Beállítható, hogy új sorral, új oszloppal vagy ne bővítse automatikusan.
- TabControl: támogatja az automatikus scrollozást, definiálható a tabok sorrendje.
- SplitContainer: két panel, közötte mozgatható elválasztó vonal. Az egyik panel beállítható collapsed-nek (nem látható). Beállítható az egyik panel fix méretűre (ablak átméretezéskor számít). Orientation: vízszintes vagy függőleges. Megadható a paneleknek minimális méret.
- Control elhelyezése konténeren belül:
- Anchor: a control milyen távolságot tartson a konténer széleitől. Alapból a konténer átméretezésekor balra és fölfelé tartja a távolságot.
- Dock: olyan anchor, ami 0 távolságot tart a konténer megadott széleitől.
control.Dock=DockStyle.Fill: kitölti a teljes szélességet és magasságot.
- View / Document Outline: a controlok hierarchiáját mutatja. A controlok drag&drop módszerrel áthelyezhetők az egyik konténerből a másikba.
- Designer támogatás
- Control elhelyezése formon 4 módszerrel (drag&drop, control választás
- Áthelyezéskor segédvonalakkal (snap lines) segíti a pontos elhelyezést.
- Több control property-i egyszerre is szerkeszthetők.
- Smart tagbe ki vannak vezetve a legfontosabb szerkesztési funkciók.
Control típusok
Egyszerű
- TextBox: 1 vagy többsoros (MultiLine=true) szövegbevitelhez. Sortörés, scrollbarok, automatikus kiegészítés beállítható (AutoCompleteMode, AutoCompleteSource). Jelszó bevitel: TextMode, PasswordChar.
- MaskedTextBox: csak bizonyos karaktereket vagy karaktersorozat mintákat fogad el. Pl telefonszám, serial number vagy IP cím beírása. A minta fix karaktereit prompt karakternek hívják. A Text property alapból a sallangot is visszadja, átállítás: CutCopyMaskFormat, TextMaskFormat.
- NumericUpDown: textbox + föl-le nyilacska.
- DomainUpDown: előre definiált string listában (Items) lépked.
- CheckBox
- Checked: be van-e pipálva.
- CheckedState: Checked, Unchecked, Indeterminate (3 állapotú). Semleges állapotban akkor lehet, ha ThreeState=true.
- TrackBar: csúszka, minimum és maximum érték között lehet navigálni.
- SmallStep: balra-jobbra nyíl mennyit mozgasson, LargeStep: Page Up-Page Down mennyit mozgasson.
- Value: kiválasztott érték.
- MonthCalendar: dátumot lehet vele választani.
- Beállítható minimális és maximális dátum és maximális intervallum hossz.
- PictureBox
- Image: System.Drawing.Image típusú objektumot lehet hozzákötni
- ImageLocation: file-t vagy url-t jelenít meg
- SizeMode: ő kövesse a kép méretét vagy a képet kicsinyítse
- WebBrowser
- Navigate(string path): megjeleníti egy url vagy egy file tartalmát, akár IE pluginnal is (pl. Word).
- Lehet vele nyomtatni.
- NotifyIcon: tray menü + sárga buborék
- BalloonTipIcon, BalloonTipTitle, BalloonTipText, ContextMenu
Lista
- ListBox, ComboBox, ListView, CheckedListBox, stb.
- Adatkötés: DataSource, DataMember, FormatString
- Elemek: Items, SelectedIndex (0-tól kezdődik), SelectedIndices, SelectedItem. Elemhalmaz módosítása: Add (végére), AddRange (végére sokat), Insert, RemoveAt, Remove. Keresés: IndexOf(), találat: >=0, nincs találat: -1.
- Rendezés: Sort tulajdonság
- SelectionMode: SingleSelect, MultiSelect (egyszerre hányat lehetten kiválasztani)
- DropDownStyle: a ComboBox képes sima vagy legördülő listaként megjelenni
- CheckedListBox
- Nem köthető.
- Kiválasztott elemek: CheckedIndices
- ListView
- Több módja van: egyszerű lista, detail nézet, kis ikonok, nagy ikonok.
- Detail nézet a benne tárolt objektumok property-it jeleníti meg.
- Képek megjelenítése detail nézetben: ImageList nem vizuális kontrolból kell képet (ImageKey vagy index) választani.
- TreeView: adatok hierarchikus megjelenítésére alkalmas. Egy elemnek egy szülője lehet. Design time és kódból is felvehetők az elemek (TreeNode-ok).
- Be lehet állítani, hogy mi legyen automatikusan kinyitva. Feltölthető kinyitáskor is.
- A TreeNode tárol egy csomó pointert: FirstNode, NextNode, ParentNode, ChildNodes
Access key hozzárendelése
Access key = ugrás textboxra Alt+betűvel.
Tegyük fel, hogy van egy labelünk és egy textboxunk.
- label.UseMnemonic=true.
- label.Text-ben & karakter az egyik betű elé.
- Label TabOrder-e legyen 1-gyel kisebb, mint a kapcsolódó TextBox-é.
- Nem csak labellel működik.
Menü
- MenuStrip: MenuStripItemeket tartalmaz.
- ToolStrip: ToolStripItemeket tartalmaz, összerendelhető menü elemekkel
- Beállítható, hogy átrendezhető legyen a felhasználó által, merge-ölhető legyen, hogyan merge-ölődjön, kitöltse a teljes szélességet (Stretch=true).
- Label, Combobox, stb. controloknak van ToolStripItem leszármazott változatuk is.
- ToolStripContainer: lehetővé teszi a toolbar dokkolását (megadható, hogy melyik oldalakra). A tartalmat a ContentPaneljébe kell belerakni. Belepakolhatók a ToolStripek és a menü is.
- SoftKey: Alt+betű hatására a menüpontra ugrik, ShortcutKey: végre is hajtja a menüpontot. Szöveg: ShortcutKeyDisplayString.
- A menüpontokhoz checkbox is rendelhető: Checked, AutoChecked.
- Visible=false: a menüpont nem jelenik meg, Enabled=false: megjelenik, de ki van szürkítve.
- Context menü is rendelhető a controlokhoz (ContextMenu property)
Események
- Click, DoubleClick, MouseEnter, MouseMove, MouveLeave (esemény paraméter: MouseEventArgs)
- KeyPressed, KeyDown, KeyUp (esemény paraméter: KeyEventArgs)
Mintapélda
Virtual PC image: =c:\Program Files\Microsoft Learning46\Drives46B-LON-DEV-01-01.vmc=
- Konfiguráció: Visual Studio 2005 + SQL Server 2005
- user: student vagy administrator, jelszó: Pa$$w0rd
- Minta alkalmazás lépésről lépésre: E:\Labfiles\Solution46B_W01_LA.doc
2004.04.17. Adatbázis kliens oldali programozása, adatkötés
Adatbázis kapcsolódás
- Connection: pipeline az adatbázishoz. Alapból 4-féle típusa van: SqlConnection, OracleConnection, OLEConnection (pl. Office-hoz), ODBCConnection. Komponensként a designerben Toolbox/Data, de alapból nem látszik, a context menü Choose Items menüpontjával lehet berakni. Megnyitni az Open() metódussal, lezárni a Close metódussal lehet.
- Provider: a fizikai adatforrással fel tudja venni a kapcsolatot, felülről nézve egységes interfészt nyújt.
Connection létrehozása varázslóval
- Data menü / Add New Data Source
- Server Explorer / Add Connection
- Data Source: Microsoft SQL Server
- Server Name: .
- Database Name: AdventureWorks
Server Explorer/Data Connections/lon-dev-01.AdventureWorks.dbo-t kiválasztva a Properties ablakban Connection String=
Data Source=.; Initial Catalog=AdvertureWorks; Integrated Security=true
A Connection Stringet érdemes az
app.config
-ban tárolni.
<connectionStrings> <add name="myconnectionstring" connectionString="Data Source=.;Initial Catalog=AdvertureWorks;Integrated Security=true"/> </connectionStrings> Gond: ha a connection string jelszót tartalmaz, az látszik a plain text file-ban is. Lehet titkosítani az =app.config= szakaszait 3-4 hívással, részletek a könyvben.
SQL Connection API
- =conn.InfoMessage= esemény: adatbázistól jövő hibaüzenetekre fut le az eseménykezelője.
- Connection pooling: alapból be van kapcsolva, kikapcsolni a Pool=false paraméterrel lehet a connection stringben.
- Hiba esetén SqlException-t dob, ami egy SqlErrorCollection-t tartalmaz belül.
- Elérhető szerverek listája:
DataTable dt = SqlDataSourceEnumerator.Instance.GetDataSources();
. Megmondja a szerver nevet, instance nevet, verziót, és hogy clusterezett-e az adatbázis szerver. A tűzfal letilthatja az SQL szerverek felderítését. Ugyanúgy okozhat hibát a túlterhelt hálózat (timeout), vagy ha az SQL Server 2005-ben nem fut az SQL Server Browser Service.
SqlCommand API
Az SqlCommand segítségével le lehet futtatni tetszőleges SQL utasítást vagy tárolt eljárást.
- SQL utasítás: =cmd.CommandText="<SQL utasítás>";=
- Tárolt eljárás: =cmd.CommandText="<tárolt eljárás neve>"; cmd.CommandType=CommandType.StoredProcedure;=
- Tárolt eljárás: =cmd.CommandText="EXEC <tárolt eljárás neve>";=
Paraméterezés:
- cmd.Parameters kollekciót kell feltölteni.
Előnye a string összefűzéshez képest: átlátható, nincs SQL Injection veszély.
- Parameters property elemei SqlParameter példányok. Ennek van neve (
ParameterName
), értéke (Value
), típusa (SqlDbType
).
Parancs végrehajtása:
- Nincs visszatérési érték: =cmd.ExecuteNonQuery();=
- Egy visszatérési érték: =cmd.ExecuteScalar();=. objectet ad vissza, nekünk kell castolnunk. Ha tábla lenne a visszatérési érték, az első sor első oszlopát kapjuk meg.
- Tábla visszatérési érték: =cmd.ExecuteReader();=. SqlDataReader-t ad vissza, amin végig lehet iterálni.
- BLOB olvasása: http://msdn2.microsoft.com/en-us/library/87z0hy49(VS.80).aspx
=SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess);=
=rdr.GetBytes(columnIndex, startIndex, buffer, 0, bufferSize);=
- tábla olvasása:
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess);<br> while (rdr.Read()) {<br> int value1 = (int)rdr["oszlopnév"];<br> int value2 = rdr.GetInt32(oszlopSorszam);<br> }
Kapcsolatmentes adatbázis elérés
- DataSet: adatbázist reprezentál.
- DataSet.Tables: DataTable kollekció.
- DataTable.Columns: oszlopok.
- DataTable.Rows: sorok.
A DataSet lehet típusos vagy nem típusos. Típusos DataSet létrehozása:
- Solution Explorer / Add New Item... / DataSet
- Server Explorerből húzzunk rá egy táblát.
- Fordítsuk le.
- A kódból pl. =DataSet1= néven elérhető a generált típusos =DataSet=.
1. Típusos =DataSet= használata (
Contact
a benne lévő tábla neve)
DataSet1 ds = new DataSet1(); DataSet1TableAdapters.ContactTableAdapter ta = new DataSet1TableAdapters.ContactTableAdapter(); ta.Fill(ds.Contact); foreach (DataSet1.ContactRow cr in ds.Contact.Rows) listBox1.Items.Add(cr.FirstName + " " + cr.LastName);
2. A DataAdapter a Toolboxról is felhúzható a formra, ekkor egy varázslóval lehet beállítani, hogy mi jelenjen meg.
3. Nem típusos =DataSet= használata kódból:
SqlDataAdapter da = new SqlDataAdapter("SELECT ...", conn); // legenerálja az INSERT, UPDATE, DELETE commandokat is a SELECT-ből SqlCommandBuilder cb = new SqlCommandBuilder(da); DataSet ds = new DataSet(); da.Fill(ds); // DataSet listázása foreach (DataRow dr in ds.Tables[1].Rows) MessageBox.Show((string)dr[0]); // DataSet megjelenítése DataGridView-ban dataGridView1.DataSource = ds.Tables[0];
Mintapélda
- Virtual PC image: =c:\Program Files\Microsoft Learning46\Drives46B-LON-DEV-01-04.vmc=
- Minta alkalmazás lépésről lépésre: E:\Labfiles\Solution46B_W04_LA.doc
2007.04.18. XML, nyomtatás, globalizáció, drag&drop
XML kezelés
Soros olvasás / írás
=XmlReader=: XML beolvasás sorosan. Nem tárolja a korábban beolvasorr részleteket. Metódusai:
- konstruktor:
XmlReader rdr = XmlReader.Create("file név");
- beolvasás
- =ReadInnerXml=: az aktuális element belsejét olvassa be.
- =ReadOuterXml=: az element nyitó részét, belsejét és záró részét olvassa be.
- =Read=: következő részlet beolvasása. A =NodeType= alapján kell elágazni.
=XmlWriter=: XML írás sorosan. Tud elementet, attribútumot, stb. írni.
- =WriteStartElement("name")=
- =WriteEndElement()=: tudja, hogy mit kell lezárni.
XML beolvasása egyszerre
- konstruktor: =XmlDocument doc = new XmlDocument(); doc.Load("file");=
- file teljes tartalma: =doc.OuterXml=
- módosítás
- =doc.CreateElement(name);=
- =element.SetAttribute(name, value);=
- =node.AppendChild(child);=
- =node.PrependChild(child);=
- =node.Replace(...);=
- betöltődés közben a következő események hívódnak meg
- =NodeInserting=
- =NodeInserted=
Órai feladat
Könyveket (amik belül chaptereket tartalmaznak) beolvasni XML file-ból, listázást, beszúrást, mentést implementálni.
Nyomtatás
=PageSetupDialog=: oldalméret, margók
=PrintPreviewDialog=: nyomtatási előnézet, egyszerre sok lapot is meg tud mutatni. Ugyanazzal a mechanizmussal működik, mint az éles nyomtatás.
=PrintPageEventHandler=: itt történik a nyomtatás, egy Graphics-re kell rajzolni. Az eseménykezelő megkap paraméterként egy =PrintPageEventArgs= objektumot. Attribútumai:
- =Cancel=: nyomtatás megszakítása
- =HasMorePages=: nyomtatás befejezése. Ha true, még egyszer ki fog váltódni a =PrintPage= esemény.
- =PrintMarginBounds=: margók
- =PageBounds=:
A nyomtatást bonyolítja, hogy nem automatikus a sortörés és a lapozás.
- Nyomtatható sorok száma: =e.MarginBounds.Height / font.GetHeight(e.Graphics)=
- Szöveg kiírása: =e.graphics.DrawString(szöveg, font, Brushes.Black, x, y, new StringFormat());=
Órai feladat
- adott méretű (több oldalra kiterjedő) ellipszist kinyomtatni
- többsoros szöveg tördelése
2. megoldás:
string lorem = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed " + "do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad " + "minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip " + "ex ea commodo consequat. Duis aute irure dolor in reprehenderit in " + "voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur " + "sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt " + "mollit anim id est laborum."; private void Form1_Load(object sender, EventArgs e) { PrintDocument doc = new PrintDocument(); doc.PrintPage += new PrintPageEventHandler(doc_PrintPage); PrintPreviewDialog preview = new PrintPreviewDialog(); preview.Document = doc; preview.ShowDialog(); } void doc_PrintPage(object sender, PrintPageEventArgs e) { Font font = new Font("Arial", 12); float fontHeight = font.GetHeight(e.Graphics); e.Graphics.DrawString(lorem, font, Brushes.Black, e.MarginBounds, new StringFormat()); }
Globalizáció és lokalizáció
- *Globalizáció*: előre definiált formázások hogyan jelenjenek meg (dátum, pénz, stb.)
- *Lokalizáció*: alkalmazásban lévő szövegek fordítása
Az aktuális globalizációs kultúrát a =Thread.CurrentThread.CurrentCulture= tartalmazza, a lokalizációs kultúrát a =Thread.CurrentThread.CurrentUICulture=.
Form fordítása a Designerben:
- =form1.Localizable= = true
- =form1.Language = (Default)= mellett megszerkeszteni a formot
- =form1.Language = English= mellett megszerkeszteni az angol változatot (ilyenkor új controlokat nem lehet hozzáadni)
A lokalizált formokat nem tárolja le teljes egészében, csak a különbségeket jegyzi meg.
Nyelvet legkésőbb a form konstruktorában az =InitializeComponent()= hívás előtt lehet váltani.
Drag & drop
Szükséges egy forrás és egy cél control.
- Egér esemény hatására a forrás controlon meg kell hívni egy =DoDragDrop= metódust. Első paramétere: dragelendő objektum, második paramétere: mód (copy/move/stb.)
- A cél controlon az =AllowDrop= tulajdonságot true-re kell állítani. Kiváltódnak a következő események:
- =DragOver=, =DragLeave=: föléhúzzuk az egeret, illetve elhúzzuk róla
- =DragEnter=: tudja-e fogadni az adott controlt az adott módban. A =DragEventArgs= paraméter mutatja, hogy mi érkezett.
- =DragDrop=: dropoláskor hívódik meg.
Órai példa: két textbox között szöveg másolása.
- =textBox1_MouseMove= eseménykezelőben =DoDragDrop(textBox1.Text, DragDropEffects.Copy | DragDropEffects.Move);=
- =textBox2_DragEnter= eseménykezelőben: =e.Effect = DragDropEffects.Copy;=
- =textBox2_DragDrop= eseménykezelőben: =textBox2.Text = (string) e.Data.GetData(DataFormats.Text);=
2007.04.19. MDI, többszálúság, controlok írása
MDI formok
- New Windows Application
- New Form, Name: =ChildForm=, húzzunk rá egy MultiLine TextBoxot, és állítsuk be a Dock tulajdonságát Fillre.
- A régi formnak állítsuk az IsMdiContainer tulajdonságát true-ra, tegyünk fel rá egy menüt és hozzuk létre a következő menüpontokat:
File/New
ChildForm form = new ChildForm(); form.MdiParent = this;
Window
Meg lehet adni egy top-level menüt, amiben felsorolja a nyitott ablakokat.
menuStrip1.MdiWindowListItem = windowToolStripMenuItem;
Window/Tile vertical
this.LayoutMdi(MdiLayout.TileVertical)
File/Open
ChildForm
-ban létre kell hozni egy publikus propertyt =TText= néven, és hozzákötni a benne lévő textbox textjéhez.
OpenFileDialog opf = new OpenFileDialog() if (opf.ShowDialog == DialogResult.OK) { ChildForm newForm = new ChildForm(); newForm.Text = opf.FileName; newForm.MdiParent = this; StreamReader sr = new StreamReader(opf.FileName, Encoding.Default); newForm.TText = sr.ReadToEnd(); sr.Close(); newForm.Show(); }
File/Identify
MessageBox.Show(this.ActiveMdiChild.Text);
Ha konkrétan a =TText= propertyre lenne szükségünk, először castolni kéne
ChildForm
-ra.
Önálló feladat
Felvenni a menübe egy font- és egy színválasztó dialógust, ami megváltoztatja a kiválasztott gyerekablak szövegének stílusát.
Többszálúság és háttér folyamatok kezelése
1. =BackgroundWorker=: a toolboxon a Data alatt található meg, nem vizuális komponens.
- Indítása: =RunWorkerAsync= metódushívás
- A hosszú ideig futó metódusokat a =DoWork= eseménykezelőben kell implementálni. Paramétere: =DoWorkEventArgs=
- a =Cancel= propertyjével jelezhető, hogy meg akarjuk szakítani. A megszakítást kézzel kell implementálni.
- átadhatunk egy paramétert az =Argument= propertyben
- visszaadhatjuk az eredményt a =Result= propertyben
- =RunWorkerCompleted=: befejezéskor hívódik meg
2.
TimeConsumingMethodDelegate
-ek használata
- delegate = típusos függvényreferencia
- hívni a =BeginInvoke= metódussal kell, az =EndInvoke= pedig addig blokkol, amíg nem fejeződött be a futás
- a =BeginInvoke= visszaad egy =IAsyncResult= objektumot, amit lehet pollolni, amíg be nem fejeződött a futás
- be lehet állítani egy eseményt, ami a futás végén következik be
3. =Thread= használata
- A form szála a főszál. Háttérszál: nem várja be a gyerek szálak befejeződését.
- Thread pool használata: =ThreadPool= osztály, szálakat lehet elkérni tőle, és a futás végén visszaadni.
- Ha a szálak közös memóriaterületet használnak, szinkronizáció szükséges.
Legegyszerűbb a kritukus szakasz használata. Egy kritikus szakaszban egyszerre csak egy szál lehet.
A Windows Forms controlok csak abból a szálból hívhatók, amelyikben létre lettek hozva. Tipikusan a főszálban hozzuk létre őket.
public delegate void SetProgressDelegate(int val); public void SetProgress(int val) { if (progressBar1.InvokeRequired) { SetProgressDeleagte del = new SetProgressDelagete(SetProgress); this.Invoke(del, new object[] { val }); } else { progressBar1.Value = val; } }
Controlok készítése
User control
Meglévő controlok egy halmaza, ami együtt nyújt egy funkcionalitást. Pl. login form. Kívülről nem érhetők el a tartalmazott controlok, amire szükségünk van, publikus tulajdonságként kell kivezetni. A =System.Windows.Forms.UserControl= osztályból származik.
Demo: óra control
- New Windows Application
- Add New Item: User Control
- Rakjunk rá egy labelt és egy timert, az utóbbit engedélyezzük.
- Tick eseményben: =label1.Text = DateTime.Now.ToLongTimeString();=
A user control háttérszínét be lehet állítani speciálisan:
- =clock.BackColor = Color.Transparent=: a form látszik alatta
- =clock.BackColor = Color.Yellow; form1.TransparenceKey = Color.Yellow=: a form alatti dolgok látszanak alatta
A kész control kikerül a toolboxra default ikonnal. Ha felül akarjuk definiálni, létre kell hozni egy =ToolboxBitmap= attribútumot, ami egy 16x16-os ikont ad vissza.
- =[ToolboxBitmap(GetType(System.Windows.Forms.Button))]=: a gombhoz tartozó képet rakja be a designerbe
- =[ToolboxBitmap("file")]=: egy .bmp-t rak be a designerbe
Custom Control
System.Windows.Forms.Control
-ból származik.
Meglévő controlt nem tudunk ráhúzni, de komponenst igen. Az =OnPaint= eseménykezelőt kell felüldefiniálni. A =PaintEventArgs= paraméteren keresztül kapjuk meg a =Graphics= objektumot.
Demo: óra control
- New Windows Application
- Add New Item: Custom Control
- Rakjunk rá egy timert, engedélyezzük, a =Tick= eseménykezelőbe írjuk be, hogy =this.Invalidate();=
- =OnPaint= eseménykezelőbe: =e.Graphics.DrawString(DateTime.Now.ToLongTimeString(), new Font("Verdana", 24), Brushes.Red, 0, 0);=
Extended control
Meglévő controlt is ki lehet egészíteni leszármaztatással.
Demo: áthúzott gomb
class AthuzottGomb: System.Windows.Forms.Button { private Color lineColor = Color.Blue; public Color LineColor { ... } protected override void OnPaint(PaintEventArgs pevent) { pevent.Graphics.DrawLine(new Pen(lineColor, 3), 0, 0, this.Width, this.Height)) } }
Önálló feladat
- Készítsünk Login User Controlt.
- Készítsünk egy gombot, ami számolja, hogy hányszor nyomtuk meg, és kijelzi a jobb felső sarokban.
- Készítsünk el egy ProgressBart Custom Controlként.
2007.04.20. Dialógusablakok, setup
Dialógusablakok
Funkciókat ki lehet emelni külön formra, dialógusablakba. Pl. beépített dialógusok: font választás, szín választás, nyomtatási előnézet, ... Általában van 2 gombja: OK, Cancel. Azt, hogy melyiket nyomták meg, a =ShowDialog= metódus visszatérési értékében kapjuk meg.
- Modális dialógusablak: megnyitás után csak a dialógushoz lehet hozzáférni, az alkalmazás főablakához nem.
- Nem modális dialógusablak: nem blokkol
Dialógusablak létrehozása
- Project / Add New Item / Windows Form
- =button1_click=: =this.DialogResult = DialogResult.OK; Close;=
- =button2_click=: =this.DialogResult = DialogResult.Cancel; Close;=
- Ha a fő formon
Show
-val hívjuk a dialógusablakot, akkor nem modális lesz, haShowDialog
-gal, akkor modális. - A
ShowDialog
-nak paraméterként átadhatjuk a szülő formot. - A dialógus eredményét (pl. kiválasztott szín) beírhatjuk egy propertybe, ahonnan kiolvassa a hívó.
Gyakorlat: 2546/6
Telepítő készítése
Visual Studioban Setup Project (az alkalmazással azonos solution-be)
- Szokásos telepítő funkciókat támogatja (kód file másolás, adat file másolás, shortcut, ...)
- Telepítés helye gyakorlatilag bármi lehet
.NET 2.0 újdonságok:
- ClickOnce
- Automatikus alkalmazás frissítés
Gyakorlat: 2546/9
-- Peti - 2007.04.20.