Grafikus C# – Windows Forms tanfolyam › 7.3 lecke

Windows Forms · 7.3 lecke · állapotsor

StatusStrip és alkalmazásállapot

Az ablak alján lévő állapotsor a program „közérzetét” mutatja: mit csinál éppen, hol áll a kurzor, mentve van-e a dokumentum, fut-e egy hosszú művelet. Jól használva csendes visszajelzés, amely nem zavarja a munkát, mint egy felugró ablak. Ebben a leckében megtanulod a StatusStrip elemeit, a tartós és az ideiglenes üzenetek kezelését, a sor és oszlop kiírását szerkesztőben, a billentyű-állapotokat és az órát, a haladásjelzőt, és azt is, mikor nem elég az állapotsor.

  • kb. 90 perc
  • közepes szint
  • állapotsor
Diák C# programozást gyakorol egy tanulósarokban

A lecke végére

  • használod a StatusStrip elemeit (ToolStripStatusLabel, ToolStripProgressBar, legördülő gomb) és a Spring tulajdonságot;
  • megkülönbözteted a tartós információt és az ideiglenes üzenetet, és az utóbbit időzítővel törlöd;
  • kiírod a sor- és oszlopszámot, a karakterszámot és a módosítás jelzést;
  • követed a billentyű-állapotot (Caps Lock) és kiírod az órát;
  • haladásjelzőt mutatsz hosszabb műveletnél;
  • tudod, mikor kell az állapotsor mellé felugró ablak vagy hibajelzés.

Mielőtt elkezded

Ehhez a leckéhez a 7.1 lecke (ToolStrip elemek), az 1.8 lecke (Timer, ProgressBar), a 2.11 lecke (SelectionChanged) és a 6.2 lecke (Dock) szükséges.

7.2 ContextMenuStrip →

A StatusStrip elemei

A StatusStrip alapból Dock = Bottom értékű, és ToolStripItem elemeket tartalmaz (7.1 lecke). Az állapotsor elemei nem kapnak fókuszt, nem a billentyűzet felé szólnak, hanem tájékoztatnak.

ElemJelentése
ToolStripStatusLabelSzöveges (és képes) mező. Spring = true: kitölti a szabad helyet; BorderSides, BorderStyle: elválasztó keret; IsLink: kattintható hivatkozás.
ToolStripProgressBarHaladásjelző (Value, Maximum, Style: Continuous, Marquee).
ToolStripDropDownButton, ToolStripSplitButtonLegördülő menü az állapotsorban (például nagyítás, kódolás).
Form1.csC#
// tervezőben: StatusStrip → elemek hozzáadása a nyíllal (Add Item); kódból:
ToolStripStatusLabel tsslUzenet = new ToolStripStatusLabel("Kész");
tsslUzenet.Spring = true; // kitölti a helyet
tsslUzenet.TextAlign = ContentAlignment.MiddleLeft;

ToolStripStatusLabel tsslPoz = new ToolStripStatusLabel("Sor 1, oszlop 1");
tsslPoz.BorderSides = ToolStripStatusLabelBorderSides.Left; // vékony elválasztó balra

ss.Items.Add(tsslUzenet);
ss.Items.Add(tsslPoz);
SpringAz a címke, amelynek Spring = true, a többi elem után megmaradó összes helyet elfoglalja. Egy állapotsorban általában egyetlen ilyen van (az üzenetmező), a többi AutoSize.
Állandó szélességA változó szöveg (Sor 12, oszlop 5) miatt ugráló elemek zavaróak. Adj a címkének minimális szélességet (AutoSize = false, Width beállítása), és igazítsd jobbra vagy középre.
ÁtméretezésAz állapotsor SizingGrip tulajdonsága egy kis fogantyút tesz a jobb alsó sarokba az ablak átméretezéséhez. Rögzített méretű ablaknál kapcsold ki.
Hosszú szövegA levágott szöveg kiírásához ToolTipText (és ShowItemToolTips) használható, de a fontos üzenetet ne bízd az állapotsorra.

Jósolj!

Az állapotsorban három címke van: az üzenet (Spring = true), a pozíció és a karakterszám (mindkettő AutoSize). A pozíció szövege Sor 9, oszlop 9-ről Sor 10, oszlop 10-re változik. Mi történik az elemek helyével?

Jóslat ellenőrzése

A hosszabb szöveg miatt a pozíció elem kicsit szélesebb lesz, az üzenetmező (Spring) pedig ugyanennyivel keskenyebb: a szöveg ugrál. Egy fix szélességű (AutoSize = false) elem megakadályozza ezt.

Tartós és ideiglenes üzenetek

Az állapotsor kétféle információt hordoz:

Tartós információ

Állandóan igaz, a program állapotát tükrözi: pozíció, módosítás jelzés, nagyítás, bejelentkezett felhasználó. Külön, fix mezőben áll, és az állapot változásakor frissül.

Ideiglenes üzenet

Egy esemény visszajelzése: „Mentve 14:32”, „3 találat”. Néhány másodpercig látszik, utána visszaáll az alaphelyzetre (Kész). Időzítővel töröljük.

Form1.cs (tmrUzenet: Timer, Interval 4000)C#
private const string Alap = "Kész";

private void Uzen(string szoveg)
{
tsslUzenet.Text = szoveg;

tmrUzenet.Stop(); // az újabb üzenet újraindítja a számlálást
tmrUzenet.Start();
}

private void tmrUzenet_Tick(object sender, EventArgs e)
{
tmrUzenet.Stop();
tsslUzenet.Text = Alap;
}

private void miMent_Click(object sender, EventArgs e)
{
// ... mentés ...
Uzen("Mentve: " + DateTime.Now.ToString("HH:mm:ss"));
}
Egy közös Uzen metódusAz üzenetek egyetlen metóduson keresztül jönnek, így az időzítő kezelése egy helyen van. Az állapotsor szövegét ne írd közvetlenül a programban szétszórva.
ÚjraindításHa két üzenet gyorsan követi egymást, az első időzítője nem törölheti a másodikat: a Stop és Start újraindítja a számlálást.
AlaphelyzetAz állapotsor mindig térjen vissza egy semleges szövegre (Kész). Az örökké ottmaradó „Mentés sikeres” megtévesztő lehet később.
Lekérdezések és hosszabb műveletAz üzenet beállítása és a UI frissítése csak akkor látszik azonnal, ha a kód közben visszaadja a vezérlést (11. fejezet). Egy hosszú ciklusban beállított szöveg a ciklus végén jelenik meg.

Jósolj!

Az Uzen nem állítja le az időzítőt újraindítás előtt (nincs Stop/Start). 3 másodperccel az első üzenet után egy második üzenet érkezik, az időzítő 4 másodperces. Mikor törlődik a második üzenet?

Jóslat ellenőrzése

Az időzítő tovább fut az első üzenettől, ezért a második üzenet már 1 másodperc múlva törlődik (az első üzenet kezdetétől számított 4. másodpercben). Az újraindítás (Stop + Start) biztosítja, hogy a második üzenet a saját 4 másodpercét megkapja.

A szerkesztő állapota: sor, oszlop, karakterszám

Szövegszerkesztőnél a kurzor helye (sor és oszlop), a karakterszám és a módosítás jelzés a klasszikus állapotsor-tartalom. A RichTextBox metódusaival számolható:

Form1.csC#
private void PozFrissit()
{
int kezdet = rtbSzoveg.SelectionStart;
int sor = rtbSzoveg.GetLineFromCharIndex(kezdet) + 1;
int sorElsoKarakter = rtbSzoveg.GetFirstCharIndexOfCurrentLine();
int oszlop = kezdet - sorElsoKarakter + 1;

tsslPoz.Text = $"Sor {sor}, oszlop {oszlop}";

if (rtbSzoveg.SelectionLength > 0)
{
tsslKarakter.Text = $"{rtbSzoveg.SelectionLength} kijelölve / {rtbSzoveg.TextLength}";
}
else
{
tsslKarakter.Text = $"{rtbSzoveg.TextLength} karakter";
}
}

private void rtbSzoveg_SelectionChanged(object sender, EventArgs e)
{
PozFrissit(); // a kurzor mozgásakor és gépeléskor is lefut
}

private void ModositasJelzes(bool modosult)
{
tsslModosult.Text = modosult ? "● Módosítva" : "✔ Mentve";
}
SelectionChangedA kurzor mozgására, kijelölésre és gépelésre is lefut (2.11 lecke): ide való a pozíció frissítése. A TextChanged csak a szöveg változásakor.
Sor és sortörésBekapcsolt WordWrap esetén a GetLineFromCharIndex a megjelenített sort adja (a tördelt sor új sor), nem a bekezdés számát. Kikapcsolt tördelésnél a sorok megegyeznek a Enter billentyűvel kezdett sorokkal.
Szám és szövegA jelzés szöveggel (Mentve) és jellel (✔, ●) legyen, ne csak színnel (6.9 lecke).
Nagy szövegA TextLength gyors, a Text.Length nagy dokumentumnál másolja a szöveget; előbbit használd.

Jósolj!

A WordWrap igaz, a szerkesztő keskeny. Egy egyetlen bekezdésből álló, hosszú szövegnél a kurzor a második megjelenített sor elején áll. Mit ír ki a program sorként?

Jóslat ellenőrzése

A 2. sort (és 1. oszlopot): a GetLineFromCharIndex a megjelenített, tördelt sorokat számolja, bár a szövegben nincs sortörés. Ha bekezdés-sorszám kell, a Text új sorainak számolása szükséges (Lines tömb), de nagy szövegnél lassú.

Haladásjelző, billentyű-állapot, óra

Form1.cs (tmrOra: Timer, 1000; tmrMuvelet: Timer, 100)C#
// óra és billentyű-állapot: másodpercenként frissül
private void tmrOra_Tick(object sender, EventArgs e)
{
tsslIdo.Text = DateTime.Now.ToString("HH:mm:ss");
tsslCaps.Text = Control.IsKeyLocked(Keys.CapsLock) ? "CAPS" : "";
}

// haladásjelző: a művelet idejére látszik
private void MuveletIndit()
{
tspbHaladas.Value = 0;
tspbHaladas.Visible = true;
tsslUzenet.Text = "Feldolgozás...";
tmrMuvelet.Start();
}

private void tmrMuvelet_Tick(object sender, EventArgs e)
{
tspbHaladas.Value = Math.Min(tspbHaladas.Maximum, tspbHaladas.Value + 5);

if (tspbHaladas.Value >= tspbHaladas.Maximum)
{
tmrMuvelet.Stop();
tspbHaladas.Visible = false;
Uzen("A feldolgozás kész.");
}
}

// ismeretlen hosszúságú műveletnél: Marquee (a sáv mozog, nem mutat százalékot)
tspbHaladas.Style = ProgressBarStyle.Marquee;
IsKeyLockedA Control.IsKeyLocked(Keys.CapsLock) (és NumLock, Scroll) a billentyű aktuális állapotát adja. Nincs rá esemény, ezért időzítővel vagy a KeyUp eseményben kérdezzük.
Haladás a Timer-relItt a Timer szimulálja a munkát: a valódi hosszú műveletet (ciklus, fájl) a 11. fejezet tanítja úgy, hogy az ablak ne fagyjon le. A hosszú ciklus közben a haladásjelző nem frissül.
MarqueeHa nem ismert a hossz, a Marquee stílus mozgó sávot mutat, százalék nélkül.
VisibleA haladásjelző csak a művelet alatt látszik: a rejtett elem nem foglal helyet az állapotsorban.

Jósolj!

Egy gomb kezelőjében egy másodpercnyi számítást végzel for ciklussal, és a ciklusban növeled a tspbHaladas.Value értékét. Mit látsz a haladásjelzőn a számítás alatt?

Jóslat ellenőrzése

A sáv nem mozog, az ablak lefagyottnak tűnik, és csak a művelet végén ugrik a végállapotba (vagy az utolsó értékre): a kezelő addig nem engedi vissza a vezérlést a felületnek, amíg le nem fut. A valódi hosszú műveletekhez háttérszál vagy async kell (11. fejezet). Ebben a leckében a Timer csak a szemléltetést szolgálja.

📷 Képernyőkép helye

Mit tegyél ide: egy szerkesztő állapotsora: üzenet, sor és oszlop, karakterszám, CAPS jelzés, mentés állapot és óra.Javasolt fájlnév: winforms-7-3-allapotsor.webp · Alt szöveg: Szerkesztő állapotsora több elemmel

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. Az állapotsor elemei ugrálnak

A pozíció szövegének változásakor a többi elem elmozdul.

Ok és javítás

Az AutoSize elem a szöveghez igazodik. Állíts be fix szélességet (AutoSize = false, Width), jobbra vagy középre igazítva.

2. Az üzenet eltűnik, mielőtt elolvasnám

Gyors egymás utáni üzeneteknél a második azonnal eltűnik.

Ok és javítás

Az időzítőt nem indítod újra az új üzenetnél. Hívd a Stop() és Start() metódust az Uzen elején.

3. A haladásjelző nem mozog a ciklusban

for (int i = 0; i <= 100; i++)
{
tspbHaladas.Value = i;
Thread.Sleep(30); // a felület nem frissül
}
Hiba és javítás

A felület szála a ciklusban dolgozik, ezért nem rajzol újra. A hosszú műveletet háttérszálra vagy async metódusra kell tenni (11. fejezet), addig a Timer alapú szimuláció használható.

4. A Caps Lock jelzés késik

A CAPS felirat csak másodpercek múlva változik a billentyű megnyomása után.

Ok és javítás

Az óra időzítője (1 másodperc) frissíti. Kérdezd le a KeyUp eseményben is (KeyPreview = true), vagy rövidítsd az időzítő intervallumát (250 ms).

5. Hibaüzenet csak az állapotsorban

A felhasználó nem veszi észre, hogy a mentés nem sikerült.

Ok és javítás

Az állapotsor csendes: a fontos, azonnali beavatkozást kívánó hibát MessageBox vagy ErrorProvider jelezze (7.4 lecke), az állapotsor csak kiegészítés. A képernyőolvasó sem olvassa automatikusan az állapotsor változását.

6. Az állapotsor eltakarja a szerkesztőt

A szerkesztő alja nem látszik.

Ok és javítás

A z-sorrend rossz (6.2 lecke): a Fill szerkesztő legyen leghátul (Send to Back), hogy utoljára kapja a maradék helyet.

Mini projekt: szerkesztő gazdag állapotsorral

Egészítsd ki a 7.1 jegyzetfüzetet állapotsorral:

  1. A ss (StatusStrip) elemei: tsslUzenet (Spring), tsslPoz (fix 130 szélesség), tsslKarakter (fix 150), tsslCaps, tsslModosult, tsslIdo, tspbHaladas (alapból rejtett).
  2. A Uzen(szöveg) metódus 4 másodperces ideiglenes üzenetet mutat, majd Kész szöveget.
  3. A pozíció és karakterszám a SelectionChanged eseményben frissül; a módosítás jelzés a szöveg változásakor ● Módosítva, mentés után ✔ Mentve.
  4. Az óra és a CAPS jelzés egy 500 ms-os időzítőn frissül.
  5. A Szavak számolása gomb elindítja a haladásjelzőt: 3 másodperc alatt telik be (szimuláció), a végén Szavak: N üzenet.
  6. A mentésnél, megnyitásnál és a hibáknál az állapotsor üzen (Mentve: 14:32:05, Megnyitva: jegyzet.txt), a fájl hibája MessageBox (7.4 lecke).
  7. Teszteld: a pozíció a nyilakkal, tördelés be- és kikapcsolva, kijelölés, gyors üzenetek egymás után, CAPS be- és kikapcsolása, a haladásjelző.
Megoldás megnyitása (próbáld ki előbb önállóan!)

A szószámolás a Split módszerével történik. Az üzenetek közös Uzen metóduson át érkeznek, hogy az időzítő egy helyen legyen kezelve.

Form1.csC#
private const string Alap = "Kész";

private void Form1_Load(object sender, EventArgs e)
{
tmrUzenet.Interval = 4000;
tmrOra.Interval = 500;
tmrOra.Start();
tspbHaladas.Visible = false;
tspbHaladas.Maximum = 100;

tsslUzenet.Text = Alap;
PozFrissit();
ModositasJelzes(false);
tmrOra_Tick(this, EventArgs.Empty);
}

private void Uzen(string szoveg)
{
tsslUzenet.Text = szoveg;
tmrUzenet.Stop();
tmrUzenet.Start();
}

private void tmrUzenet_Tick(object sender, EventArgs e)
{
tmrUzenet.Stop();
tsslUzenet.Text = Alap;
}

private void tmrOra_Tick(object sender, EventArgs e)
{
tsslIdo.Text = DateTime.Now.ToString("HH:mm:ss");
tsslCaps.Text = Control.IsKeyLocked(Keys.CapsLock) ? "CAPS" : "";
}

private void PozFrissit()
{
int kezdet = rtbSzoveg.SelectionStart;
int sor = rtbSzoveg.GetLineFromCharIndex(kezdet) + 1;
int oszlop = kezdet - rtbSzoveg.GetFirstCharIndexOfCurrentLine() + 1;

tsslPoz.Text = $"Sor {sor}, oszlop {oszlop}";

tsslKarakter.Text = rtbSzoveg.SelectionLength > 0
? $"{rtbSzoveg.SelectionLength} kijelölve / {rtbSzoveg.TextLength}"
: $"{rtbSzoveg.TextLength} karakter";
}

private void rtbSzoveg_SelectionChanged(object sender, EventArgs e)
{
PozFrissit();
}

private void ModositasJelzes(bool modosult)
{
tsslModosult.Text = modosult ? "● Módosítva" : "✔ Mentve";
}

private void rtbSzoveg_TextChanged(object sender, EventArgs e)
{
modosult = true;
ModositasJelzes(true);
CimFrissit();
}

// a mentés végén: modosult = false; ModositasJelzes(false); Uzen("Mentve: " + DateTime.Now.ToString("HH:mm:ss"));

private int cel = 0;

private void btnSzavak_Click(object sender, EventArgs e)
{
tspbHaladas.Value = 0;
tspbHaladas.Visible = true;
btnSzavak.Enabled = false;
tsslUzenet.Text = "Szavak számolása...";
tmrMuvelet.Interval = 100;
tmrMuvelet.Start();
}

private void tmrMuvelet_Tick(object sender, EventArgs e)
{
tspbHaladas.Value = Math.Min(100, tspbHaladas.Value + 3); // kb. 3 másodperc

if (tspbHaladas.Value >= 100)
{
tmrMuvelet.Stop();
tspbHaladas.Visible = false;
btnSzavak.Enabled = true;

string[] szavak = rtbSzoveg.Text.Split(new char[] { ' ', '\n', '\r', '\t' }, StringSplitOptions.RemoveEmptyEntries);
Uzen("Szavak: " + szavak.Length);
}
}
📷 Képernyőkép helye

Mit tegyél ide: a kész szerkesztő állapotsora a haladásjelzővel, a pozícióval és az órával.Javasolt fájlnév: winforms-7-3-kesz.webp · Alt szöveg: A szerkesztő állapotsora haladásjelzővel

Három önálló gyakorlófeladat

Egyszerre csak egyet csinálj: tervezd meg, írd meg, futtasd, ellenőrizd, és csak utána nyisd ki a megoldást.

1. Nagyítás az állapotsorban

Az állapotsor ToolStripDropDownButton eleme a szöveg nagyítását (100%, 125%, 150%) választja, és a RichTextBox.ZoomFactor értékét állítja. Hogyan oldod meg közös kezelővel?

Egy lehetséges megoldás

A legördülő pontok Tag értéke a tényező (1.0, 1.25, 1.5), a közös kezelő a gomb szövegét is frissíti.

Form1.csC#
private void Nagyitas_Click(object sender, EventArgs e)
{
ToolStripMenuItem pont = (ToolStripMenuItem)sender;
float tenyezo;

if (float.TryParse(pont.Tag.ToString(), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out tenyezo))
{
rtbSzoveg.ZoomFactor = tenyezo;
ddbNagyitas.Text = pont.Text;
}
}

2. Kattintható hivatkozás az állapotsorban

Egy ToolStripStatusLabel Súgó felirat hivatkozásként viselkedik, és megnyitja a súgóoldalt. Mely tulajdonságokat és eseményt használod?

Egy lehetséges megoldás

Az IsLink = true hivatkozás-kinézetet ad, a Click esemény kezeli a kattintást. A böngésző indítása Process.Start (a modern .NET-ben UseShellExecute = true kell). Külső cím esetén az URL-t ellenőrizd.

Form1.csC#
private void tsslSugo_Click(object sender, EventArgs e)
{
System.Diagnostics.ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo("https://www.digitalisfelfedezok.hu/");
info.UseShellExecute = true;
System.Diagnostics.Process.Start(info);
}

3. Állapot-összesítés lista

A Feladatlista (7.2) állapotsora mutassa: 12 feladat, 5 kész (42%). Hol frissíted, hogy mindig naprakész legyen?

Egy lehetséges megoldás

Egy Frissit() metódus számolja ki, és mindenhonnan meghívod, ahol a lista változik (hozzáadás, törlés, kész-váltás). Az osztás előtt ellenőrizd a nullát.

Form1.csC#
private void Frissit()
{
int osszes = lstFeladatok.Items.Count;
int kesz = 0;

foreach (object o in lstFeladatok.Items)
{
if (((Feladat)o).Kesz) { kesz++; }
}

int szazalek = osszes == 0 ? 0 : (int)Math.Round(100.0 * kesz / osszes);
tsslOsszes.Text = $"{osszes} feladat, {kesz} kész ({szazalek}%)";
}

Gyakorlótár: 6 további feladat

Három szinten gyakorolhatsz: alap, közepes és kihívás. Csak a próbálkozás után nyisd le a megoldást.

Alap szint

1. Spring

Mit tesz a Spring = true egy ToolStripStatusLabelen?

Megoldás megnyitása

A címke kitölti az állapotsor szabad helyét, a többi elemet jobbra szorítja.

2. Tartós és ideiglenes információ

Sorold a következőket tartós vagy ideiglenes kategóriába: „Sor 5”, „Mentve 14:32”, „Módosítva”, „3 találat”.

Megoldás megnyitása

Tartós: „Sor 5”, „Módosítva” (az állapotot tükrözik). Ideiglenes: „Mentve 14:32”, „3 találat” (eseményekre válaszolnak, majd törlődnek).

Közepes szint

3. Elemek elrejtése szűk ablaknál

Szűk ablakban az óra és a karakterszám elrejtődik, hogy a pozíció elférjen. Melyik eseményben?

Megoldás megnyitása

A Resize eseményben, az ablak szélessége alapján (6.1 lecke). A rejtett elem nem foglal helyet.

Form1.csC#
private void Form1_Resize(object sender, EventArgs e)
{
bool szeles = this.ClientSize.Width >= 600;

tsslIdo.Visible = szeles;
tsslKarakter.Visible = szeles;
}

4. Az egér alatti elem leírása

A menüpontok és eszköztár-gombok fölé mutatva az állapotsor a gomb leírását mutassa (Az aktuális dokumentum mentése). Melyik eseményt használod?

Megoldás megnyitása

A MouseEnter és MouseLeave eseményeket egy közös kezelővel, a ToolTipText (vagy Tag) szövegével.

Form1.csC#
private void Elem_MouseEnter(object sender, EventArgs e){
tsslUzenet.Text = ((ToolStripItem)sender).ToolTipText;
}

private void Elem_MouseLeave(object sender, EventArgs e)
{
tsslUzenet.Text = Alap;
}

Kihívás szint

5. Naplózó állapotsor

Az állapotsor utolsó 20 üzenetét egy listában őrizd, és az állapotsor Előzmények gombja egy ContextMenuStrip menüben mutassa. Hogyan építed?

Megoldás megnyitása

Az Uzen egy List<string>-be is ír (legfeljebb 20), és az Opening események a menüpontok szövegét frissítik (7.2 lecke).

Form1.csC#
private readonly List<string> elozmenyek = new List<string>();

private void Uzen(string szoveg)
{
tsslUzenet.Text = szoveg;
elozmenyek.Insert(0, DateTime.Now.ToString("HH:mm:ss") + " – " + szoveg);

while (elozmenyek.Count > 20)
{
elozmenyek.RemoveAt(elozmenyek.Count - 1);
}

tmrUzenet.Stop();
tmrUzenet.Start();
}

private void cmsElozmeny_Opening(object sender, System.ComponentModel.CancelEventArgs e)
{
cmsElozmeny.Items.Clear();

foreach (string s in elozmenyek)
{
cmsElozmeny.Items.Add(s);
}

e.Cancel = elozmenyek.Count == 0;
}

6. Üzenet fontossága

Az Uzen metódus kapjon fontosság paramétert (info, figyelmeztetés, hiba): jellel (ℹ, ⚠, ✖) és színnel is jelezze, a hiba maradjon látható, amíg a felhasználó nem cselekszik. Hogyan oldod meg?

Megoldás megnyitása

Az info és a figyelmeztetés időzítővel eltűnik, a hiba nem indítja az időzítőt, és a következő üzenet vagy egy művelet törli. A szín sötét árnyalat (6.9 lecke), a jel a szöveg része.

Form1.csC#
private void Uzen(string szoveg, string szint){
tmrUzenet.Stop();

switch (szint)
{
case "hiba":
tsslUzenet.Text = "✖ " + szoveg;
tsslUzenet.ForeColor = Color.FromArgb(170, 20, 20);
return; // nem tűnik el magától

case "figyelmeztetes":
tsslUzenet.Text = "⚠ " + szoveg;
tsslUzenet.ForeColor = Color.FromArgb(150, 80, 0);
break;

default:
tsslUzenet.Text = "ℹ " + szoveg;
tsslUzenet.ForeColor = SystemColors.ControlText;
break;
}

tmrUzenet.Start();
}

Gyors önellenőrzés

Válaszolj fejben, és csak utána nyisd le a választ.

1. Milyen elemek vannak az állapotsorban?

ToolStripStatusLabel, ToolStripProgressBar, ToolStripDropDownButton, ToolStripSplitButton.

2. Mit jelent a Spring?

A címke kitölti az állapotsor szabad helyét.

3. Mi a különbség a tartós és az ideiglenes információ között?

A tartós az állapotot tükrözi (pozíció, módosítás), az ideiglenes egy esemény visszajelzése, időzítővel eltűnik.

4. Miért kell Stop és Start az Uzen metódusban?

Hogy az újabb üzenet a saját teljes idejét megkapja, és az előző időzítő ne törölje korán.

5. Hogyan számolod a sort és az oszlopot?

GetLineFromCharIndex(SelectionStart) a sor, SelectionStart - GetFirstCharIndexOfCurrentLine() az oszlop (+1). Tördelésnél a sor a megjelenített sor.

6. Miért nem mozog a haladásjelző egy ciklusban?

A ciklus lefoglalja a felület szálát, nincs újrarajzolás. Háttérszál vagy async kell (11. fejezet).

7. Mikor nem elég az állapotsor?

Fontos hibánál, amely azonnali beavatkozást kér: MessageBox vagy ErrorProvider. A képernyőolvasó sem olvassa automatikusan.

Mit tudsz már?

  • Használod a StatusStrip elemeit és a Spring tulajdonságot.
  • Tartós és ideiglenes üzeneteket kezelsz közös Uzen metódussal.
  • Kiírod a sort, oszlopot, karakterszámot, módosítás jelzést, órát és billentyű-állapotot.
  • Haladásjelzőt mutatsz, és tudod a hosszú művelet korlátját.
  • Tudod, mikor kell az állapotsor mellé felugró üzenet.

Következő lecke: MessageBox különböző gombjai és DialogResult

A felugró üzenetek helyes használata: gombok, ikonok, alapértelmezett gomb, és az érthető üzenetek szabályai.