#1 Rastlyn
OOP - kdybys jej dodržoval... GUI odstav od logiky. Pak nebudeš mít logiku uvnitř grafiky - uvnitř formuláře! Založ tedy konzolovou aplikaci a pak knihovnu. Do referencí konzolové apky dej Core/Kernel - prostě tu knihovnu s logikou - já to vždy nazývám Core.dll... A z konzole udělej GUI (Windows Application) - v nastavení. Tím dosáhneš maximálního oddělení GUI od logiky. V jádru - knihovně budeš mít jen logiku a v projektu GUI zase jen grafiku. No a to už je jen krůček k tomu manipulovat se všemi stránkami GUI z Program.cs - z Main statické metody. Příklad:
using System.Windows.Forms;
using System.Drawing;
using System;
namespace Respick
{
static class Program
{
[STAThread]
static void Main()
{
Font bigFont = new Font("Segoe UI", 21.6F, GraphicsUnit.Pixel);
Form mainForm = new Form
{
Font = new Font("Segoe UI", 14.4F, GraphicsUnit.Pixel),
StartPosition = FormStartPosition.CenterScreen,
ClientSize = new Size(346, 480),
KeyPreview = true,
Text = "Respick"
};
(...)
new Label
{
Parent = mainForm,
Text = "Šipka vlevo",
Location = new Point(250, 370),
ForeColor = Color.FromArgb(153, 153, 153)
};
new Label
{
Text = "Posun vpravo",
Parent = mainForm,
Location = new Point(250, 390),
ForeColor = Color.FromArgb(102, 102, 102)
};
new Label
{
Parent = mainForm,
Text = "Šipka vpravo",
Location = new Point(250, 410),
ForeColor = Color.FromArgb(153, 153, 153)
};
(...)
new Timer
{
Interval = 30,
Enabled = true
}.Tick += (sender, args) =>
{
tetris.HandleTimer();
level.Text = "Level: " + tetris.Level;
score.Text = "Skóre: " + tetris.Score;
};
Application.EnableVisualStyles();
Application.Run(mainForm);
}
}
}
No a to je právě ono! Jak takto vytvoříš 2 Formuláře a spravuješ je z jedné metody, není nic snazšího, než přehazovat data mezi nimi... Pročež v logice - jádru aplikace máš jen co nejobecnější vyjádření. Například s oblibou vytvářím Action (totéž jako event) Draw. A tuto akci pak naplním až v GUI - v Main metodě. Tím mohu volat obecné Draw - třeba s nějakými parametry a GUI si to vykreslí vždy po svém. To mi umožňuje měnit GUI jako plenky. Prostě jen jinak naplním obecnou dynamickou metodu Draw... Přesně takto je OOP myšleno - takto se to má dělat. Ne nacpat vše do GUI a pak se divit, že je to jeden splácanec, který se nedá upravit, který se nedá portovat,... Logika má být stranou a má být prošpikovaná eventy/Akcemi/Funkcemi (Func - je dynamická metoda s návratem) a vlastnostmi. Nic jiného nemá koukat ven - zapečetění objektu. A v GUI pak jen doplníš grafiku - naplníš veškerá obecná volání - eventy atd. Tím může být ona logika provedena na jakémkoliv zařízení s jakoukoliv grafikou... Tzv. vrstvení aplikace. Zde by ti to umožnilo mít data v úplně jiném objektu než GUI. A z tohoto objektu bys jen předával určité vlastnosti. (Co nejvíce dat má být skryto, aby objekt nebyl zranitelný a naopak, aby se nestal dírou pro OS.)
Vždy mne napadají pro nesrozumitelné vyjadřování - tak se pokusím to ještě zpřehlednit:
Přestat používat VS designer atp. Vytvářet GUI z jediného zaujatého objektu - Program. Vše ostatní mít obecné! Tedy bez konkrétních dat, bez konkrétního provedení GUI. (Nevykreslovat nic v jakékoliv jiné části aplikace - nikde nemít ani MessageBoxy - nic.) Cokoliv chceš provést v GUI, tomu vytvoř v logice jen obecnou metodu. Například o chybě informuji pomocí vlastnosti typu Action - název „ErrorMessage“/„ErrorDialog“/... A v GUI pak naplníš toto obecné volání třeba pomocí Console.WriteLine, nebo pomocí MessageBoxu, nebo ... A rovněž takto zacházej se vším jiným. V logice nemá být nic konkrétního - vše musí být obecné vlastnosti a proměnné. Konkrétní data doplní každá jiná aplikace. Tím jedno jádro můžeš použít v 10 projektech - to je základ OOP, základ tvého vlastního frameworku.