Grafikus C# – Windows Forms tanfolyam › 0.8 lecke Windows Forms · 0.8 lecke Honnan tudja a számítógép, hogy melyik ablakot kell megjeleníteni, és mikor ér véget a program? A válasz a Program.cs fájlban és az Application.Run sorban van. Ebben a leckében megnézzük, hogyan indul el egy Windows Forms alkalmazás, és milyen állomásokon megy át egy ablak a létrejöttétől a bezárásáig.Program.cs, Application.Run és a Form élete

A lecke végére
- elmagyarázod, mi a
Mainmetódus és a belépési pont; - érted, mit csinál az
Application.Run(new Form1()); - tudod, mi az a főablak, és mikor ér véget a program;
- ismered a Form életciklusának fő állomásait:
Load,Shown,FormClosing,FormClosed; - egy
FormClosingeseménnyel megerősítést kérsz kilépéskor; - módosítod, hogy melyik ablak induljon először.
Mielőtt elkezded
Ehhez a leckéhez kell egy működő Windows Forms projekt, amelyben már írtál egy eseménykezelőt. Hasznos a 0.2 lecke esemény fogalma is.
A Program.cs és a Main metódus
A konzolprogramnál megszoktad, hogy a program a Main metódusnál indul. A Windows Forms alkalmazásban ez ugyanígy van, csak a Main metódus a Program.cs fájlban van, és ablakot indít.
using System;
using System.Windows.Forms;
namespace MiniWord
{
internal static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}Az újabb .NET sablonban az első három sor helyett egyetlen sor, az ApplicationConfiguration.Initialize(); áll, amint a 0.4 leckében láttad. Az utolsó sor mindkettőben ugyanaz.
Az Application.Run: ez indítja az ablakot
Application.Run(new Form1());Ez a sor a program szíve. Amíg az ablak nyitva van, az Application.Run nem tér vissza, hanem folyamatosan figyeli és kezeli az eseményeket: kattintást, billentyűleütést, ablak átméretezését. Ezért nem ér véget azonnal a Main, mint egy egyszerű konzolprogramban. A főablak (az az ablak, amelyet az Application.Run megkapott) bezárásakor az Application.Run befejeződik, a Main véget ér, és a program leáll.
Jósolj!
Kitörlöd a Program.cs fájlból az Application.Run(new Form1()); sort. Mi történik, ha elindítod a programot?
Jóslat ellenőrzése
A program lefordul, lefut, de ablak nem jelenik meg, és azonnal véget ér. A Main többi sora nem hoz létre és nem jelenít meg ablakot, az Application.Run nélkül pedig nincs, ami megjelenítené, és nincs, ami az eseményekre várna.
A Form élete
Egy ablak a létrejöttétől a bezárásáig több állomáson megy át. Mindegyikhez tartozik egy esemény, amelyhez kódot kapcsolhatsz:
InitializeComponent(), amely létrehozza a vezérlőket.Hogyan hozod létre őket?
A Load eseménykezelőt a legegyszerűbb úgy létrehozni, hogy az ablak üres részére duplán kattintasz a tervezőben. A többit a Properties ablak Events nézetében (villám) találod meg: dupla kattintás a megfelelő esemény sorára.
Mit tegyél ide: a Form1 Properties ablaka Events nézetben (villám), a Load, Shown, FormClosing és FormClosed események sorával. Legyen kijelölve a Load sor, hogy látszódjon, hova kell duplán kattintani.Javasolt fájlnév: winforms-0-8-form-esemenyek.webp · Alt szöveg: A Form eseményei a Visual Studio Properties ablakának Events nézetében
Kilépés megerősítése: a FormClosing
A FormClosing eseménykezelő különleges: kap egy FormClosingEventArgs e paramétert, amelynek van egy Cancel tulajdonsága. Ha ezt true értékre állítod, a bezárás megszakad, az ablak nyitva marad.
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult valasz = MessageBox.Show("Biztosan bezárod?", "Kilépés", MessageBoxButtons.YesNo);
if (valasz == DialogResult.No)
{
e.Cancel = true;
}
}Yes vagy No. Ugyanilyet használtál a fájlmegnyitásnál.Ez lesz a mentetlen dokumentum védelme
Később a MiniWordben ugyanezzel a módszerrel kérdezhetjük meg, hogy el szeretnéd-e menteni a módosításokat, mielőtt az ablak bezárul.
Naplózzuk az életciklust!
Hogy lássuk, melyik esemény mikor fut le, tegyünk az ablakra egy ListBox-ot lstNaplo néven, és az egyes eseményekben írjunk bele egy sort:
public Form1()
{
InitializeComponent();
lstNaplo.Items.Add("1. Konstruktor");
}
private void Form1_Load(object sender, EventArgs e)
{
lstNaplo.Items.Add("2. Load: az ablak betöltődik");
}
private void Form1_Shown(object sender, EventArgs e)
{
lstNaplo.Items.Add("3. Shown: az ablak megjelent");
}Jósolj!
Elindítod a programot. Milyen sorrendben és hány sor lesz a naplóban a megjelenés után?
Jóslat ellenőrzése
Három sor, ebben a sorrendben: 1. Konstruktor, 2. Load, 3. Shown. A konstruktor fut le legelőször, a Load az ablak megjelenése előtt, a Shown pedig az első megjelenés után.
Mit tegyél ide: a futó program, amelyben a ListBox a három naplósort mutatja (Konstruktor, Load, Shown).Javasolt fájlnév: winforms-0-8-eletciklus-naplo.webp · Alt szöveg: A Form életciklusának naplója a futó programban
Hibakeresés: te vagy a hibadetektív
Mi a baj, és hogyan javítod?
Gondold végig az okot, és csak utána nyisd le a megoldást.
1. Nem lehet bezárni az ablakot
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
}Ok és javítás
A bezárás mindig megszakad, mert az e.Cancel feltétel nélkül igaz. Az ablakot a Visual Studióban a Shift+F5 (Stop) paranccsal állíthatod le. Javítás: csak akkor állítsd igazra, ha a felhasználó a Nem gombra kattintott.
2. A Load nem fut le
Beírtál egy A metódus nincs összekötve a Load eseménnyel. Töröld a kézzel írt metódust, majd az ablak üres részére duplán kattintva generáltasd újra, vagy válaszd ki az Events nézetben a Load sornál.Form1_Load metódust, de a naplóba nem kerül bejegyzés.Ok és javítás
3. Eltűnt az ablak
A program elindul és azonnal leáll, ablak nem jelenik meg. Valószínűleg hiányzik az Ok és javítás
Application.Run(new Form1()); sor a Program.cs-ből, vagy azt kitörölted. Ellenőrizd, hogy a Main utolsó sora megvan.
4. Nem az az ablak jelenik meg először
Két ablakod (Form1 és FoAblak) van, de nem az indul el, amelyiket szeretnéd. Az Ok és javítás
Application.Run azt az ablakot indítja, amelyet megkap. Ha a FoAblak legyen az első, írd át: Application.Run(new FoAblak());.
5. Átneveztem a Formot, és hibás a Program.cs
A Form1-et FoAblak névre cserélted, de a Program.cs hibát jelez. Ha az átnevezést nem a Solution Explorer Rename parancsával végezted (a 0.5 leckében tanultak szerint), a Program.cs-ben még a régi név maradt. Írd át kézzel, vagy végezd el újra az átnevezést a megfelelő módon.Ok és javítás
Mini projekt: kérdező kilépés és napló
Építs egy kis alkalmazást, amely naplózza az életciklust, és kilépéskor megkérdezi, hogy biztosan be akarod-e zárni:
- Új Windows Forms projekt, benne egy
lstNaplonevűListBox. - Add hozzá a konstruktor, a
Loadés aShownnaplósorait. - Írd meg a
FormClosingeseménykezelőt a megerősítéssel. - Futtasd, és próbáld ki mindkét választ (Yes és No) a kilépéskor.
- Írd le három mondatban, melyik állomáson milyen feladat lenne jó helye: az induló értékek beállításának, a mentés kérdezésének, a takarításnak.
Egy lehetséges válasz
Az induló értékek beállítása a Load eseménybe valók. A mentés megkérdezése a FormClosing eseménybe, mert még meg lehet szakítani a bezárást. A takarítás a FormClosed eseménybe, amikor az ablak már bezárult.
Gyakorlótár: 6 további feladat
Három szinten gyakorolhatsz: alap, közepes és kihívás. Előbb gondolkodj, és csak utána nyisd le a megoldást.
Alap szint
1. Mit csinál a Program.cs?
Melyik igaz? (a) A Igaz: (a), (b) és (c). A (d) hamis: a gomb kattintásának kódja a Program.cs a program belépési pontját tartalmazza. (b) A Main metódus az, amellyel a program indul. (c) Az Application.Run(new Form1()) sor elindítja az ablakot és az eseményfigyelést. (d) A Program.cs a gomb kattintásának kódját tartalmazza.Megoldás megnyitása
Form1.cs fájlban van, az eseménykezelőben.
2. A Form életciklusa
Rendezd időrendbe az eseményeket: Az időrend: Load → Shown → FormClosing → FormClosed. A FormClosed, Load, FormClosing, Shown.Megoldás megnyitása
Load az ablak első megjelenése előtt fut, a Shown a megjelenés után; a FormClosing a bezárás előtt (itt még meg lehet állítani), a FormClosed a bezárás után.
Közepes szint
3. Mit tudsz megváltoztatni?
A programodnak két ablaka van: Az Form1 és Form2. Mit kell módosítanod a Program.cs-ben, hogy a program a Form2 ablakkal induljon?Megoldás megnyitása
Application.Run(new Form1()); sorban a Form1 helyére írd a Form2 nevet: Application.Run(new Form2());. Az Application.Run által megkapott ablak a főablak: ennek bezárásakor a program is leáll.
4. Mi a [STAThread]?
A Az Main előtt álló [STAThread] jelölés mit biztosít, és mire lehet szükség rá? Mi történhet, ha törlöd?Megoldás megnyitása
[STAThread] azt jelzi, hogy a program fő szála egyszálú lakás (Single-Threaded Apartment) módban fut. Ez szükséges például a vágólaphoz és bizonyos párbeszédablakokhoz. Ha törlöd, ezek a műveletek hibát jelezhetnek (például a Clipboard hívások). A Windows Forms sablonja ezért mindig tartalmazza.
Kihívás szint
5. Hová teszed a kódot?
Egy program indulásakor szeretnél egy üdvözlő üzenetet megjeleníteni, bezáráskor pedig egy búcsúüzenetet. Melyik eseményt használod, és melyik fájlba írsz? Az induló üzenetet a Megoldás megnyitása
Load (vagy a Shown) eseménykezelőbe tedd, a búcsúüzenetet a FormClosed eseménykezelőbe. Mindkét eseménykezelő a Form1.cs fájlban van, nem a Program.cs-ben. Az eseménykezelőt a tervezőben a Properties ablak villám (Events) nézetéből hozhatod létre dupla kattintással.
6. Mi történik az Application.Run után?
Az Az Application.Run(new Form1()); sor után a Main metódusban még áll egy sor. Mikor fut le ez a sor? Magyarázd el.Megoldás megnyitása
Application.Run addig nem tér vissza, amíg a főablak (Form1) nyitva van: ez az az üzenetfigyelő ciklus, amely az eseményeket kezeli. A következő sor csak a főablak bezárása után fut le, közvetlenül a program vége előtt. Ezért nem ide teszünk a felhasználói felületet érintő kódot.
Gyors önellenőrzés
Próbáld meg a választ fejben megadni, és csak utána nyisd le. A program belépési pontja: az operációs rendszer innen indítja a programot. Létrehozza és megjeleníti az ablakot, majd elindítja az eseményfigyelést. Amíg az ablak nyitva van, nem tér vissza. Amikor a főablakot, vagyis az Konstruktor, Load, Shown, majd bezáráskor a FormClosing és a FormClosed. A A Program.cs-ben az 1. Mi a Main metódus szerepe?
2. Mit csinál az Application.Run(new Form1())?
3. Mikor ér véget a program?
Application.Run által megkapott ablakot bezárják.4. Milyen sorrendben futnak le a Form fő eseményei?
5. Hogyan akadályozod meg az ablak bezárását?
FormClosing eseményben az e.Cancel = true; beállítással.6. Hogyan változtatod meg, melyik ablak induljon először?
Application.Run paraméterét cseréled másik ablakra, például new FoAblak().
Mit tudsz már?
- Érted a Main metódust és az Application.Run szerepét.
- Tudod, mikor ér véget a Windows Forms program.
- Ismered a Form életciklusát: Konstruktor, Load, Shown, FormClosing, FormClosed.
- Kilépéskor megerősítést kérsz az e.Cancel segítségével.
- Tudod, hogyan változtathatod meg az induló ablakot.
Szakmai forrás: Microsoft Learn – A Windows Forms áttekintése. A Program.cs pontos tartalma a választott sablontól és a Visual Studio verziójától függően kicsit eltérhet.
Következő lecke: az első saját Windows Forms projekt
Az alapfogalmakkal végeztünk. Az 1. fejezetben elkészítjük az első teljes Windows Forms projektedet, és sorban megismerkedünk a leggyakoribb vezérlőkkel.





