Grafikus C# – Windows Forms tanfolyam › 0.8 lecke

Windows Forms · 0.8 lecke

Program.cs, Application.Run és a Form élete

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.

  • kb. 45 perc
  • kezdő szint
  • indítás és életciklus
Anime stílusú fiú és lány egy C# programozási feladatot beszél meg

A lecke végére

  • elmagyarázod, mi a Main metó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 FormClosing esemé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.

0.7 Tervező, kód, első futtatás →

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.

Program.cs (.NET Framework sablon)C#
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());
}
}
}
static void Main()A belépési pont: az operációs rendszer innen indítja a programot.
STAThreadEgy beállítás, amely a Windows ablakos elemeihez (például a fájlválasztó ablakokhoz) szükséges. Egyelőre elég tudni, hogy ott van, és nem kell hozzányúlnod.
EnableVisualStyles()Bekapcsolja a modern Windows megjelenést a vezérlőkön.
SetCompatibleTextRenderingDefault(false)A szövegek megjelenítésének módját állítja be. A sablon gondoskodik róla.

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

Program.csC#
Application.Run(new Form1());
new Form1()Létrehoz egy ablakot a Form1 osztályból (ez az ablak példánya).
Application.Run(...)Megjeleníti az ablakot, és elindítja az eseményfigyelést: a program innentől várja a felhasználó eseményeit, ahogy a 0.2 leckében tanultad.

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.

Main elindul→Application.Run(new Form1())→Az ablak megjelenik, a program vár az eseményekre→Bezárják a főablakot→A program véget ér

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:

Konstruktor→Load→Shown→(az ablak használata)→FormClosing→FormClosed
Konstruktor: Form1()Az ablak létrejön. Itt hívódik meg az InitializeComponent(), amely létrehozza a vezérlőket.
LoadAz ablak megjelenése előtt fut le. Ide jó az induló értékek beállítása.
ShownAz ablak első megjelenése után fut le egyszer.
FormClosingAz ablak bezárása előtt fut le. Itt megerősítést kérhetsz, vagy megakadályozhatod a bezárást.
FormClosedAz ablak már bezárult. Ide takarítást vagy mentést tehetsz, ha a bezárás nem tiltható.

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.

📷 Képernyőkép helye

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.

Form1.csC#
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;
}
}
MessageBoxButtons.YesNoAz üzenetablakon Igen és Nem gomb lesz.
DialogResult valaszA felhasználó választása: Yes vagy No. Ugyanilyet használtál a fájlmegnyitásnál.
e.Cancel = trueMegszakítja a bezárást. Az ablak nyitva marad.
Ha Yes a válaszNem állítunk be semmit, a bezárás folytatódik.

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:

Form1.csC#
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.

📷 Képernyőkép helye

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 Form1_Load metódust, de a naplóba nem kerül bejegyzés.

Ok és javítás

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.

3. Eltűnt az ablak

A program elindul és azonnal leáll, ablak nem jelenik meg.

Ok és javítás

Valószínűleg hiányzik az 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.

Ok és javítás

Az 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.

Ok és javítás

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.

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:

  1. Új Windows Forms projekt, benne egy lstNaplo nevű ListBox.
  2. Add hozzá a konstruktor, a Load és a Shown naplósorait.
  3. Írd meg a FormClosing eseménykezelőt a megerősítéssel.
  4. Futtasd, és próbáld ki mindkét választ (Yes és No) a kilépéskor.
  5. Í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 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

Igaz: (a), (b) és (c). A (d) hamis: a gomb kattintásának kódja a Form1.cs fájlban van, az eseménykezelőben.

2. A Form életciklusa

Rendezd időrendbe az eseményeket: FormClosed, Load, FormClosing, Shown.

Megoldás megnyitása

Az időrend: Load → Shown → FormClosing → FormClosed. A 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: Form1 és Form2. Mit kell módosítanod a Program.cs-ben, hogy a program a Form2 ablakkal induljon?

Megoldás megnyitása

Az 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 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

Az [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?

Megoldás megnyitása

Az induló üzenetet a 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 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

Az 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.

1. Mi a Main metódus szerepe?

A program belépési pontja: az operációs rendszer innen indítja a programot.

2. Mit csinál az Application.Run(new Form1())?

Létrehozza és megjeleníti az ablakot, majd elindítja az eseményfigyelést. Amíg az ablak nyitva van, nem tér vissza.

3. Mikor ér véget a program?

Amikor a főablakot, vagyis az Application.Run által megkapott ablakot bezárják.

4. Milyen sorrendben futnak le a Form fő eseményei?

Konstruktor, Load, Shown, majd bezáráskor a FormClosing és a FormClosed.

5. Hogyan akadályozod meg az ablak bezárását?

A FormClosing eseményben az e.Cancel = true; beállítással.

6. Hogyan változtatod meg, melyik ablak induljon először?

A Program.cs-ben az 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.