Grafikus C# – Windows Forms tanfolyam › 14.8 lecke Windows Forms · 14.8 lecke · kiadás Két program lehet műszakilag egyformán jó, mégis az egyik kész terméknek látszik, a másik iskolai próbálkozásnak. A különbség sokszor a részletekben van: van saját ikonja (nem az alapértelmezett fehér ablak), a fájl tulajdonságai között verzió, szerző és szerzői jog áll, és a programban van egy Névjegy (About) ablak, amely megmondja, mi ez, ki készítette, melyik verzió, milyen licenc alatt áll. Ezek a hibabejelentésnél is aranyat érnek: „melyik verzióval történt?” Ebben a leckében megtanulod az alkalmazásikon beállítását (Ikon, verzió, szerző és About
.ico), a verzió- és szerzői metaadatok beállítását a projektfájlban, a verzió olvasását kódból, a Névjegy ablak elkészítését, a szerzői jog és a licenc alapjait, és hogy mit tegyél (és mit ne) a névjegyedbe.
A lecke végére
- beállítod az alkalmazásikont (
.ico, többféle méret) és az ablak ikonját; - megadod a verzió- és szerzői metaadatokat a projektfájlban (
Version,Company,Copyright); - kódból kiolvasod a verziót (
Assembly,Application.ProductVersion); - elkészítesz egy Névjegy ablakot a szükséges tartalommal;
- ismered a szerzői jog és a licenc alapjait (a saját programodé, az ikonoké, a csomagoké);
- tudod, mit érdemes és mit nem érdemes kiírni a névjegyre.
Mielőtt elkezded
Ehhez a leckéhez a 14.1–14.7 lecke szükséges, különösen a 14.4 (licencek) és a 14.6 (frissítés-ellenőrző, verzió).
Az alkalmazásikon
<!-- A projektfájlban: az exe és a Fájlkezelő ikonja -->
<PropertyGroup>
<ApplicationIcon>Kepek\app.ico</ApplicationIcon>
</PropertyGroup>
// Visual Studio: Project → Properties → Application → Resources → Icon: app.ico
// Az ABLAK ikonja (a címsorban és a tálcán): a Form Icon tulajdonsága
// Designer: Properties → Icon → app.ico (vagy kódból:)
this.Icon = new Icon(System.IO.Path.Combine(AppContext.BaseDirectory, "Kepek", "app.ico"));
// Az exe ikonja a programból is kiolvasható (egyetlen forrásból dolgozunk)
this.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath);.ico: egy fájl több méretet tartalmaz (16×16, 24×24, 32×32, 48×48, 256×256), hogy a Fájlkezelőben, a tálcán, a Start menüben és nagy DPI-n is éles legyen. A .png fájlt nem lehet közvetlenül alkalmazásikonnak használni: konvertálni kell (online átalakítók, Visual Studio ikonszerkesztő, ImageMagick).ApplicationIcon az exe fájl ikonja (Fájlkezelő, parancsikon). A Form Icon tulajdonsága az ablak ikonja (címsor, tálca futás közben). Mindkettőt állítsd be, különben a futó program az alapértelmezett ikont mutatja.Jósolj!
Beállítod az ApplicationIcon értékét, lefordítod, és a Fájlkezelőben az exe már az új ikont mutatja. De amikor a programot elindítod, a tálcán és az ablak címsorában az alap (fehér ablak) ikon látszik. Miért?
Jóslat ellenőrzése
Az ApplicationIcon csak az exe fájl ikonja; az ablak ikonját a Form.Icon tulajdonság adja. Állítsd be a Formon is (Designer: Icon), vagy kódból (Icon.ExtractAssociatedIcon).
Verzió és szerzői adatok
<PropertyGroup>
<Product>Diáknyilvántartó</Product>
<Description>Egyszerű nyilvántartó iskolai használatra.</Description>
<Company>Példa Diák</Company>
<Authors>Példa Diák</Authors>
<Copyright>© 2026 Példa Diák</Copyright>
<Version>1.2.0</Version> <!-- ez a fő verzió: a többit ebből származtatja -->
<AssemblyVersion>1.2.0.0</AssemblyVersion> <!-- a .NET kötési azonosító: ritkán módosítsd -->
<FileVersion>1.2.0.0</FileVersion> <!-- a fájl Tulajdonságok → Részletek fülén látszik -->
<InformationalVersion>1.2.0</InformationalVersion> <!-- a felhasználónak szóló verziószöveg -->
</PropertyGroup>public static class Verzio
{
public static string Szam { get { return Assembly.GetExecutingAssembly().GetName().Version.ToString(3); } } // "1.2.0" (3 elem)
public static string Teljes { get { return FileVersionInfo.GetVersionInfo(Application.ExecutablePath).ProductVersion ?? Szam; } }
public static string Termek { get { return Application.ProductName; } } // a <Product> értéke
public static string Ceg { get { return Application.CompanyName; } } // a <Company> értéke
public static string Mod
{
get
{
#if DEBUG
return "Debug";
#else
return "Release";
#endif
}
}
}AssemblyVersion a .NET belső azonosítója (ritkán változik); a FileVersion a fájl Tulajdonságok ablakában látszik; az InformationalVersion/ProductVersion a felhasználónak szóló szöveg (lehet 1.2.0-beta.1 is). Az SDK-stílusú projektben elég a <Version>: a többit ebből állítja be..csproj <Version> sora): a telepítő (AppVersion, 14.6 lecke), a csomag neve, a Névjegy és a napló (13.7 lecke) ebből olvas. A több helyen kézzel írt verzió előbb-utóbb eltér.InformationalVersion a verziókezelő commit azonosítóját is tartalmazza (1.2.0+a3f9c1): ebből pontosan tudod, melyik forráskódból készült a kiadás. A Version.TryParse előtt a + utáni részt le kell vágni (14.6 lecke).Jósolj!
Kiadsz egy hibajavító változatot, de elfelejted növelni a verziót: az újabb telepítő is 1.2.0 számú. A felhasználó programja a frissítés-ellenőrzővel összehasonlítja a verziókat. Mit mond?
Jóslat ellenőrzése
Azt, hogy a program naprakész (1.2.0 nem kisebb, mint 1.2.0): a felhasználók sosem értesülnek a javításról, és a hibajelentésben sem tudod megkülönböztetni a régi és az új változatot. Minden kiadás kapjon új verziószámot.
A Névjegy (About) ablak
┌─────────────────────────────────────────────┐
│ [ikon] Diáknyilvántartó │
│ Verzió 1.2.0 (Release, .NET 8.0) │
│ │
│ Egyszerű nyilvántartó iskolai használatra. │
│ © 2026 Példa Diák │
│ Licenc: MIT (licenc megtekintése) │
│ Harmadik fél: CsvHelper, SQLite │
│ Weboldal: https://pelda.hu/diak │
│ Adatok helye: C:\Users\...\AppData\Local │
│ │
│ [Másolás hibabejelentéshez] [ OK ] │
└─────────────────────────────────────────────┘public partial class NevjegyForm : Form
{
public NevjegyForm()
{
InitializeComponent();
// párbeszédablak-jellegű beállítások (Designerben is megadható)
FormBorderStyle = FormBorderStyle.FixedDialog;
MaximizeBox = false; MinimizeBox = false; ShowInTaskbar = false;
StartPosition = FormStartPosition.CenterParent;
AcceptButton = btnOk; CancelButton = btnOk; // Enter és Esc is bezár
Text = "Névjegy: " + Verzio.Termek;
lblNev.Text = Verzio.Termek;
lblVerzio.Text = "Verzió " + Verzio.Teljes + " (" + Verzio.Mod + ", " + RuntimeInformation.FrameworkDescription + ")";
lblSzerzo.Text = "© 2026 " + Verzio.Ceg;
lblAdat.Text = "Adatok helye: " + Utak.AdatMappa;
}
private void lnkWeb_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
Uri uri;
if (Uri.TryCreate("https://pelda.hu/diak", UriKind.Absolute, out uri) && uri.Scheme == Uri.UriSchemeHttps)
{
Process.Start(new ProcessStartInfo(uri.AbsoluteUri) { UseShellExecute = true }); // az alapértelmezett böngészőben
}
}
// hibabejelentéshez: a környezeti adatok a vágólapra
private void btnMasol_Click(object sender, EventArgs e)
{
string szoveg = Verzio.Termek + " " + Verzio.Teljes + " (" + Verzio.Mod + ")" + Environment.NewLine
+ ".NET: " + RuntimeInformation.FrameworkDescription + Environment.NewLine
+ "Windows: " + RuntimeInformation.OSDescription + Environment.NewLine
+ "Architektúra: " + RuntimeInformation.ProcessArchitecture + Environment.NewLine
+ "Kultúra: " + System.Globalization.CultureInfo.CurrentCulture.Name; // személyes adat nélkül
try { Clipboard.SetText(szoveg); lblUzenet.Text = "Vágólapra másolva."; }
catch (ExternalException) { lblUzenet.Text = "A vágólap nem elérhető."; } // másik program használja
}
}
// A főablakban: Súgó → Névjegy
private void mnuNevjegy_Click(object sender, EventArgs e)
{
using (NevjegyForm f = new NevjegyForm()) { f.ShowDialog(this); } // ShowDialog után Dispose (13.9 lecke)
}FixedDialog szegély, nincs kis/nagyítás, nincs tálcaikon, a szülő közepén jelenik meg, az Enter és az Esc bezárja (AcceptButton/CancelButton, 13.8 lecke). A Visual Studio régi projektsablonja tartalmaz kész About Box-ot, az újabbakban kézzel készítjük.LinkLabel kattintására csak https címet nyiss meg (14.6 lecke), a UseShellExecute = true az alapértelmezett böngészőt indítja. Ne nyiss meg hálózatról vagy felhasználói bevitelből érkező, ellenőrizetlen címet.Jósolj!
A Névjegy ablakot new NevjegyForm().ShowDialog() hívással nyitod meg using nélkül, és a felhasználó százszor megnyitja-bezárja. Mi történik hosszabb távon?
Jóslat ellenőrzése
A ShowDialog után a Form nem szabadul fel automatikusan (12.1, 13.9 lecke): minden megnyitás növeli a memória- és a Windows-fogantyúk számát. A using blokk vagy a Dispose() hívás szünteti meg a szivárgást.
Szerzői jog, licenc és mit írj a névjegyre?
| Téma | Mire figyelj? |
|---|---|
| A saját programod | A szerzői jog automatikusan a szerzőt illeti. A Copyright sor jelzi (© 2026 Név); a licenc (LICENSE fájl) mondja meg, mit szabad másoknak: MIT/Apache (szabad felhasználás feltételekkel), GPL (a származék is nyílt marad), „minden jog fenntartva”. |
| Ikonok, képek, hangok, betűtípusok | Csak olyat használj, amelyet te készítettél, vagy amelynek a licence engedi (nyílt licenc: a forrás és a feltételek feltüntetésével; saját licencű anyagnál a felhasználási feltétel). Egy keresőből letöltött kép nem „ingyenes”. Mindig jegyezd fel a forrást és a licencet. |
| Harmadik fél csomagok | A licencek feltételeit be kell tartani (14.4 lecke): sokszor a szerzői jogi nyilatkozat és a licenc szövegének mellékelése. A THIRD-PARTY-NOTICES.txt a program mellé kerül, és a Névjegyből elérhető. |
| Márkanév, logó | Ne használd mások védjegyét, logóját (Microsoft, Windows, iskola emblémája) a programod ikonjában vagy nevében engedély nélkül. |
| Személyes adat a névjegyen | Csak azt írd ki, amit nyilvánosan akarsz közölni. Iskolai projektnél általában elég a (becenév vagy) szerzői név és a projekt neve; a teljes név, e-mail, osztály, lakcím kiírását gondold át (a program nyilvánosan terjed). Kapcsolatnak használhatsz külön, erre létrehozott e-mail címet vagy weboldalt. |
Jósolj!
Az ikonodat egy keresőből másoltad ki, mert jól néz ki. A programot a weboldaladról töltik le. Mi a kockázat?
Jóslat ellenőrzése
A kép szerzői jogvédett lehet: a nyilvános terjesztés jogsértés (felszólítás, eltávolítási kérés, rosszabb esetben jogi következmény). Használj saját rajzot, vagy nyílt licencű ikont a forrás és a licenc feltüntetésével, és tartsd nyilván, honnan van.
Mit tegyél ide: a Névjegy ablak, és a fájl Tulajdonságok → Részletek füle a verzióval és a szerzői joggal.Javasolt fájlnév: winforms-14-8-nevjegy.webp · Alt szöveg: A Névjegy ablak és a fájl részletei
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 új ikon nem jelenik meg a Fájlkezelőben
Beállítottad az Az ikon gyorsítótárazott. Nevezd át a fájlt, indítsd újra a Fájlkezelőt, vagy töröld az ikongyorsítótárat; ellenőrizd, hogy az ApplicationIcon-t, az exe mégis a régit mutatja.Ok és javítás
.ico több méretet tartalmaz-e.
2. Az ablak ikonja az alap
Az exe ikonja jó, a futó ablaké nem. A Ok és javítás
Form.Icon nincs beállítva (az ApplicationIcon csak az exe fájlé). Állítsd be a Designerben vagy kódból.
3. A verzió 1.0.0.0 marad
A Régi build (Rebuild kell), vagy a .csproj Version értéke 1.2.0, a Névjegy mégis a régit mutatja.Ok és javítás
AssemblyInfo.cs fájl is tartalmaz verziót (régi stílusú projektben) és ütközik. Egy forrás legyen: a .csproj.
4. A frissítés-ellenőrző FormatException-t dob
A A ProductVersion értéke 1.2.0+a3f9c1.Ok és javítás
Version.Parse nem fogadja a +commit kiegészítést. Vágd le (Split('+')[0]) és használj TryParse-t (14.6 lecke).
5. A hivatkozás nem nyílik meg
A A modern .NET-ben Process.Start(url) kivételt dob.Ok és javítás
UseShellExecute = true kell a ProcessStartInfo-ban (alapból false). A cím legyen érvényes https URI.
6. A Névjegy ablak „kijön” a tálcára
Az About külön ablakként jelenik meg, és kicsinyíthető.Ok és javítás
ShowInTaskbar = false, MinimizeBox = MaximizeBox = false, FormBorderStyle = FixedDialog, és ShowDialog(this) a tulajdonossal.
Mini projekt: márkázott kiadás
Add meg a programodnak a „kész termék” külsejét: ikon, verzió, szerzői adatok és Névjegy ablak, és ellenőrizd mindenhol:
- Ikon készítése: rajzolj egyszerű, saját ikont (például egy kör, betű vagy szimbólum, 256×256 pixel, átlátszó háttérrel); konvertáld
.ico-vá több mérettel (16, 32, 48, 256). - Beállítás: add meg az
ApplicationIconértéket a.csproj-ban, és a FormIcontulajdonságát; ellenőrizd a Fájlkezelőben, a tálcán és az ablak címsorában. - Metaadatok: a
.csproj-ban add meg aProduct,Description,Company,Authors,Copyright,Versionértékeket; Release fordítás után nézd meg az exe Tulajdonságok → Részletek fülét. - Verzió osztály: készíts
Verzioosztályt (a leckéből), amely egy helyen olvassa ki a verziót; használd a Névjegyben, a naplóban (induláskor), a frissítés-ellenőrzőben és az ablak címsorában (Program 1.2.0). - Névjegy ablak: a leckében leírt tartalommal és beállításokkal; Súgó → Névjegy menüpont;
usingaShowDialogkörül. - Licenc: add a projekthez a
LICENSEfájlt (például MIT), és a Névjegyből legyen megnyitható; a harmadik fél licencfájl (14.4 lecke) is elérhető. - Hibabejelentés gomb: a vágólapra másolt környezeti adatok, személyes adat nélkül; próbáld ki a beillesztést.
- Verzió-növelés: készíts
verzio-novel.ps1szkriptet, amely a.csproj<Version>értékét növeli (patch/minor/major); próbáld ki, hogy a Névjegy, a telepítő és a csomag neve egyezik-e. - Ellenőrzés: Fájlkezelő ikonja, tálca ikonja, címsor ikonja, fájl Tulajdonságok, Névjegy, napló első sora: mindenhol azonos verzió és név.
Megoldás megnyitása (próbáld ki előbb önállóan!)
param([ValidateSet("patch", "minor", "major")][string]$Tipus = "patch", [string]$Projekt = "Diaknyilvantarto.csproj")
$ErrorActionPreference = "Stop"
$xml = [xml](Get-Content $Projekt -Raw)
$csoport = $xml.Project.PropertyGroup | Where-Object { $_.Version } | Select-Object -First 1
if (-not $csoport) { throw "Nincs <Version> a projektfájlban." }
$reszek = $csoport.Version.Split(".") | ForEach-Object { [int]$_ }
switch ($Tipus)
{
"major" { $reszek[0]++; $reszek[1] = 0; $reszek[2] = 0 }
"minor" { $reszek[1]++; $reszek[2] = 0 }
"patch" { $reszek[2]++ }
}
$uj = $reszek -join "."
$csoport.Version = $uj
$csoport.AssemblyVersion = "$uj.0"
$csoport.FileVersion = "$uj.0"
$xml.Save((Resolve-Path $Projekt))
Write-Host "Új verzió: $uj"Megjegyzés: a szkript az első, <Version> elemet tartalmazó PropertyGroup-ot módosítja, és a hozzá tartozó AssemblyVersion/FileVersion elemnek léteznie kell a projektfájlban (különben az érték hozzárendelése hibát adhat: ilyenkor hagyd ki ezeket, mert az SDK a Version-ből származtatja őket). A XML mentése átrendezheti a formázást. A telepítő AppVersion értékét (14.6 lecke) is érdemes ebből a számból előállítani, vagy az iscc /DVerzio=1.2.1 kapcsolóval átadni.
Mit tegyél ide: a kész program ikonja a tálcán, a Névjegy ablak és a fájl Tulajdonságok → Részletek füle.Javasolt fájlnév: winforms-14-8-kesz.webp · Alt szöveg: A kész, márkázott program
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. Ikonkészlet
Készíts három ikonvariánst (16, 32 és 256 px), és hasonlítsd össze, melyik látszik jól a tálcán. A 16 pixeles változatot egyszerűsíteni kell (kevesebb részlet, vastagabb vonal, erősebb kontraszt); egyetlen Egy lehetséges megoldás
.ico fájl mindhárom méretet tartalmazhatja. A tálcán és a Fájlkezelő kis nézetében a 16/32 px dönt.
2. Változásnapló a Névjegyben
Add a Névjegyhez Újdonságok gombot, amely a A CHANGELOG.md tartalmát mutatja.Egy lehetséges megoldás
CHANGELOG.md kimenetbe másolása (CopyToOutputDirectory, 14.2 lecke), betöltés File.ReadAllText-tel (try–catch), megjelenítés egy csak olvasható, többsoros TextBoxban egy másik párbeszédablakban.
3. Verzió minden helyen
Ellenőrizd egy programodnál: hány helyen szerepel kézzel írt verziószám? Hogyan szüntetnéd meg? Keresd a szövegben (Ctrl+Shift+F) a Egy lehetséges megoldás
1. verziómintát: Form címe, Névjegy, telepítő, csomagnév. Egyetlen forrást (.csproj <Version>) hagyj meg, a többit kódból (Verzio osztály) vagy parancssori paraméterből töltsd.
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. Ikonformátum
Miért Az .ico, és nem .png?Megoldás megnyitása
.ico több méretet tartalmaz egy fájlban, a Windows ezt várja alkalmazásikonnak; a .png egyetlen méretű kép.
2. Hol állítod?
Melyik két helyen kell beállítani az ikont? Az Megoldás megnyitása
ApplicationIcon (az exe ikonja) és a Form.Icon (az ablak ikonja).
Közepes szint
3. Verziófajták
Mire jó az A .NET belső azonosítója; a fájl Tulajdonságok ablakában látszó verzió; a felhasználónak szóló verziószöveg.AssemblyVersion, a FileVersion és az InformationalVersion?Megoldás megnyitása
4. SemVer
Melyik számot növeled: hibajavításnál, új funkciónál, törő változásnál? Patch (1.2.1); minor (1.3.0); major (2.0.0).Megoldás megnyitása
Kihívás szint
5. Egy forrás
Miért jó, ha a verzió egy helyen él? A telepítő, a Névjegy, a napló és a csomagnév ugyanazt mutatja; nincs eltérés, és a frissítés-ellenőrző is helyesen hasonlít.Megoldás megnyitása
6. Személyes adat
Mit gondolsz át, mielőtt kiírod a nevedet és az e-mail címedet a Névjegyre? A program nyilvánosan terjed: a kiírt személyes adat bárkihez eljut. Elég lehet egy becenév/szerzői név és egy külön, erre szolgáló kapcsolati cím; iskolai projektnél az intézmény szabályai is számítanak.Megoldás megnyitása
Gyors önellenőrzés
Válaszolj fejben, és csak utána nyisd le a választ. Több méret egy fájlban, ezért minden helyen éles. A felhasználónak szóló verziószöveget (az Név, ikon, verzió, leírás, szerző és szerzői jog, licenc, harmadik fél, kapcsolat, adatok helye, hibabejelentő gomb. A Megmondja, mit szabad mások számára a programoddal; licenc nélkül alapból nem szabad másolni. Saját vagy nyílt licencű legyen, és ne használj védjegyet engedély nélkül. Fájlkezelő, tálca, címsor, fájl Tulajdonságok, Névjegy és napló mindenhol ugyanazt a nevet és verziót mutatja.1. Mi az .ico előnye?
2. Mit ad az Application.ProductVersion?
InformationalVersion alapján).3. Mi kerül a Névjegyre?
4. Miért ShowDialog using-gal?
ShowDialog után a Form nem szabadul fel magától: a using megszünteti a szivárgást.5. Miért kell licenc?
6. Mire figyelsz az ikonnál?
7. Hogyan ellenőrzöd a márkázást?
Mit tudsz már?
- Saját ikont állítasz be az exe-hez és az ablakhoz.
- Verzió- és szerzői adatokat adsz meg a projektfájlban, és kódból olvasod ki őket egy forrásból.
- Névjegy ablakot készítesz a szükséges tartalommal és hibabejelentő gombbal.
- Ismered a szerzői jog és a licenc alapjait, és tudod, mit ne írj ki a névjegyre.
Következő lecke: Mini projekt: kész alkalmazás kiadása
A 14. fejezet záró projektje: egy teljes kiadás előkészítése, csomagolása, telepítése és ellenőrzése.



