itamas - Tag	| 127 hsz #211633 2017.10.23 14:21 GMT+1 óra
Igazad van, tényleg alaposabban át kell böngésznem a leírásokat, könyveket - az elejére is koncentrálva . Eddig csak azt kerestem bennük, hogy egy C# program szerkezete hogyan is épül fel, tehát hogy milyen változót hova írva benne milyen hatást érhetünk el, és mely rész mije a kódnak.
De köszönöm, hogy rávezettél a megoldásra: a lista létrehozását a public MainForm() fölé írtam és így már működött !
Instalok - Tag	| 607 hsz #211632 2017.10.23 11:01 GMT+1 óra
Így továbbra sem fog semmire sem menni. Ne a mostani problémádat akard megoldani a könyvvel, hanem tanuld meg az alapokat, mert láthatóan hiányoznak. Először szerintem próbáld megérteni, megtanulni az alapokat. Mi az hogy változó, osztály, milyen viszonyban állnak. Mi az a függvény, hogyan kell egyet készíteni és meghívni, mik azok, hogy visszatérési érték, paraméterek, stb. Ezek után jöhetnek az objektum-orientált dolgok, mint például öröklődés, példányosítás, dinamikus típuskonverzió (fú de utálom ezt magyarul leírni), stb-stb.
Gondolj bele, hogy az "ujjatekos" változódat miért látod a többi helyen? Azért, mert class member, tehát nem függvényen belül lett deklarálva, hanem az osztályon belül. Tehát akkor mit kell tenni a játékosok listájával?
Fontos megtanulni, hogy mi a példány, egy adott osztályon, ha végzel valamilyen módosítást, akkor az az összes példányra, vagy csak egyre hat, stb. Rövid példa:
// ezek látszanak az adott osztály nem-statikus függvényeiben
int valtozo1;
List<int> valtozo2;
bool valtozo3;
// a statikus változók nem példányhoz tartoznak, hanem minden példányhoz "közös"
static float valtozo4;
void Fuggveny1()
valtozo1 = 10;
valtozo2 = new List<int>();
valtozo3 = true;
// nem statikus függvény módosíthatja a statikus változókat
valtozo4 = 3.1415f;
static void Fuggveny2()
// statikus függvény nem módosíthatja a nem statikus változókat
valtozo1 = 10; // hiba
valtozo2 = new List<int>(); // hiba
valtozo3 = true; // hiba
valtozo4 = 3.1415f; // ok
itamas - Tag	| 127 hsz #211630 2017.10.22 15:23 GMT+1 óra
C#-os e-könyvem van kettő is: az, amit belinkeltél és Illés Zoltán: Programozás C# nyelven c. könyve. Tegnap meg most ezeket böngésztem, de még nem tudtam kihámozni belőlük azt a logikát, hogy a MainForm() függvényen kívülre hogy lehet kivezetni a programot. Mert addig világos, hogy annak a konstruktorában hoztam létre a téglalapot, de hogy utána ezzel hol és mit kezdhetek, annál megállt a tudományom. GameMaker-en "edződött" agyam kicsit nehezen áll ennek a nyelvnek a logikájára; ott pl. olyan kényelmes volt instance_destroy()-ozni...
De azért haladtam és már csak egy kérdésem maradt: hogy a következő kódban a jatekosok változó (vagy listaazonosító, vagy minek nevezzem) hol deklarálandó, hogy a Rajzol() függvény foreach ciklusa felismerje?
namespace valami
public class jatekos
public int xhely;
public int yhely;
public int szel;
public int mag;
public jatekos()
szel=50;
mag=50;
jatekos ujjatekos;
List<jatekos> jatekosok=new List<jatekos>();
Random vsz=new Random();
jatekosok.Add(new jatekos() {xhely=vsz.Next(1,200),yhely=vsz.Next(1,200)});
Paint += new PaintEventHandler(Rajzol);
void Rajzol(object sender, PaintEventArgs e)
foreach (jatekos ujjatekos in jatekosok)
e.Graphics.FillRectangle(Brushes.BlueViolet,new Rectangle(ujjatekos.xhely,ujjatekos.yhely,ujjatekos.szel,ujjatekos.mag));
Ezt a hozzászólást itamas módosította (2017.10.22 17:17 GMT+1 óra, 635 nap)
Instalok - Tag	| 607 hsz #211628 2017.10.21 18:09 GMT+1 óra
Esetleg ez a könyv?
[url]https://devportal.hu/download/E-bookok/csharp%20jegyzet/C%23%20programozas%20lepesrol%20lepesre%20-%20Reiter%20Istvan%20(frissitett%20tartalommal%202012.10.15).pdf[/url]
itamas - Tag	| 127 hsz #211626 2017.10.20 18:18 GMT+1 óra
Hát igen, lehet, hogy amolyan "hűbeleBalázs" módon fogtam a C#-ozásba Egy könyvem van róla, Trey Nash: C# 2008 - Könnyen is lehet! című kötete, de ahogy lapozgattam, ez nem kezdőknek szól és elég száraz is, úgyhogy megpróbálok a világhálóról szemezgetni, tanulgatni, mert tényleg hiányosak az alapok.
Instalok - Tag	| 607 hsz #211625 2017.10.20 18:10 GMT+1 óra
Nem bántásból mondom, de szerintem fogj egy C# programozás könyvet, és előbb tanuld meg az alapokat, mert így sehova sem fogsz jutni.
- Egy osztályban definiálhatsz függvényeket is, amik "valamit csinálnak", ahogy azt a lenti példakódban is láthattad
- hiányzik a "new" a Rectangle elől
- az ujjatekos-t a MainForm konstruktorában hoztad létre, és az csak az adott függvényen belül létezik, a függvény végén meg is szűnik, ezért nem láthatod máshol. Legyen belőle class member, akkor minden (nem statikus) függvényben látni fogod.
Viszont így tényleg nem sokra fogsz menni, meg kell tanulnod az alapokat:
- változó (azok típusai)
- osztály + interfész
- statikusság
itamas - Tag	| 127 hsz #211624 2017.10.20 18:03 GMT+1 óra
Próbálkozok, próbálkozok, de egyvalamit nem értek és leírást sem találok róla sehol: addig rendben, hogy a public class-sal létrehozok egy osztályt mondjuk jatekos néven (ez rajzolná majd ki a téglalapot a maga helyére). Belül feltöltöm ezt adatokkal és létrehozom a változókat. Gondolom itt mást, pl. kirajzolást nem lehet csinálni(?).
Aztán a public MainForm()-ban esetleg még hozzárendelek ezen osztály változóihoz adatokat.
És innen jön nekem a titok, hogy ezen változókat hogyan használhatom fel máshol egy téglalap kirajzolásához. Itt a kódom:
public int xhely=10;
public int yhely=10;
jatekos ujjatekos=new jatekos();
ujjatekos.szel=50;
ujjatekos.mag=50;
KeyDown += new KeyEventHandler(gombnyomas);
e.Graphics.FillRectangle(Brushes.BlueViolet,Rectangle(ujjatekos.xhely,ujjatekos.yhely,ujjatekos.szel,ujjatekos.mag));
void gombnyomas(object sender, KeyEventArgs e)
ujjatekos.Dispose();
Erre azokat a hibákat írja ki, hogy "A(z) „System.Drawing.Rectangle” egy „típus” konstruktor, de „változó” konstruktorként használva. (CS011 " meg hogy "Az "ujjatekos" név nem szerepel ebben a környezetben".
Hogyan lehet megjavítani a programomat?
És még arra vagyok kíváncsi, hogy a "sender" és az "e" paraméterek mit jelentenek a függvényekben? A C# teszi oda magától, de mire hivatkozik ezekkel?
itamas - Tag	| 127 hsz #211623 2017.10.20 16:07 GMT+1 óra
Valamikor mintha próbálkoztam volna a Visual Studioval is, de ha jól emlékszem, sokmindent kellett volna még telepítgetni mellé, meg akkor még nem is Windows10-em volt. Erre a SharpDevelop-ra Google kereséssel találtam rá és azért is tetszett, mert van telepítést nem igénylő változata (csak kitömöríted és kész). Ez is igényel .NET keretrendszert (gondolom a Visual Studionak is az kellett), de nem kéri futtatáskor, bizonyára már benne van a Win10-ben, én nem tudom.
A példakódot nagyon köszönöm; átnézem és próbálom értelmezni.
Instalok - Tag	| 607 hsz #211622 2017.10.19 19:53 GMT+1 óra
Van valami különösebb oka, hogy nem Visual Studiot használsz?
A C# egy managelt nyelv, tipikusan nem akarsz azzal foglalkozni, hogy mikor szabadul fel a memória, ezért általánosságban nem akarod a Dispose()-t sem meghívni. Simán tarts fent egy listát az élő objektumokról, azokon végigiterálsz (for/foreach), és kirajzolod.
Csináltam egy nagyon egyszerű, lebutított példakódot.
// az az osztály, ami ki tud rajzolni dolgokat
class GraphicsDevice : IGraphicsDevice
public void DrawRectangle(Rectangle rect)
void Draw(IGraphicsDevice device);
// az az osztály, ami egy kirajzolandó téglalapot reprezentál
class DrawableRect : IDrawable
public void Draw(IGraphicsDevice device)
device.DrawRectangle(rect);
// az az osztály, ami egy objektumot reprezentál
// vannak komponensei, amik az adott működését biztosítják
// komponensek...
public IDrawable Drawable
// ezt hívja meg a GameObjectManager - ha nincs drawable komponens megadva, akkor "nem csinál semmit"
// ennél vannak szebb/jobb megoldások, de kis projektre jól működik
Drawable.Draw(device);
// végül az az osztály, ami az egészet karban tartja
// az élő objektumok listája
IList<GameObject> gameObjects;
public GameObjectManager(IGraphicsDevice graphicsDevice)
// új objektum elkészítése
GameObject CreateGO()
var res = new GameObject();
// hozzáadjuk az elő objektumok listájához
gameObjects.Add(res);
// ez itt több sebből is vérzik:
// 1) nem hívhatod ezt, ha éppen az adott listán iterálsz
// 2) ha egy adott objektumra kétszer meghívod, akkor kétszer akarod a listából eltávolítani ugyan azt az elemet
// jobb megoldás lehet, ha egy flaggel jelzed, hogy eltávolítani szeretnéd az objektumot
// majd minden egyes update elején/végén a megjelölt elemeket kitörlöd a listából
// ez megoldja mindkét fentebbi problémát, de az egyszerűség kedvéért most így csináltam
// kirajzoljuk az összes élő objektumot
foreach (var next in gameObjects)
next.Draw(graphicsDevice);
itamas - Tag	| 127 hsz #211621 2017.10.19 16:20 GMT+1 óra
Igen, én is arra gondolok, hogy osztályként (class) kéne meghatározni a jatekos-t is, aminek a példánya kirajzolja a téglalapot és akkor erre az osztályra talán(?) használható a Dispose(). De egy általam létrehozott osztályban hogyan tudok kirajzolni valamit?
Meg ez a hülye SharpDevelop is tisztára meg van most bolondulva: megnyitom a programomat és egy teljesen más kód köszön vissza vagy meg sem jelenik a kódszerkesztő képernyő. Ezután egy teljesen újat kezdtem, beillesztettem a kódomat, mert megvolt máshol is, erre a téglalap irányítása teljesen összezavarodott lett (ha a jobbra nyilat nyomom balra megy, stb.), pedig nem változtattam rajta semmit. Valaki fenn nagyon nem akarja, hogy értsek a C#-hoz...
Parallax - Tag	| 606 hsz #211619 2017.10.19 07:31 GMT+1 óra
itamas: A .NET memória kezelése eléggé összetett.
Először is a Dispose arra való, hogyha az objektumhoz hozzátartozik unmanaged erőforrás, vagy olyan managed, ami tartalmaz unmaged erőforrást (és így tovább) akkor ezzel a metódussal direktben, mint C++ nál lehet ezt az unmanaged v hibrid elemet törölni.
Ha Dispose pattern-t használsz, akkor legkésőbb a "desktruktor", (ami amúgy C#-ban nincs is, de lényegét tekintve ahhoz hasonló véglegesítő hívás GC által pluszban) lefutásakor törölhetőek a kézzel törölni kívánt elemek.
A jó hír, hogy neked ezzel most nem kell foglalkozni, mert managed objektumokat használsz, vagyis helyette az alábbiakat:
-ha struct-ot akarsz törölni, akkor minden olyan helyen, ahol van rá hivatkozás lecseréled egy másik üresre::
teglalap = new Rectangle(0, 0, 0, 0);
//többi helyen is
-Ez gondolom nem megoldás, ezért inkább használj osztályt és azt "töröld" (ilyen nincs, csak megjelölheted törlésre *1), így elég ennyi:
teglalap = null;
*1: A törlésre kijelölt elemek azonnali törlésére lehet a GC-t utasítani, de nem ajánlott bele avatkozni a működésébe direktben:
Röviden ennyi, ettől ez persze sokkal összetettebb.
Instalok - Tag	| 607 hsz #211618 2017.10.19 07:02 GMT+1 óra
Eleve például egy komponens alapú megoldás lenne a legjobb. Azt gondold végig, hogy mi a játékos?
- tudod irányítani (Input komponens)
- ki kell rajzolni valamit (Shape/Graphics/akármi komponens)
- tud ütközni (Collider komponens)
Ilyen szempontból a játékos, a lövedék és az ellenfelek annyira nem is különböznek, csak más az Input komponensük. Tehát például kirajzoláskor a kirajzolást végző függvénynek mindegy, hogy éppen a játékost vagy valami mást rajzol.
Ezért jó lentről felfelé építkezni. Megcsinálod először azt az osztályt, ami ki tud rajzolni alakzatokat (ha nem akarsz mást, csak téglalapokat, akkor még könnyebb). Ezek után csinálod a fölé épülő rendszereket, például a SceneManager ami már "game object" szinten kezeli az objektumokat. Az, hogy egy ilyen "game object" (vagy Entity, akármi) hogyan épül fel, az már ennek (vagy még efölött álló rendszernek) a dolga. A rajzolásért felelős rendszernek ehhez semmi köze. Az csupán annyit tud, hogy alakzatokat/téglalapokat kirajzol.
Pixi - Tag	| 206 hsz #211617 2017.10.19 01:18 GMT+1 óra
Mi lenne akkor, ha a játékost meg a többi elemet is egy vagy több osztály írná le? Majd ezt az osztályt mikor példányosítod, egyből belepakolnád egy listába, majd ha törölni szeretnél valamit, akkor egész egyszerűen a lista egy adott indexű elemét törlöd csak. Ez működik abban az esetben is, ha csak egyetlen példányod van. Vagy csak azért így oldottad meg, mert most ismerkedsz a nyelvvel?
Mellesleg ha komolyabban szeretnél játékfejlesztéssel foglalkozni, akkor ajánlom a MonoGame framework -ot a továbbiakban.
Instalok - Tag	| 607 hsz #211615 2017.10.18 17:13 GMT+1 óra
Jobb megoldás lenne, ha például egységbe zárnád a dolgot, és például lenne egy Player osztályod, aminek van isAlive adattagja. Bár, ez sem a jó megoldás, de kis projekteknél megfelelő.
Amikor írsz fórumra egy olyan problémáról, amiben hibát kapsz, akkor javasolt a hibát is leírni. Egyébként, ha jól sejtem, akkor a Rectangle egy struct, ami viszont "érték típus", tehát nem lehet null. Gyanítom ez a hibaüzenet is, hogy null-ra szeretnél egy non-nullable dolgot állítani.
itamas - Tag	| 127 hsz #211614 2017.10.18 16:48 GMT+1 óra
Nemrég letöltöttem az ingyenes SharpDevelop fejlesztőkörnyezetet, hogy belekóstoljak a C# programozási nyelvbe én is. Kezdetnek valami egyszerű lövöldözős-féle "játékot" szeretnék csinálni vele, amiben a játékost egy nagyobbacska négyzet jelképezi és a többi kelléket (lövedékek, ellenségek) is kisebb-nagyobb síkidomok. Namármost a kirajzolás meg a mozgatás megvan, de az objektumok megsemmisítése még nem. Ezt hogyan kell? Utánaolvasva a Dispose() függvény a megoldás, de nem engedi a SharpDevelop sem azt, hogy a kirajzolt téglalap után tegyem a Dispose()-t, sem azt, hogy null értékkel tegyem egyenlővé és így a szemétgyűjtő kitarkarítsa.
Így rajzoltatom ki a játékos-négyzetet:
xhely=50;
yhely=50;
Rectangle teglalap;
teglalap=new Rectangle(xhely,yhely,100,100);
teglalap.X=xhely;
teglalap.Y=yhely;
e.Graphics.FillRectangle(Brushes.BlueViolet,teglalap);
így meg törölném egy gombnyomásra:
teglalap.Dispose(); //vagy teglalap=null; de ez is hibát ír ki!
Az a kérdésem tehát, hogy ez az objektumtörlés hogyan oldható meg a C#-ben, Windows alkalmazásban? Vagy osztályként (class) kéne megadnom a téglalapot és akkor használható a Dispose()? Ez utóbbi esetben hogy történik a kirajzolás megadása az osztályon belül?
Matzi - Szerkesztő	| 2526 hsz #211386 2017.05.23 12:52 GMT+1 óra
Szerintem nem feltétlenul a megoldásra gondolt, hanem arra hogy hogyan oldja meg kódból. Az már némileg trukkosebb, mert kell valamiféle reprezentáció az állapottérre, és azon kell optimalizálni egy legrovidebb utat.
FZoli - Szerkesztő	| 4893 hsz #211385 2017.05.23 12:27 GMT+1 óra
áhh elkéstem, írni akartam, hogy nem olyan nehéz, akár simán a lehetőségek próbálgatásával is fejben percek alatt megoldható a feladat.
Lord_Crusare - Törzstag	| 1317 hsz #211384 2017.05.23 12:20 GMT+1 óra
Először át megy az 1 és 2 perces ürge (ez eddig 2 perc). Az 1 perces visszajön, visszahozza a lámpát (ez 3 perc). Ezután átmegy az 5 és 10 perces ürge (13 perc), a 2 perces vissza hozza a lámpát (15 perc). Végül az 1 és 2 perces is átmegy, és ez így 17 perc.
djlord - Tag	| 1 hsz #211383 2017.05.23 10:54 GMT+1 óra
Valaki eltudná küldeni nekem ennek a feladatnak a megoldását mert nem tudom megcsinálni és szükségem lenne rá hogy megértsem a működési elvét az ilyen programoknak előre is nagyon köszönöm ha valaki szán rám időt .
Instalok - Tag	| 607 hsz #210850 2017.01.26 09:09 GMT+1 óra
Áh, annyi kizárt, hogy lesz, ráadásul a linkelt megoldás tök jól működik, még a selection-t is kezeli magától. Köszi!
Parallax - Tag	| 606 hsz #210849 2017.01.26 08:58 GMT+1 óra
Mindenképpen az utóbbi, vagyis lekérdezni a teljes listát, majd azon LINQ-zni és a memóriában manipulálni, ha valami változik, csak azt menteni. Amíg nem milliós nagyságrendű adatokkal dolgozol ez járható út.
Instalok - Tag	| 607 hsz #210847 2017.01.25 14:05 GMT+1 óra
Közben sikerült végre (talán) összeraknom, haladtam is kicsit tovább. Most viszont felmerült egy olyan kérdés, amire nem egyértelmű a válasz.
Ezt a hozzászólást Instalok módosította (2017.01.25 14:56 GMT+1 óra, 905 nap)
Parallax - Tag	| 606 hsz #210844 2017.01.25 07:43 GMT+1 óra
Láttam én is olyan projektet, ahol nem volt model se, hanem a view-be voltak belehekkelve az entitás objektumok közvetlen kezelése. Be is bukott a projekt, mert egyre kuszább, átláthatatlanabb lett az egész, mert azt hitték így gyorsabban haladnak. Tehát hosszútávon kell egy jól felépített architektúra és a TDD-re se árt rászokni, sokat segít a még jobb felépítésben és nem utolsó sorban nem kell soha félni, hogy valami elromlik és ez időben megtérül.
Instalok - Tag	| 607 hsz #210840 2017.01.24 12:29 GMT+1 óra
Hehe, igen, láttam a Resharpert sokan használják, egyelőre megvagyok nélküle. Amúgy pont megtaláltam a data validationt is, legalábbis az IDataErrorInfo részt, de látom van pár lehetőség (legalábbis .NET 4.5-től felfelé).
Olvasgattam meg néztem videókat még kicsit a témában, és megint elbizonytalanodtam. A legtöbb helyen a modelt egyként definiálják az entityvel. De ahogy írtad is, az nem úgy logikus (és biztonságos), ha az a két dolog elkülönített? Arról nem is beszélve, hogy a legtöbb leírásban a tényleges Data Access hardcode-olt, sehol nem használtak igazán Dependency Injectiont. Tehát nem is volt ennyi absztrakciós szint.
class XEntity
Parallax - Tag	| 606 hsz #210838 2017.01.24 07:41 GMT+1 óra
A CanExecute csak akkor engedi a gombot, amikor már minden valid. Közben a controlokra szépen rá lehet kötni error providert, ami irkálás közben jelzi a hibákat, de addig nem tudsz menteni, amíg a CanExecute nem engedi: DataValidation
Még, ami hasznos (C++ hoz is cool) a ReSharper. Ez akár DLL-eket is behúz a projektbe, ha valami nem található, de a név alapján rájön honnan való. Ezzel elég precízen is be lehet tartani a kódolási szabályokat, sok mindent kijavít, ismeri a legújabb nyelvi szabályokat, xaml kódot, mindent. (Sajnos fizetős, de le lehet szedni krackelten.) Valaki úgy megy interjúra, hogy előre megkérdezi van e ReSharper licensz.
Instalok - Tag	| 607 hsz #210837 2017.01.23 18:15 GMT+1 óra
Közben csináltam commandokat is, működik a CanExecute is, csak annyi a gondom így az egésszel, hogy a User nem kap visszajelzést, hogy miért nem tud mondjuk egy új terméket hozzáadni az adatbázishoz.
Instalok - Tag	| 607 hsz #210836 2017.01.23 15:49 GMT+1 óra
Most már nekem is, csak meg kellett oldanom, hogy a resources-ok között ott legyen a data context. Érdekesen meg kell csavarni, mert nálam úgy néz ki, hogy adott ugye a Repository, aki közvetlenül az adatokkal machinál, a ViewModelnek pedig kell egy Repository objektum. Viszont ez nincs hardcode-olva, azaz kívülről kapja meg (az alkalmazás dönti el, hogy milyen Repositoryt használ, ha adatbázis, akkor milyet, stb.) konstruktor paraméterként.
Viszont most jöttem rá, hogy mivel egyébként is csináltam egy ProductsView osztályt a View assemblyn belül, így használhatok commandokat is, amik csak simán meghívják az ősosztály függvényeit.
Ja és köszi a segítséget, valamiért elég nehéz volt most a felfogásom.
Parallax - Tag	| 606 hsz #210835 2017.01.23 15:30 GMT+1 óra
Nekem VS15-el érzékel mindent, még a nyelvi resource-öket is. A commandozást is próbáld az is jó dolog és be lehet állítani, hogy a parancs milyen esetben teljesülhet, ha nem, akkor automatán letiltja a gombot.
Instalok - Tag	| 607 hsz #210834 2017.01.23 13:35 GMT+1 óra
Hehe, akkor lehet jobban ránézek a WPF-re, csak eléggé szokni kell. A Winforms-t már nagyjából ismertem, de sebaj.
Parallax - Tag	| 606 hsz #210833 2017.01.23 13:14 GMT+1 óra
Winforms alá sehogy, ott egy elem tulajdonságait tudod kötni controlokhoz és ennyi, a többit le kell kódolni. .NET-ben a winforms olyan, mint C++ nál a Win API, már nem nagyon használja senki.
Instalok - Tag	| 607 hsz #210832 2017.01.23 13:02 GMT+1 óra
Azt hiszem kezdem kapisgálni (csináltam egy mini WFP alkalmazást, ami megoldja a lenti feladatot) Szóval a ViewModel olyan objektumokat ad vissza, amikhez lehet bindolni. Tehát, ha akarok egy olyan listát, ami csak a Product neveket adja vissza, akkor a ViewModelnek van egy olyan propertyje, hogy ObservableCollection<string> ProductNames. A Notify meg gondolom azért kell, hogy ha a ViewModel átbuherálja a listát, akkor a View értesüljön róla.
Parallax - Tag	| 606 hsz #210831 2017.01.23 12:12 GMT+1 óra
Ha WPF-et használsz, akkor kb ennyi lenne:
ItemsSource="{Binding Products, Mode=TwoWay}"
SelectedItem="{Binding SelectedProduct, Mode=TwoWay}"/>
"{Binding SelectedProduct.Name, Mode=TwoWay,
Instalok - Tag	| 607 hsz #210830 2017.01.23 11:15 GMT+1 óra
Na ja, ezt a binding dolgot még emésztenem kell. Ha saját magamnak kódolom le a controlok állítgatását, akkor tök jó, csak persze ennél lehet okosabban is. Esetleg tudnánk egy példát nézni? Úgy talán összeállna teljesen.
public class DBRepository : IRepository
public sealed class Product : BindableBase
public sealed class Products
public bool Add(Product p_Product, Action<string> p_Error)
private Products m_Products; // a fentebbi Products osztály
Parallax - Tag	| 606 hsz #210829 2017.01.23 09:56 GMT+1 óra
A databinding lényege, ahogy írtad oda-vissza (WPF-ben ez állítható is) automatikus adatkapcsolat. Listára is működik például a fa struktúrámban kitörlök valamit és ez rá van kötve egy TreeView-re, akkor az látszik is, ehhez nem kell külön programozni semmit. Ahogy kiválasztok egy node-ot, a SelectedItem is automatikusan kiválasztódik és mutatja az adatait is. Az adat lehet szöveg, kép stb, szépen realtime szerkesztődik minden a memóriában és, ha kiadod a mentés parancsot, akkor a megfelelő adatok a megfelelő táblába mentődnek a Model-en keresztül ellenőrzötten.
Instalok - Tag	| 607 hsz #210828 2017.01.23 08:16 GMT+1 óra
Igen, kell is még néhány módosítás. Azóta aludtam rá egyet, és valószínűleg az lesz, hogy ez a Products osztály nem Entityket fog visszaadni, hanem megjelenítendő modelleket, mert, ahogy írtad is, entityket nem használunk közvetlenül. A biztonságosabb kód mellett a további előnye a különböző konverziók lesznek, illetve az olyan propertyk megléte, amelyek nem részei az entitynek egyébként.
Ezt az automatikus bindolást használják egyébként mindenfelé a kódban. Lehet én is fogom, de nekem könnyebb követni, ha ott van az a glue kód, és látom, hogy mi-mit-mikor-miért csinál. Persze a másik sem bonyolult, csak nekem új.
Ha jól értettem a bindingnak a lényege az, hogy a ViewModel egy propertyje és a View egy UI eleme össze van kapcsolva, így, ha a ViewModel valamiért változik (például egy action hatására), akkor a View UI eleme is automatikusan változik, és nem kell ismételten lekérnem az adatokat. Illetve gondolom fordítva is igaz, ha a UI elemet szerkesztem (mert az pl. egy textbox), akkor a ViewModel kap egy értesítést, hogy az adott property változott.
Parallax - Tag	| 606 hsz #210827 2017.01.23 07:06 GMT+1 óra
Entitást közvetlenül nem használunk semmire, mert bármilyen manipuláció történik azt úgy veszi, hogy az az adatbázissal történik és valahol elsül egy SaveChanges(), főleg, ha globális is, akkor ki tudja mi lesz.
A másik, hogy a model direkt a felületekre van felkészítve, a listában kiválasztott elem hozzá van kötve egy propertyhez, ha a lista változik a lista is automatikusan változik, ha adott elem bármilyen propertyje változik az a felületen automatikusan megjelenik és vissza. Igazából ez a .NET (WPF, ASP.NET MVC) előnye, ezek a kötési automatizmusok.
Instalok - Tag	| 607 hsz #210825 2017.01.22 14:07 GMT+1 óra
Valami hasonlót találtam ki azóta:
Parallax - Tag	| 606 hsz #210824 2017.01.22 11:29 GMT+1 óra
Instalok: Winforms, meg webforms az nem épp MVVM/MVC-re van kihegyezve, de persze plusz kódolással megolható a szemlélet.
Én valahogy így építeném fel az architektúrát:
Data: Adatbázist burkoló alrendszer pl.: Etity framework. 1-1 entitás osztály reprezentál 1-1 táblát. Szuboptimálisan hangzik, de minden lekérdezésnél létre kell hozni a kapcsolatot, utána pedig megszűntetni (dispose pattern). Ez desktop és főleg netes programnál így szokás különböző hibalehetőségek és egyebek miatt.
Instalok - Tag	| 607 hsz #210823 2017.01.21 13:45 GMT+1 óra
Az a feladat, hogy egy Windows Desktop (WinForms) alkalmazást kell készíteni, amivel egy adatbázist lehet vezérelni (módosítani, lekérdezni, semmi komoly).
Pixi - Tag	| 206 hsz #208498 2015.10.19 13:52 GMT+1 óra
Azt hogyan lehet megoldani, hogy az adott aplikáción kívülre is tudjunk utasítást küldeni az egérnek és a billentyűzetnek? Vagyis egér pozíció, gomblenyomás és billentyűzet gomblenyomás a cél, ezt kéne szimulálni programon kívül is. Az természetesen alap, hogy a háttérben futna egy program, ami magát ezt a funkciót biztosítja, ugyanis hálózaton keresztül kellene vezérelni mindezt. Vagyis egy adott üzenet biztosítaná kliens oldalon azt az eseményt, hogy éppen mit kell szimulálni. Ezt hogyan lehet megvalósítani, hogy ne csak az adott programon belül legyen érvényes?
Ezt a hozzászólást Pixi módosította (2015.10.19 14:16 GMT+1 óra, ---)
Parallax - Tag	| 606 hsz #208099 2015.08.13 15:08 GMT+1 óra
Szerintetek hogyan legcélszerűbb egy telepítőt elkészíteni?
Pixi - Tag	| 206 hsz #208085 2015.08.11 13:10 GMT+1 óra
Tunyu: Köszi, szerintem ez pont az amit én kerestem.
Matzi: Egyelőre úgy vagyok vele, hogy amit én magam is elkészíthetek, azt miért ne? Legalább ezzel is tanulhatok valami újat. Bár lehet, hogy tényleg kész megoldást fogok alkalmazni majd. Azt mondjuk nem tudom, hogy mi a gond azzal, ha mellékelve van pl. egy "software requirements" mappában a .net-es telepítő (offline, de akár online változata is), és ezen kívül lenne maga a .net-es program telepítő.exe + egy readme.txt. Vagy ezek szerint ez már a múlté, és egy laikus felhasználó ilyen környezetben nem tudja feltalálni magát? Mondjuk el tudom hinni sajnos. Azt amúgy nem is értem hogy lehet olyan telepítőt generálni, ami külön beavatkozás nélkül, vagy pedig automatikusan érzékeli és telepíti a gépre az aktuális .net verziót. Azt mondod, hogy van az a bizonyos adat file. Ha jól értelmezem, akkor ez még külön ott van a telepítő mellett ugye? És akkor akár egy darab nyers adat file-ba is bele tudom tenni az összes contentet + exe filet is, csak a telepítő programon belül pl. megmondom hogy x byte-tól y-ig ez egy "image1.png" a következő lépésben már egy exe file-t kel kiírni, stb.
Matzi - Szerkesztő	| 2526 hsz #208084 2015.08.10 19:47 GMT+1 óra
Ha nem egy irányú lenne az SHA akkor csak azt használnám egyedül.
Az SHA nem titkosítás, hanem hash generálás. Annak a célja, hogy egy adatot átalakítson egy fix méretű másikká úgy, hogy kicsi legyen az ütközés esélye (két tetszőleges forrásból lehetőleg ne jöjjön ki ugyanaz a hash), de jelentősen csökkenjen méretben és ne lehessen visszafejteni. A titkosítás meg ugye nem akar elveszíteni adatot.
A legegyszerűbb, ha fogsz egy telepítő generáló programot, ami pont olyat csinál, mint bármelyik jelenleg is használt program telepítője. Biztos van ingyenes meg nyílt forráskódú is a neten.Az a baj, hogy ha külön akarod feltelepíttetni egy felhasználóval a .net-et, hogy ha még nincs a gépén, akkor jó eséllyel lövése sincs róla hogy mi az, és hogy előbb azt fel kellene tegye.
Mondjuk már a vistától felfelé a 3.0 az alap, de xp-n még külön fel kellett tenni. Szóval hacsak nem akarsz xpre is települni, akkor megírhatod .net-ben. Ilyenkor tipikusan van egy valamilyen adat file, akár lehet zip is, amit kicsomagolsz oda, ahová a user kéri, és esetleg telepítesz más programokat amik kellhetnek.
Tunyu - Tag	| 450 hsz #208083 2015.08.10 15:32 GMT+1 óra
Ha jól értem, akkor a válasz itt van.
Pixi - Tag	| 206 hsz #208080 2015.08.10 10:34 GMT+1 óra
Szerintetek hogyan legcélszerűbb egy telepítőt elkészíteni? Mennyire jó, ha maga a telepítő.exe egy komplet .NET-es alkalmazás? Valahogy úgy képzelem el, hogy van két fő file, az egyik a .net telepítő, amit a felhasználónak telepítenie kell 1x, ha az nincs a gépén, a másik maga a telepitő.exe, ami lehetne akár egy WinForm alkalmazás is (de végül is tökmind1 mi), és kisebb játékok esetén minden binárisan eltárolva ebben, tehát a kész projekt debug mappájában lévő anyagot betöltetném egy másik alkalmazásba, és ez íródna a tárolóra az előzőleg megadott útvonal szerint, ami már maga a telepítő.exe sajátos felépítésétől függ. A kérdés már csak az, hogyan oldják meg, hogy egy kész exe már magában tartalmazza nyersen az adatokat, tehát a különböző contenteket ne egy külső forrásból töltse be mindig, hanem már maga az exe része legyen? Mert ok, hogy program elindít, betölt minden adatot, de ezt ne kelljen külső forrásból töltögetnie. Úgy is kérdezhetném, hogy hogyan lehet a már lefordított aplikációt úgy debuggolni, hogy annak a része legyen a nyers adat? Gyanítom, hogy nem azt csinálják, hogy nyitnak minden egyes contetnek egy vagy több külön osztály.cs -t meg külön tömböt, és abba pakolgatják manuálisan byte-ok formájában a nyers adatokat. Vagy fölösleges ilyesmivel bajlódni, és bőven elég ma már egy kisebb játékot egy zip-be csomagolni, és úgy forgalmazni?
Ezt a hozzászólást Pixi módosította (2015.08.10 10:50 GMT+1 óra, ---)
Tunyu - Tag	| 450 hsz #208079 2015.08.09 16:49 GMT+1 óra
Láttam én is hogy van újabb és fejlettebb az MD5-nél, de mivel már az SHA -1 is 40 karakteres kimeneti mérettel rendelkezik, az már nekem túl nagy, mert a 256 bites AES egy 32 karakteres kulcsot igényel.Az MD5 kulcs sehol nem lesz tárolva, azt majd a kliens oldal generálja a bejelentkezési adatból és küldi el a szervernek ahol ugyan ezzel a kulcsal vissza tudja fejteni és újra kódolni a játékos mentett adatait .Ha nem egy irányú lenne az SHA akkor csak azt használnám egyedül.
Ezt a hozzászólást Tunyu módosította (2015.08.09 17:56 GMT+1 óra, ---)
Matzi - Szerkesztő	| 2526 hsz #208078 2015.08.09 15:44 GMT+1 óra
Ha ennyire fontos a biztonság, akkor használj mondjuk SHA-2-t vagy 3at, persze plusz só és bors.
Tunyu - Tag	| 450 hsz #208069 2015.08.07 21:29 GMT+1 óra
Igen én is erre gondoltam hogy egy kis toldalékkal már egészen más hasht kapunk és az adatbázisban már nem valószínű hogy létezik olyan.
 ˙˙˙˙  Assembly-CSharp RegData ep  ,pMXNyuDfK7eriIPOuIvDkmIHp1E0ORWjs5/dDVNR/6E= ZVsMJjj/MFbndyvC6POpPA==
Ezt a hozzászólást Tunyu módosította (2015.08.08 12:48 GMT+1 óra, ---)
Matzi - Szerkesztő	| 2526 hsz #208067 2015.08.07 20:23 GMT+1 óra
Ezért szokták sózni borsozni, de felőlem használhatsz más hasht is. Csak példának mondtam. Ez csak akkor kell, ha félsz, hogy ellopják a szerverről a jelszó hasheket.
Tunyu - Tag	| 450 hsz #208063 2015.08.07 12:23 GMT+1 óra
Az md5 már kicsit elavult ahogy így utánanéztem.Le is teszteltem, egy md5 generátorral lekódóltam néhány szót, az md5 decrypter meg 10 mp múlva már dobta a string értékét. Persze nem értelmes szavaknál már nem biztos hogy ilyen egyszerű,de sok ember még mindig értelmes szavakat használ jelszónak.