Új hozzászólás Aktív témák

  • quailstorm
    félisten

    "Komoly nosztalgia trip volt az oldal meg a sok GameMaker, DarkBasic csoda."

    Örülök, hogy ez tetszett (de nem DarkBasic-et, hanem FreeBasic-et használok).

    "Azt értem hogy ugrás után csak valamennyit lehet mozogni oldalra, bár egyet nem értek vele. De a felugrás és leesés sebessége nagyon lassú."

    Direkt csináltam úgy, hogy esésnél ne lehessen az irányt módosítani, mert így tűnik természetesnek a mozgás. A sebességen persze tudok majd módosítani.

    "Biztos jó volt a SharpDevelop valamikor, de nagyon bekorlátozod vele magad."

    Egyszerű de nagyszerű. Az én eddigi C#-os igényeimet legalábbis kielégítette. Sokat puskáztam hozzá a világhálóról keresgélve, hogy mire milyen utasítás a jó, és azt mind lehetett alkalmazni benne. De biztos van sok új lehetőség, amit csak egy korszerűbb fejlesztőeszközzel lehet megvalósítani, ahogy írod is.

    "programozni szeretsz, vagy játékot csinálni?"

    Célom a programozással a teljes világuralom megszerzése! (Hoppá, elszóltam magam, így kénytelen leszek e sorok minden olvasójára ráküldeni a gyilkos robotnindzsáimat...) :D
    De a viccet félretéve: mindkettőt szeretem. Ahogy írva is van a honlapom nyitóoldalán, keresgélem a nekem leginkább megfelelő programozási nyelvet ezek halmazából, és főleg játékok készítése által igyekszem elsajátítani azokat. Bár megmondom őszintén, nagyon "kocaprogramozó" vagyok, mert az ilyetén tudásom nagyjából kimerül a feltételes elágazások, ciklusok és tömbök ismeretében és használatában.

    "Direkt csináltam úgy, hogy esésnél ne lehessen az irányt módosítani, mert így tűnik természetesnek a mozgás."

    Ezt gondold újra kérlek. Hacsak nincs valami nagyon durva közegellenállás, az oldalirányú mozgásvektorod megmarad. Különben a papírrepülő is függőlegesen zuhanna lefelé pár méter után.

    "Bár megmondom őszintén, nagyon "kocaprogramozó" vagyok, mert az ilyetén tudásom nagyjából kimerül a feltételes elágazások, ciklusok és tömbök ismeretében és használatában."

    Ehhez kb. mindegy melyiket használod.

  • Tomi_78
    aktív tag

    Tegnap éjfélkor behalt az oldal így nem tudtam elküldeni, így elküldöm most.
    Amúgy nem, az a kék nagyon nem szemnyugtató.

    Komoly nosztalgia trip volt az oldal meg a sok GameMaker, DarkBasic csoda.

    Kis code review:
    Ez inkább hasonlít valami 90-es évek eleji TurboPascal kódra, mint C#-ra. Lényegében semmit sem használsz a C#-ból. 30 millió mélységű ifek, szörnyű.
    Szét kéne bontani függvényekre mert ez így átláthatatlan. OOP pattern, fájlokra bontás, rendes szerializálás a mentésre, pálya reprezentációra.

    A játékról: a fehér körvonalát el kéne tüntetni a talajnak, csúnya. Ez a Hold gravitáció meg nagyon lelassítja a mozgást, nem túl kellemes. 2 pálya után meguntam. Azt értem hogy ugrás után csak valamennyit lehet mozogni oldalra, bár egyet nem értek vele. De a felugrás és leesés sebessége nagyon lassú.

    Biztos jó volt a SharpDevelop valamikor, de nagyon bekorlátozod vele magad. Ha áttérnél Visual Studio Code-ra, vagy Visual Studio Community-re vagy JetBrains Rider Communityre akkor sokat segítene az IDE is, meg hozzáférnél a modern nyelvi funkciókhoz. .NET 4.5 óta sok minden változott, ahhoz nem férsz hozzá. Ugyanúgy külső könyvtárakból is csak ősi verziókat tudnál behúzni.

    Azt a kérdést tenném fel, hogy programozni szeretsz, vagy játékot csinálni? Lehet csúnya kóddal is jó játékot csinálni, ilyen például a VVVVVV.
    Ha programozni akarsz tanulni, akkor ezt a meglévő kódbázist kalapálnám át a paradigmáknak megfelelően meg még optimalizálnám a játékmenetet kicsit. Azzal talán többet tanulsz mint egy új projecttel.

    "Komoly nosztalgia trip volt az oldal meg a sok GameMaker, DarkBasic csoda."

    Örülök, hogy ez tetszett (de nem DarkBasic-et, hanem FreeBasic-et használok).

    "Azt értem hogy ugrás után csak valamennyit lehet mozogni oldalra, bár egyet nem értek vele. De a felugrás és leesés sebessége nagyon lassú."

    Direkt csináltam úgy, hogy esésnél ne lehessen az irányt módosítani, mert így tűnik természetesnek a mozgás. A sebességen persze tudok majd módosítani.

    "Biztos jó volt a SharpDevelop valamikor, de nagyon bekorlátozod vele magad."

    Egyszerű de nagyszerű. Az én eddigi C#-os igényeimet legalábbis kielégítette. Sokat puskáztam hozzá a világhálóról keresgélve, hogy mire milyen utasítás a jó, és azt mind lehetett alkalmazni benne. De biztos van sok új lehetőség, amit csak egy korszerűbb fejlesztőeszközzel lehet megvalósítani, ahogy írod is.

    "programozni szeretsz, vagy játékot csinálni?"

    Célom a programozással a teljes világuralom megszerzése! (Hoppá, elszóltam magam, így kénytelen leszek e sorok minden olvasójára ráküldeni a gyilkos robotnindzsáimat...) :D
    De a viccet félretéve: mindkettőt szeretem. Ahogy írva is van a honlapom nyitóoldalán, keresgélem a nekem leginkább megfelelő programozási nyelvet ezek halmazából, és főleg játékok készítése által igyekszem elsajátítani azokat. Bár megmondom őszintén, nagyon "kocaprogramozó" vagyok, mert az ilyetén tudásom nagyjából kimerül a feltételes elágazások, ciklusok és tömbök ismeretében és használatában.

  • joysefke
    veterán

    Köszönöm a visszajelzéseket! :D
    Igen, a honlap kinézete kissé fapados, de annakidején ennyit tudtam összehozni a Jegyzettömb+HTML-kód párossal. A kék háttérszín pedig olyan szemnyugtató, nem?
    És ha lesz a játéknak második része, akkor azt okvetlenül szebbé teszem majd kinézetileg, de most egy teljesen más program elkészítése van a fejemben. Mindenesetre sok tapasztalatot szereztem ezzel is (szinte 0-ról indulva) és nagyon megtetszett ezáltal a C# programnyelv is. De maga a SharpDevelop fejlesztőkörnyezet is vonzó a maga egyszerűségével, hiába, hogy nem fejlesztik már - sajnos. Annakidején csak rákerestem valami olyan kulcsszavakkal hogy "ingyenes C# fejlesztőkörnyezet" és ezt adta ki a Google. De nem bántam meg a használatát.

    Ahogy mások is utaltak rá: semmi értelme öreg verziókat és vacak toolingot használni.

    Mindig az aktuális szupportált NET verziót és olyan csomagokat és toolingot érdemes használni ami szupportált, stabil, jól dokumentált és a fejlesztők nagy része is azt használja így a problémáiddal már mások is találkoztak. Az alternatívkodás szerintem abszolút kontraproduktív.

  • quailstorm
    félisten

    Köszönöm a visszajelzéseket! :D
    Igen, a honlap kinézete kissé fapados, de annakidején ennyit tudtam összehozni a Jegyzettömb+HTML-kód párossal. A kék háttérszín pedig olyan szemnyugtató, nem?
    És ha lesz a játéknak második része, akkor azt okvetlenül szebbé teszem majd kinézetileg, de most egy teljesen más program elkészítése van a fejemben. Mindenesetre sok tapasztalatot szereztem ezzel is (szinte 0-ról indulva) és nagyon megtetszett ezáltal a C# programnyelv is. De maga a SharpDevelop fejlesztőkörnyezet is vonzó a maga egyszerűségével, hiába, hogy nem fejlesztik már - sajnos. Annakidején csak rákerestem valami olyan kulcsszavakkal hogy "ingyenes C# fejlesztőkörnyezet" és ezt adta ki a Google. De nem bántam meg a használatát.

    Tegnap éjfélkor behalt az oldal így nem tudtam elküldeni, így elküldöm most.
    Amúgy nem, az a kék nagyon nem szemnyugtató.

    Komoly nosztalgia trip volt az oldal meg a sok GameMaker, DarkBasic csoda.

    Kis code review:
    Ez inkább hasonlít valami 90-es évek eleji TurboPascal kódra, mint C#-ra. Lényegében semmit sem használsz a C#-ból. 30 millió mélységű ifek, szörnyű.
    Szét kéne bontani függvényekre mert ez így átláthatatlan. OOP pattern, fájlokra bontás, rendes szerializálás a mentésre, pálya reprezentációra.

    A játékról: a fehér körvonalát el kéne tüntetni a talajnak, csúnya. Ez a Hold gravitáció meg nagyon lelassítja a mozgást, nem túl kellemes. 2 pálya után meguntam. Azt értem hogy ugrás után csak valamennyit lehet mozogni oldalra, bár egyet nem értek vele. De a felugrás és leesés sebessége nagyon lassú.

    Biztos jó volt a SharpDevelop valamikor, de nagyon bekorlátozod vele magad. Ha áttérnél Visual Studio Code-ra, vagy Visual Studio Community-re vagy JetBrains Rider Communityre akkor sokat segítene az IDE is, meg hozzáférnél a modern nyelvi funkciókhoz. .NET 4.5 óta sok minden változott, ahhoz nem férsz hozzá. Ugyanúgy külső könyvtárakból is csak ősi verziókat tudnál behúzni.

    Azt a kérdést tenném fel, hogy programozni szeretsz, vagy játékot csinálni? Lehet csúnya kóddal is jó játékot csinálni, ilyen például a VVVVVV.
    Ha programozni akarsz tanulni, akkor ezt a meglévő kódbázist kalapálnám át a paradigmáknak megfelelően meg még optimalizálnám a játékmenetet kicsit. Azzal talán többet tanulsz mint egy új projecttel.

  • Tomi_78
    aktív tag

    Köszönöm a visszajelzéseket! :D
    Igen, a honlap kinézete kissé fapados, de annakidején ennyit tudtam összehozni a Jegyzettömb+HTML-kód párossal. A kék háttérszín pedig olyan szemnyugtató, nem?
    És ha lesz a játéknak második része, akkor azt okvetlenül szebbé teszem majd kinézetileg, de most egy teljesen más program elkészítése van a fejemben. Mindenesetre sok tapasztalatot szereztem ezzel is (szinte 0-ról indulva) és nagyon megtetszett ezáltal a C# programnyelv is. De maga a SharpDevelop fejlesztőkörnyezet is vonzó a maga egyszerűségével, hiába, hogy nem fejlesztik már - sajnos. Annakidején csak rákerestem valami olyan kulcsszavakkal hogy "ingyenes C# fejlesztőkörnyezet" és ezt adta ki a Google. De nem bántam meg a használatát.

  • Postas99
    őstag

    Sziasztok!
    Elkészültem hát a kis játékommal, amit C#-ban farigcsáltam már több, mint egy éve. Nem nagy durranás, de belesürítettem eddigi C#-os tudásomat, amit általatok is bővítettem, ezért úgy érzem, illendő is megmutatnom nektek kis művemet.
    Tehát az elérhetősége: [link]
    Benne van a forráskódja, illetve aki csak játszani akar vele, annak a smy/bin/Debug mappában maga a játék EXE-je.
    Jó szórakozást! :K

    Hogy legyen egy kis pozitívum, látom az erőfeszítést, de haladjunk a korral.

    1, játszottam 2 pályát.
    2, Hiba a vezérlésben, hogy ha lefele mész ugrásból utána már nem lehet kontrollálni hogy merre szeretnék "esni" nem néztem a kódot, de ha felfelé ugráskor lehet irányt váltani akkor nekem törvényszerű hogy eséskor is tudnám irányítani a figurát.
    3, Ha már van kezdő oldal, ahol van betöltés, mentés stb... akkor jó lenne ha ide feltennéd a különböző "ellenfeleket" tárgyakat színesítve a felületet mint annó a régi jó ARCADE játékokban.
    4, Most már annyira van jó az elevenlabs, hogy modernizálhatnád a hangokat.
    5, Ha cserélnéd a grafikát is (nem kell nanobanana , de bármely generatívAI készítene vonzó grafikát komplett ikonkészlettel számodra.
    6, A pontozás is lehetne modernebb.

    Gratula.

  • cattus
    addikt

    Úristen ember, ez a honlap. Nem, nem menő.
    És komolyan SharpDevelopban fejlesztesz valami ősi .Net Frameworkkel?
    Tudod, hogy 10 éve leálltak a fejlesztésével?

    Be kellett kapcsolnom a reader mode-ot, mert nem bírta a szemem a kékhalál-esztétikát. :N

  • martonx
    veterán

    Igen, a honlap nem https-es hanem csak http. Próbáld meg úgy akkor, hogy csak a főoldalt nyitod meg: [link] és onnan ugrasz a C#-os aloldalra.
    És köszönöm a tanácsot; lehet, hogy akkor átnyergelek én is a GitHub-ra (csak ez a saját honlaposdi olyan menő dolognak tűnik... :D ).

    Úristen ember, ez a honlap. Nem, nem menő.
    És komolyan SharpDevelopban fejlesztesz valami ősi .Net Frameworkkel?
    Tudod, hogy 10 éve leálltak a fejlesztésével?

  • Tomi_78
    aktív tag

    Nekem a böngésző még csak nem is hajlandó megnyitni a linket. Gondolom a nem biztonságos HTTP + .zip kombó kiveri a biztosítékot.
    Ha mutogatni akarod, akkor szerintem GitHubra kéne regisztrálni és oda feltölteni mint ahogy mások is teszik. További járulékos előny, hogy ha GitHubon van akkor biztos lehetsz benne, hogy az örökkévalóságnak megmarad.

    Igen, a honlap nem https-es hanem csak http. Próbáld meg úgy akkor, hogy csak a főoldalt nyitod meg: [link] és onnan ugrasz a C#-os aloldalra.
    És köszönöm a tanácsot; lehet, hogy akkor átnyergelek én is a GitHub-ra (csak ez a saját honlaposdi olyan menő dolognak tűnik... :D ).

  • joysefke
    veterán

    Sziasztok!
    Elkészültem hát a kis játékommal, amit C#-ban farigcsáltam már több, mint egy éve. Nem nagy durranás, de belesürítettem eddigi C#-os tudásomat, amit általatok is bővítettem, ezért úgy érzem, illendő is megmutatnom nektek kis művemet.
    Tehát az elérhetősége: [link]
    Benne van a forráskódja, illetve aki csak játszani akar vele, annak a smy/bin/Debug mappában maga a játék EXE-je.
    Jó szórakozást! :K

    Nekem a böngésző még csak nem is hajlandó megnyitni a linket. Gondolom a nem biztonságos HTTP + .zip kombó kiveri a biztosítékot.
    Ha mutogatni akarod, akkor szerintem GitHubra kéne regisztrálni és oda feltölteni mint ahogy mások is teszik. További járulékos előny, hogy ha GitHubon van akkor biztos lehetsz benne, hogy az örökkévalóságnak megmarad.

  • Tomi_78
    aktív tag

    Sziasztok!
    Elkészültem hát a kis játékommal, amit C#-ban farigcsáltam már több, mint egy éve. Nem nagy durranás, de belesürítettem eddigi C#-os tudásomat, amit általatok is bővítettem, ezért úgy érzem, illendő is megmutatnom nektek kis művemet.
    Tehát az elérhetősége: [link]
    Benne van a forráskódja, illetve aki csak játszani akar vele, annak a smy/bin/Debug mappában maga a játék EXE-je.
    Jó szórakozást! :K

  • Tomi_78
    aktív tag

    Szerintem a koordinátákkal van gond igen. A példák alapján én úgy látom hogy a gombok Locationje a panelen belül abszolút koordináta, te pedig a teljes ablakhoz képes abszolútként adtad meg, így kívül van a panelen.
    Szóval mindig a közvetlen szülő koordinátaterén belül kell gondolkozni.

    Az lett az, igen! A két gomb Location-ét áthelyeztem a panel adatainak megadása utánra, és annak koordinátáihoz igazítottam a teljes képernyő helyett.
    Így most már jó lett; köszönöm szépen!
    (A fenébe is, hogy a ChatGPT erre nem tért ki, amikor kérdeztem tőle... :N )

  • quailstorm
    félisten

    Azt nem tudom. A panel rendesen megjelenik, de üresen. Lehet, hogy takarja a gombokat? De hogyan hozhatom előrébb őket?
    Vagy a Location-ökkel van a gond, hogy a panelhez viszonyítja az elhelyezésüket?

    Szerintem a koordinátákkal van gond igen. A példák alapján én úgy látom hogy a gombok Locationje a panelen belül abszolút koordináta, te pedig a teljes ablakhoz képes abszolútként adtad meg, így kívül van a panelen.
    Szóval mindig a közvetlen szülő koordinátaterén belül kell gondolkozni.

  • Tomi_78
    aktív tag

    Nem takarja el egy másik komponens, mondjuk maga a játéktér?

    Azt nem tudom. A panel rendesen megjelenik, de üresen. Lehet, hogy takarja a gombokat? De hogyan hozhatom előrébb őket?
    Vagy a Location-ökkel van a gond, hogy a panelhez viszonyítja az elhelyezésüket?

  • quailstorm
    félisten

    Most még azt szeretném elérni, hogy van egy szép kis panel a képernyőn, azon pedig két gomb, de miért nem látszódik a két gomb ebben a kódban?
    public MainForm()
    {

    Button jatmentgomb=new Button();
    jatmentgomb.Width=Width/4;
    jatmentgomb.Height=32;
    jatmentgomb.Location=new Point(Width/2-(jatmentgomb.Width/2),Height/2-jatmentgomb.Height);
    jatmentgomb.Text=jmgombszov[nyelv];
    jatmentgomb.Name="jatmentgomb";
    jatmentgomb.Click += new EventHandler(jatmentgomb_katt);
    jatmentgomb.Visible=false;
    jatmentgomb.Enabled=false;

    Button jatkmgomb=new Button();
    jatkmgomb.Width=Width/4;
    jatkmgomb.Height=32;
    jatkmgomb.Location=new Point(Width/2-(jatmentgomb.Width/2),Height/2+jatkmgomb.Height);
    jatkmgomb.Text=jkmgombszov[nyelv];
    jatkmgomb.Name="jatkmgomb";
    jatkmgomb.Click += new EventHandler(jatkmgomb_katt);
    jatkmgomb.Visible=false;
    jatkmgomb.Enabled=false;

    hatlap.Location=new Point(Width/2-(jatmentgomb.Width/2),Height/2-jatmentgomb.Height);
    hatlap.Size=new Size(Width/4,jatmentgomb.Height*3);
    hatlap.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
    Controls.Add(hatlap);
    hatlap.Controls.Add(jatmentgomb);
    hatlap.Controls.Add(jatkmgomb);
    hatlap.Visible=false;
    }
    Majd a MainFormKeyUp-ban ESC-re:
    if (e.KeyCode==Keys.Escape) {
    hatlap.Visible=true;
    //Button jatmentgomb=(Button)hatlap.Controls["jatmentgomb"];
    Control jatmentgomb=hatlap.Controls["jatmentgomb"];
    jatmentgomb.Visible=true;
    jatmentgomb.Enabled=true;
    //Button jatkmgomb=(Button)hatlap.Controls["jatkmgomb"];
    Control jatkmgomb=hatlap.Controls["jatkmgomb"];
    jatkmgomb.Visible=true;
    jatkmgomb.Enabled=true;
    }

    Nem takarja el egy másik komponens, mondjuk maga a játéktér?

  • Tomi_78
    aktív tag

    Most még azt szeretném elérni, hogy van egy szép kis panel a képernyőn, azon pedig két gomb, de miért nem látszódik a két gomb ebben a kódban?
    public MainForm()
    {

    Button jatmentgomb=new Button();
    jatmentgomb.Width=Width/4;
    jatmentgomb.Height=32;
    jatmentgomb.Location=new Point(Width/2-(jatmentgomb.Width/2),Height/2-jatmentgomb.Height);
    jatmentgomb.Text=jmgombszov[nyelv];
    jatmentgomb.Name="jatmentgomb";
    jatmentgomb.Click += new EventHandler(jatmentgomb_katt);
    jatmentgomb.Visible=false;
    jatmentgomb.Enabled=false;

    Button jatkmgomb=new Button();
    jatkmgomb.Width=Width/4;
    jatkmgomb.Height=32;
    jatkmgomb.Location=new Point(Width/2-(jatmentgomb.Width/2),Height/2+jatkmgomb.Height);
    jatkmgomb.Text=jkmgombszov[nyelv];
    jatkmgomb.Name="jatkmgomb";
    jatkmgomb.Click += new EventHandler(jatkmgomb_katt);
    jatkmgomb.Visible=false;
    jatkmgomb.Enabled=false;

    hatlap.Location=new Point(Width/2-(jatmentgomb.Width/2),Height/2-jatmentgomb.Height);
    hatlap.Size=new Size(Width/4,jatmentgomb.Height*3);
    hatlap.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
    Controls.Add(hatlap);
    hatlap.Controls.Add(jatmentgomb);
    hatlap.Controls.Add(jatkmgomb);
    hatlap.Visible=false;
    }
    Majd a MainFormKeyUp-ban ESC-re:
    if (e.KeyCode==Keys.Escape) {
    hatlap.Visible=true;
    //Button jatmentgomb=(Button)hatlap.Controls["jatmentgomb"];
    Control jatmentgomb=hatlap.Controls["jatmentgomb"];
    jatmentgomb.Visible=true;
    jatmentgomb.Enabled=true;
    //Button jatkmgomb=(Button)hatlap.Controls["jatkmgomb"];
    Control jatkmgomb=hatlap.Controls["jatkmgomb"];
    jatkmgomb.Visible=true;
    jatkmgomb.Enabled=true;
    }

  • quailstorm
    félisten

    Az ELSE nélkül most már jó lett; nem kapok hibaüzenetet és lefut a program.
    Volt egy másik gondom is, mégpedig hogy amikor az említett RETURN-os függvényhez hasonló függvényt SWITCH elágazásokba tettem, akkor meg a BREAK utasítások nem tetszettek neki a CASE ágakban. Ezt úgy oldottam meg, hogy nem egyből RETURN-öltem, hanem csak a legvégén, és a visszaadandó értéket egy változóba tettem. Tehát valahogy így:
    bool fuggvenyem(string feltetel) {
        bool eredmeny=false;
        switch (feltetel) {
            case "egyik": if valami==true eredmeny=true;
            break;
            case "masik": if valami==true eredmeny=true;
            break;
        }
        return eredmeny
    }

    Itt már esélyesebb hogy összehoztál egy not all paths return a value hibát. Gondolom a case-en belül az if-en belül volt a return, de ifen kívül nem volt csak jött a break és a függvény végén sem volt.

    Azt az if valamit ki kéne szervezni, ha fix dolog akkor a függvény elejére, ha nem az akkor így hirtelen passz hogy hova, túl pszeudokód ahhoz hogy lássam.

  • Tomi_78
    aktív tag

    Igaz, benéztem bocs. Annál több elágazás kéne (köztes else if) hogy ez előforduljon.

    #10227Tomi_78:
    Változtattál valamit a fejlesztőkörnyezeten? Vagy mégsem teljesen olyan ez a kód mint az előzőek?

    Olyasmi kódra mint a mintád, most az RCS1073-at adja vissza a VS2022.
    Redundant else keyword hibát nem tudtam előhozni.

    Az ELSE nélkül most már jó lett; nem kapok hibaüzenetet és lefut a program.
    Volt egy másik gondom is, mégpedig hogy amikor az említett RETURN-os függvényhez hasonló függvényt SWITCH elágazásokba tettem, akkor meg a BREAK utasítások nem tetszettek neki a CASE ágakban. Ezt úgy oldottam meg, hogy nem egyből RETURN-öltem, hanem csak a legvégén, és a visszaadandó értéket egy változóba tettem. Tehát valahogy így:
    bool fuggvenyem(string feltetel) {
        bool eredmeny=false;
        switch (feltetel) {
            case "egyik": if valami==true eredmeny=true;
            break;
            case "masik": if valami==true eredmeny=true;
            break;
        }
        return eredmeny
    }

  • quailstorm
    félisten

    De amúgy akkor is lenne minden agnak visszatérési értéke, hiszen ha if valami return, else return, tök mindegy mit írna aztán az elsen kívül

    Igaz, benéztem bocs. Annál több elágazás kéne (köztes else if) hogy ez előforduljon.

    #10227Tomi_78:
    Változtattál valamit a fejlesztőkörnyezeten? Vagy mégsem teljesen olyan ez a kód mint az előzőek?

    Olyasmi kódra mint a mintád, most az RCS1073-at adja vissza a VS2022.
    Redundant else keyword hibát nem tudtam előhozni.

  • Tomi_78
    aktív tag

    Köszönöm a válaszokat; akkor simán ELSE nélküli RETURN FALSE kell csak.
    (Azt azért furcsállom, hogy eddig nem jelzett rá hibát a fejlesztőeszköz, hanem akkor, amikor egy újabb ilyen felépítésű függvényt írtam bele.)

  • Alexios
    veterán

    Ez nem hiba, csak kódstílus.

    Early return esetén a függvény végére rakunk egy mindig konstans return false-t. Az első if után még lehetne kód a végső returnig, ami további feltételkiértékeléseket tartalmazhatna (és további returnokat).
    Most nálad az else ág üres, az if után pedig nincs semmi így ugyan felesleges kiírni hogy else, de jelen esetben sem szintaktikai sem szemantikai hibát nem jelent.
    Viszont ha bármit írnál az else után, az else alá, akkor az syntax error mert hirtelen nem minden ágnak lenne visszatérési értéke. Ezt megelőzendő (meg az átláthatóság miatt) nem kell az else ilyenkor.

    De amúgy akkor is lenne minden agnak visszatérési értéke, hiszen ha if valami return, else return, tök mindegy mit írna aztán az elsen kívül

  • fatal`
    titán

    És most ebben a függvényben miért lett hibás az ELSE ág, hogy azt írja ki rá, hogy: "redundant else keyword"?
    bool utkozes(... paraméterek ...) {
               if (... ütközés igaz ...) {
                    return true;
                } else return false;
            }

    Nem hiba, csak, ahogy írja is, felesleges az else ág, sima return false.

  • quailstorm
    félisten

    És most ebben a függvényben miért lett hibás az ELSE ág, hogy azt írja ki rá, hogy: "redundant else keyword"?
    bool utkozes(... paraméterek ...) {
               if (... ütközés igaz ...) {
                    return true;
                } else return false;
            }

    Ez nem hiba, csak kódstílus.

    Early return esetén a függvény végére rakunk egy mindig konstans return false-t. Az első if után még lehetne kód a végső returnig, ami további feltételkiértékeléseket tartalmazhatna (és további returnokat).
    Most nálad az else ág üres, az if után pedig nincs semmi így ugyan felesleges kiírni hogy else, de jelen esetben sem szintaktikai sem szemantikai hibát nem jelent.
    Viszont ha bármit írnál az else után, az else alá, akkor az syntax error mert hirtelen nem minden ágnak lenne visszatérési értéke. Ezt megelőzendő (meg az átláthatóság miatt) nem kell az else ilyenkor.

  • cattus
    addikt

    És most ebben a függvényben miért lett hibás az ELSE ág, hogy azt írja ki rá, hogy: "redundant else keyword"?
    bool utkozes(... paraméterek ...) {
               if (... ütközés igaz ...) {
                    return true;
                } else return false;
            }

    Nem hibás, de else nélkül is ugyanazt a működést kapod:

    bool utkozes(... paraméterek ...) {
    if (... ütközés igaz ...) {
    return true;
    }
    return false;
    }

    Gyakran szokták ezt alkalmazni, főleg az early return esetén, hogy a fő logika ne legyen egy szinttel mélyebben.

  • Tomi_78
    aktív tag

    És most ebben a függvényben miért lett hibás az ELSE ág, hogy azt írja ki rá, hogy: "redundant else keyword"?
    bool utkozes(... paraméterek ...) {
               if (... ütközés igaz ...) {
                    return true;
                } else return false;
            }

  • quailstorm
    félisten

    Azt lehetőség szerint pont el szerettem volna kerülni, hogy valami külső kiegészítőt kelljen használni, egyrészt mert nem ismerem ezeket és a működésüket, használatukat, valamint a feladat egyszerűsége talán nem is teszi indokolttá.
    Amit magával az adott fejlesztőeszközzel meg lehet csinálni, legtöbbször azt használom.
    Persze biztos, hogy vannak bizonyos feladatok megoldásához hatékonyabb eszközök, de esetemben a probléma teljesen alapszintű volt.

    Lehet, de nem érdemes.
    Ugyanúgy meg lehet tanulni egy szerializálós libet mint a programozás alapjait.

    Abban amit csinálsz nagyon sok a munka, nagyon sok a hibalehetőség és nem tesz hozzá a játékhoz semennyit. Csak szaporodnak a kódsorok a semmiért.

    Persze mindent fel lehet találni nulláról, de nem célszerű.

    #10220martonx: ha jól számolom 5 éve csiszolja, de már akkor nagyon elavult alapokon kezdte.

  • martonx
    veterán

    Milyen új projecten?

    Egy 90-es évek szimulátorhoz ajánlottam ahol a kókányolásállóság és a kompatibilitás régi frameworkkel sokkal jobban számít.
    Ráadásul ha visszakeresel a nevére:
    SharpDevelopot használ. Az nem támogat 4.5.1-nél újabb .NET Frameworkot. Tehát valószínűleg nem tudja használni a System.Text.Json-t.

    Úgyhogy szerintem de, elegáns helyzetre szabva olyan libet ajánlani ami biztos működik nála. Ahhoz a pet project játékhoz óriási előrelépés lenne neki a Newtonsoft is.

    Bocs, azt hittem valami új projektről van szó.
    Ha valaki 30 éve csiszolgatja a régi projektjét és itt tart, hogy most már le is kellene tudnia menteni valami adatot, valahová...

  • Tomi_78
    aktív tag

    Azt lehetőség szerint pont el szerettem volna kerülni, hogy valami külső kiegészítőt kelljen használni, egyrészt mert nem ismerem ezeket és a működésüket, használatukat, valamint a feladat egyszerűsége talán nem is teszi indokolttá.
    Amit magával az adott fejlesztőeszközzel meg lehet csinálni, legtöbbször azt használom.
    Persze biztos, hogy vannak bizonyos feladatok megoldásához hatékonyabb eszközök, de esetemben a probléma teljesen alapszintű volt.

  • quailstorm
    félisten

    Teljesen érthető, ha valahol nem cserélik le. De ettől még egy új projekten csukott szemmel a régi legacy libet ajánlani, hát nem elegáns.

    Milyen új projecten?

    Egy 90-es évek szimulátorhoz ajánlottam ahol a kókányolásállóság és a kompatibilitás régi frameworkkel sokkal jobban számít.
    Ráadásul ha visszakeresel a nevére:
    SharpDevelopot használ. Az nem támogat 4.5.1-nél újabb .NET Frameworkot. Tehát valószínűleg nem tudja használni a System.Text.Json-t.

    Úgyhogy szerintem de, elegáns helyzetre szabva olyan libet ajánlani ami biztos működik nála. Ahhoz a pet project játékhoz óriási előrelépés lenne neki a Newtonsoft is.

  • martonx
    veterán

    Felhasználásfüggő. Nem teljes helyettesítő a System.Text.Json.

    De persze, Tominak valószínű elég, meg az átlag projectbe is elég. Munkában előző projectemnél biztosan nem volt érdemes lecserélni a Newtonsoftot, mert csak a rengeteg szívást és kompatibilitási problémát kaptuk volna a nyakunkba, de mostani projectemen is volt olyan eset (bocs, elfelejtettem), ahol a megoldás egyszerűbb lett volna és jobban dokumentált volt Newtonsofttal.

    Szóval én még nem temetném a Newtonsoftot, de nyilván új projecten nem azzal kell kezdeni feltétlen.

    Teljesen érthető, ha valahol nem cserélik le. De ettől még egy új projekten csukott szemmel a régi legacy libet ajánlani, hát nem elegáns.

  • quailstorm
    félisten

    Lecserélni a meglévőt azért teljesen más use case mint egy új projektnél azt behúzni, vagy azt ajánlani. Nyilván legacy-t migrálni nem feltétlenül érdemes, vagy legalábbis nagyon át kell gondolni mennyi munkával jár, és mit várunk a végén tőle.

    Viszont a thread amit linkeltél 3 éves, azóta pl. lehet származtatott osztályokat is deszerializálni, a referencia kezelése is finomodott stb. Pont ez a lényeg, hogy ezt aktívan fejleszik, míg a newtonsoftot már kevésbé(teljesen mással foglalkozik már James NK).

    Szerintem ha új projektnél problémás a system.text.json akkor lehet ott érdemes elgondolkodni hogy biztos a libraryvel van-e a probléma, vagy mit akarunk csinálni egyáltalán.
    Pl. láttam nemrég olyat hogy a Newtonsoftba van beépítve json schema validator, viszont ez sokkal szabadabban értelmezi a json schema szabványt mint bármi más. Így nem tudták lecserélni ezt a részét a kódnak egy más libraryre mert folyamatos validációs hibák voltak, mert a rendszer többi része is invalid sémára épült.
    Na most itt lehet mondani hogy de jó a newtonsoft, bezzeg a másikkal nem lehet megoldani, de azért lehet mégiscsak az lenne a jobb ha a kód inkább jól lett volna megírva.

    Persze, teljesen másképp lett megoldva végül a probléma. Integrációs tesztek miatt mondtam a többieknek hogy felesleges custom resolvert meg normalizálást meg minden féle bonyolult dolgot implementálni. Deszerializálás helyett inkább a referencia is szerializálva van és a két szerializált json van összehasonlítva.

    Előző projectemen is elég keményen van abuzálva a Newtonsoft plugin architektúrás workspace deszerializáláshoz, úgyhogy ott is azért nem éri meg váltani.

  • Alexios
    veterán

    Felhasználásfüggő. Nem teljes helyettesítő a System.Text.Json.

    De persze, Tominak valószínű elég, meg az átlag projectbe is elég. Munkában előző projectemnél biztosan nem volt érdemes lecserélni a Newtonsoftot, mert csak a rengeteg szívást és kompatibilitási problémát kaptuk volna a nyakunkba, de mostani projectemen is volt olyan eset (bocs, elfelejtettem), ahol a megoldás egyszerűbb lett volna és jobban dokumentált volt Newtonsofttal.

    Szóval én még nem temetném a Newtonsoftot, de nyilván új projecten nem azzal kell kezdeni feltétlen.

    Lecserélni a meglévőt azért teljesen más use case mint egy új projektnél azt behúzni, vagy azt ajánlani. Nyilván legacy-t migrálni nem feltétlenül érdemes, vagy legalábbis nagyon át kell gondolni mennyi munkával jár, és mit várunk a végén tőle.

    Viszont a thread amit linkeltél 3 éves, azóta pl. lehet származtatott osztályokat is deszerializálni, a referencia kezelése is finomodott stb. Pont ez a lényeg, hogy ezt aktívan fejleszik, míg a newtonsoftot már kevésbé(teljesen mással foglalkozik már James NK).

    Szerintem ha új projektnél problémás a system.text.json akkor lehet ott érdemes elgondolkodni hogy biztos a libraryvel van-e a probléma, vagy mit akarunk csinálni egyáltalán.
    Pl. láttam nemrég olyat hogy a Newtonsoftba van beépítve json schema validator, viszont ez sokkal szabadabban értelmezi a json schema szabványt mint bármi más. Így nem tudták lecserélni ezt a részét a kódnak egy más libraryre mert folyamatos validációs hibák voltak, mert a rendszer többi része is invalid sémára épült.
    Na most itt lehet mondani hogy de jó a newtonsoft, bezzeg a másikkal nem lehet megoldani, de azért lehet mégiscsak az lenne a jobb ha a kód inkább jól lett volna megírva.

  • quailstorm
    félisten

    Newtonsoftot ne már mikor 5 éve van System.text.json

    Felhasználásfüggő. Nem teljes helyettesítő a System.Text.Json.

    De persze, Tominak valószínű elég, meg az átlag projectbe is elég. Munkában előző projectemnél biztosan nem volt érdemes lecserélni a Newtonsoftot, mert csak a rengeteg szívást és kompatibilitási problémát kaptuk volna a nyakunkba, de mostani projectemen is volt olyan eset (bocs, elfelejtettem), ahol a megoldás egyszerűbb lett volna és jobban dokumentált volt Newtonsofttal.

    Szóval én még nem temetném a Newtonsoftot, de nyilván új projecten nem azzal kell kezdeni feltétlen.

  • Tomi_78
    aktív tag

    Tegyél breakpointot a kiírás közben. Csak ez a kód ír ki pontot?

    A for-t én Count - 1-ig futtatnám. A switchet kitenném helper methodba. A pontírás maradna a foron belül a helper method után. For végeztével meghívnám mégegyszer a helper methodot az utolsó elemre.

    De igazából az egésznek nem sok értelme van. Miért szívatod magad saját szeralizátorral? Legyen rendes game state objected és használj valami XML vagy JSON szerializáló libraryt (Newtonsoft mondjuk).

    Ez így 90-es évek szimulátor.

    Átrendeztem kicsit akkor a tanácsod alapján a kódot és most úgy látszik, helyesen működik (bár nem értem, mi volt a hiba); köszönöm szépen!
    StreamWriter f = new StreamWriter("mentes.txt");
    for (int j=0; j<jatelemlista.Count; j++) {
                    var je = jatelemlista[j];
                    switch (je.neve) {
                       case "jatekos": //Adatok beírása
                            break;
                       case "robot": //Adatok beírása
                            break;
                        //És így tovább...
                    }

    if (j<(jatelemlista.Count-1)) f.WriteLine("."); //Zárótag.
    }
    f.Close();

  • martonx
    veterán

    Tegyél breakpointot a kiírás közben. Csak ez a kód ír ki pontot?

    A for-t én Count - 1-ig futtatnám. A switchet kitenném helper methodba. A pontírás maradna a foron belül a helper method után. For végeztével meghívnám mégegyszer a helper methodot az utolsó elemre.

    De igazából az egésznek nem sok értelme van. Miért szívatod magad saját szeralizátorral? Legyen rendes game state objected és használj valami XML vagy JSON szerializáló libraryt (Newtonsoft mondjuk).

    Ez így 90-es évek szimulátor.

    Newtonsoftot ne már mikor 5 éve van System.text.json

  • quailstorm
    félisten

    Sziasztok!
    Kis játékomban éppen a mentést programozom le, de folyton abba a hibába ütközöm, hogy az alábbi ciklus a fájl legvégére is beír egy pontot, holott nekem oda nem kellene, mert kiolvasáskor így úgy érzékeli, hogy jön még egy játékelem a fájlból, pedig csak fájlvége jel van már ott.
    Valaki látja, hogy mit rontok el? Vagy teljesen rosszul csinálom?
    StreamWriter f = new StreamWriter("mentes.txt");
    for (int j=0; j<jatelemlista.Count; j++) {
                    var je = jatelemlista[j];
                    switch (je.neve) {
                        case "jatekos": //Adatok beírása
                                    if (j<(jatelemlista.Count-1)) {
                                       f.WriteLine("."); //Ez nem jó valamiért
                                    }; //Zárótag.
                            break;
                        case "robot": //Adatok beírása
                                    if (j<(jatelemlista.Count-1)) {
                                       f.WriteLine("."); //Ez nem jó valamiért
                                    }; //Zárótag.
                            break;
                        //És így tovább...
                    }
                }
                f.Close();

    Tegyél breakpointot a kiírás közben. Csak ez a kód ír ki pontot?

    A for-t én Count - 1-ig futtatnám. A switchet kitenném helper methodba. A pontírás maradna a foron belül a helper method után. For végeztével meghívnám mégegyszer a helper methodot az utolsó elemre.

    De igazából az egésznek nem sok értelme van. Miért szívatod magad saját szeralizátorral? Legyen rendes game state objected és használj valami XML vagy JSON szerializáló libraryt (Newtonsoft mondjuk).

    Ez így 90-es évek szimulátor.

  • Tomi_78
    aktív tag

    Sziasztok!
    Kis játékomban éppen a mentést programozom le, de folyton abba a hibába ütközöm, hogy az alábbi ciklus a fájl legvégére is beír egy pontot, holott nekem oda nem kellene, mert kiolvasáskor így úgy érzékeli, hogy jön még egy játékelem a fájlból, pedig csak fájlvége jel van már ott.
    Valaki látja, hogy mit rontok el? Vagy teljesen rosszul csinálom?
    StreamWriter f = new StreamWriter("mentes.txt");
    for (int j=0; j<jatelemlista.Count; j++) {
                    var je = jatelemlista[j];
                    switch (je.neve) {
                        case "jatekos": //Adatok beírása
                                    if (j<(jatelemlista.Count-1)) {
                                       f.WriteLine("."); //Ez nem jó valamiért
                                    }; //Zárótag.
                            break;
                        case "robot": //Adatok beírása
                                    if (j<(jatelemlista.Count-1)) {
                                       f.WriteLine("."); //Ez nem jó valamiért
                                    }; //Zárótag.
                            break;
                        //És így tovább...
                    }
                }
                f.Close();

  • pmonitor
    aktív tag

    Erre a ChatGpt ezt írja: „A Python oletools nem képes Word/Excel dokumentumokat megnyitni vagy szerkeszteni, csak a fájl belső szerkezetét elemzi – például VBA makrókat, struktúrákat, metaadatokat olvas ki.".
    Mondjuk ehhez nem tudok hozzászólni, mert nem ismerem.

  • sztanozs
    veterán

    Igazából maga a ComAutoWrapper kb. 18-20 KB lenne. Csak mi 1-2 sűrűbben használt dolgot is beletettünk. Pl. a "ExcelSelectionHelper.cs", "ExcelStyleHelper.cs" fájlokat kapásból ki lehetne dobni belőle. De azért írtam azt, hogy mindkettő package elfér egymás mellett. Nem zavarják egymást. És ahol elfér több MB-os openxml, ott már ez a pár 10 KB-os ComAutoWrapper is bőven elfér. De ha mind a kettőt használja valaki, akkor már csak 1 dolog marad megoldatlan: A binárisan tárolt fájlok(pl. jelszóval védett), ha az excel nincs telepítve. Mert ezt az esetet egyik sem tudja kezelni.

    python oletools

  • pmonitor
    aktív tag

    ComAutoWrapper ~31 KB
    + az Office Suite installalva (minimum 3 GiB)

    Igazából maga a ComAutoWrapper kb. 18-20 KB lenne. Csak mi 1-2 sűrűbben használt dolgot is beletettünk. Pl. a "ExcelSelectionHelper.cs", "ExcelStyleHelper.cs" fájlokat kapásból ki lehetne dobni belőle. De azért írtam azt, hogy mindkettő package elfér egymás mellett. Nem zavarják egymást. És ahol elfér több MB-os openxml, ott már ez a pár 10 KB-os ComAutoWrapper is bőven elfér. De ha mind a kettőt használja valaki, akkor már csak 1 dolog marad megoldatlan: A binárisan tárolt fájlok(pl. jelszóval védett), ha az excel nincs telepítve. Mert ezt az esetet egyik sem tudja kezelni.

  • sztanozs
    veterán

    Igen. Ez is benne van az összehasonlító táblázatban. Az openxml meg nem tudja a binárisan tárolt fájlokat kezelni. Megpróbálom ide másolni a táblázatot. De nem tudom, hogy olvasható lesz-e.
    ## 📊 Comparison: OpenXML vs COM Automation

    This section compares two popular approaches for automating Office documents in C#.

    | Feature / Capability | OpenXML SDK | COM Automation (`ComAutoWrapper`) |
    |--------------------------------------------------|------------------------|------------------------------------|
    | File-based read/write | ✅ Yes | ❌ No |
    | Live Office application control (Excel/Word) | ❌ No | ✅ Yes |
    | Handles password-protected files | ❌ No support | ✅ Yes (if Office can open it) |
    | Supports running VBA macros | ❌ No | ✅ Yes |
    | Reads current user selection | ❌ No | ✅ Yes |
    | Formatting (color, styles, font size, etc.) | ⚠️ Limited | ✅ Full |
    | Chart and graphic manipulation | ❌ No | ✅ Yes |
    | Interactive editing of running instance | ❌ No | ✅ Yes |
    | Requires Interop DLLs | ❌ No | ❌ No (via ComAutoWrapper) |
    | Can be used without Office installed | ✅ Yes | ❌ No |
    | Dependency size | ✅ Small | ✅ Small (via wrapper) |

    > ⚠️ Note: OpenXML is best for static document generation and server-side manipulation.
    > ✅ COM Automation is best for real-time document interaction and full feature access.

    Using `ComAutoWrapper`, you get the **full power of Office** with the **ease of a lightweight, interop-free helper**, suitable for Excel and Word automation alike.
    While both OpenXML and COM automation are useful for working with Office documents, they serve very different use cases. Here’s a feature-by-feature comparison to help you decide.

    De mondjuk azt beszéltük meg a ChatGpt-vel, hogy vígan megférnek egymás mellett is. Igazából az sem mind1, hogy a ComAutoWrapper ~31 KB, az openxml, meg ~10 MB. Pl. ez sem mind1.

    ComAutoWrapper ~31 KB
    + az Office Suite installalva (minimum 3 GiB)

  • pmonitor
    aktív tag

    A COM Wrapper csak olyan környezetben megy ahol van telepítve Office csomag. Az eléggé bekorlátozza a felhasználási lehetőségeket.

    Igen. Ez is benne van az összehasonlító táblázatban. Az openxml meg nem tudja a binárisan tárolt fájlokat kezelni. Megpróbálom ide másolni a táblázatot. De nem tudom, hogy olvasható lesz-e.
    ## 📊 Comparison: OpenXML vs COM Automation

    This section compares two popular approaches for automating Office documents in C#.

    | Feature / Capability | OpenXML SDK | COM Automation (`ComAutoWrapper`) |
    |--------------------------------------------------|------------------------|------------------------------------|
    | File-based read/write | ✅ Yes | ❌ No |
    | Live Office application control (Excel/Word) | ❌ No | ✅ Yes |
    | Handles password-protected files | ❌ No support | ✅ Yes (if Office can open it) |
    | Supports running VBA macros | ❌ No | ✅ Yes |
    | Reads current user selection | ❌ No | ✅ Yes |
    | Formatting (color, styles, font size, etc.) | ⚠️ Limited | ✅ Full |
    | Chart and graphic manipulation | ❌ No | ✅ Yes |
    | Interactive editing of running instance | ❌ No | ✅ Yes |
    | Requires Interop DLLs | ❌ No | ❌ No (via ComAutoWrapper) |
    | Can be used without Office installed | ✅ Yes | ❌ No |
    | Dependency size | ✅ Small | ✅ Small (via wrapper) |

    > ⚠️ Note: OpenXML is best for static document generation and server-side manipulation.
    > ✅ COM Automation is best for real-time document interaction and full feature access.

    Using `ComAutoWrapper`, you get the **full power of Office** with the **ease of a lightweight, interop-free helper**, suitable for Excel and Word automation alike.
    While both OpenXML and COM automation are useful for working with Office documents, they serve very different use cases. Here’s a feature-by-feature comparison to help you decide.

    De mondjuk azt beszéltük meg a ChatGpt-vel, hogy vígan megférnek egymás mellett is. Igazából az sem mind1, hogy a ComAutoWrapper ~31 KB, az openxml, meg ~10 MB. Pl. ez sem mind1.

  • quailstorm
    félisten

    A ChatGpt írt egy összehasonlító táblázatot az "openxml", és a "COM Automation" között. A táblázat a README.md végén található. Érdekes összehasonlítás... Az eredmény magáért beszél. A ChatGpt nagyon sokat segített a projekt implementálásában.

    A COM Wrapper csak olyan környezetben megy ahol van telepítve Office csomag. Az eléggé bekorlátozza a felhasználási lehetőségeket.

  • pmonitor
    aktív tag

    Csak felületesen olvastam. Bocs.

    A ChatGpt írt egy összehasonlító táblázatot az "openxml", és a "COM Automation" között. A táblázat a README.md végén található. Érdekes összehasonlítás... Az eredmény magáért beszél. A ChatGpt nagyon sokat segített a projekt implementálásában.

  • pmonitor
    aktív tag

    Köszönöm, de openxml-t használok. A probléma közben megoldódott, a Listbox-os is. Ott az volt a hiba, hogy az UI-t backgroundworker-ben akartam frissíteni és csak debug módban jött elő a hiba.

    Csak felületesen olvastam. Bocs.

  • ReSeTer
    senior tag

    Ha a kijelölt cellák sor- és oszlopszámát szeretnéd lekérdezni C#-ból (Interop DLL nélkül), akkor az alábbi COM Wrapper alapú megoldás működik:

    var selection = ComInvoker.GetProperty<object>(excel!, "Selection");
    var areas = ComInvoker.GetProperty<object>(selection, "Areas");
    int areaCount = ComInvoker.GetProperty<int>(areas, "Count");

    for (int a = 1; a <= areaCount; a++)
    {
    var area = ComInvoker.GetProperty<object>(areas, "Item", new object[] { a });
    var cellsInArea = ComInvoker.GetProperty<object>(area, "Cells");
    int count = ComInvoker.GetProperty<int>(cellsInArea, "Count");

    for (int i = 1; i <= count; i++)
    {
    var cell = ComInvoker.GetProperty<object>(cellsInArea, "Item", new object[] { i });
    string address = ComInvoker.GetProperty<string>(cell, "Address"); // pl. "$B$3"

    var match = Regex.Match(address, @"\$([A-Z]+)\$(\d+)");
    if (match.Success)
    {
    string colLetter = match.Groups[1].Value;
    int row = int.Parse(match.Groups[2].Value);
    int col = ColumnLetterToNumber(colLetter);
    Console.WriteLine($"Cell #{i}: Row={row}, Column={col}");
    }
    }
    }
    . És a "ColumnLetterToNumber" metódus: int ColumnLetterToNumber(string col)
    {
    int sum = 0;
    foreach (char c in col)
    {
    sum *= 26;
    sum += (char.ToUpper(c) - 'A' + 1);
    }
    return sum;
    }
    .
    Ez a megoldás a [ComAutoWrapper] NuGet-csomagot használja (Interop DLL nélkül is működik).Ezt a ChatGpt oldotta meg több próbálkozás után.

    Köszönöm, de openxml-t használok. A probléma közben megoldódott, a Listbox-os is. Ott az volt a hiba, hogy az UI-t backgroundworker-ben akartam frissíteni és csak debug módban jött elő a hiba.

  • pmonitor
    aktív tag
    A megválaszolt hozzászólás már nem elérhető.

    Ha a kijelölt cellák sor- és oszlopszámát szeretnéd lekérdezni C#-ból (Interop DLL nélkül), akkor az alábbi COM Wrapper alapú megoldás működik:

    var selection = ComInvoker.GetProperty<object>(excel!, "Selection");
    var areas = ComInvoker.GetProperty<object>(selection, "Areas");
    int areaCount = ComInvoker.GetProperty<int>(areas, "Count");

    for (int a = 1; a <= areaCount; a++)
    {
    var area = ComInvoker.GetProperty<object>(areas, "Item", new object[] { a });
    var cellsInArea = ComInvoker.GetProperty<object>(area, "Cells");
    int count = ComInvoker.GetProperty<int>(cellsInArea, "Count");

    for (int i = 1; i <= count; i++)
    {
    var cell = ComInvoker.GetProperty<object>(cellsInArea, "Item", new object[] { i });
    string address = ComInvoker.GetProperty<string>(cell, "Address"); // pl. "$B$3"

    var match = Regex.Match(address, @"\$([A-Z]+)\$(\d+)");
    if (match.Success)
    {
    string colLetter = match.Groups[1].Value;
    int row = int.Parse(match.Groups[2].Value);
    int col = ColumnLetterToNumber(colLetter);
    Console.WriteLine($"Cell #{i}: Row={row}, Column={col}");
    }
    }
    }
    . És a "ColumnLetterToNumber" metódus: int ColumnLetterToNumber(string col)
    {
    int sum = 0;
    foreach (char c in col)
    {
    sum *= 26;
    sum += (char.ToUpper(c) - 'A' + 1);
    }
    return sum;
    }
    .
    Ez a megoldás a [ComAutoWrapper] NuGet-csomagot használja (Interop DLL nélkül is működik).Ezt a ChatGpt oldotta meg több próbálkozás után.

  • ReSeTer
    senior tag

    A ChatGpt-vel közösen készítettünk COM Wrappert a hozzá tartozó demóval együtt. A Wrapper Nuget-ben itt található.. Ehhez nem kell interop dll. A forrás repo itt található. A demó pedig itt van. A Wrapper-t és a demót is átnézed, akkor gyorsan rájössz a lényegre. "Csak" ismerni kell a Word objektumait. Ehhez segítséget itt találsz.

    Köszönöm megnézem.

    @pmonitor most egy kicsit nehéz lenne, mert elég sok helyről épül fel. De majd megpróbálom valahogy szeparálni.

    Viszont egy másik problémába ütköztem:

    Van egy excel fájl. Egy c# programban az user beír egy kulcsszót, mely több sorban is megtalálható lesz valószínűleg az excelben, (felülről lefele vizsgál sorban a program).
    A program kinyeri, hogy mely sorokban volt megtalálható a kulcsszó. Ezzel kapunk egy int listát. Ezután ezekből a sorokból kinyerem egy adott oszlop tartalmát és listába szedem ugyanebben a sorrendben (ez fontos!), ahogy a sortalálatok jöttek. Ezzel elkészült egy string lista.
    Van egy listbox.
    A listbox source a string lista. Ezt fogja látni az user mint találat.
    User kiválaszt több elemet a listából, fogalmam sincs melyeket.
    Ezt a collectiont szeretném felhasználni egy methodban, amit elvileg a ListBox.SelectedIndices tartalmazza?

    Na itt jön a bonyolult része, legalábbis amit nem tudom, hogy hogyan kellene csinálni.
    Ebben a methodban egy word dokumentumba be akarom illeszteni az user által kiválasztott elemeket tartalmazó excel sorból egy MÁSIK OSZLOP tartalmát egyenként.

    Logikám szerint szükségem van arra az információra, hogy amit az user kiválasztott elemeket, azoknak mi az excel sorazonosítója és onnantól már tudok oszlopot választani.
    Ehhez tudom kellene, hogy amit kiválasztott user az hanyadik volt a string listában, az ugye egyenlő az int listával, ami meg már tartalmazza az excel sor azonosítót.
    Ezt a részét nem tudom, hogy hogyan lehetne kinyerni, hogy amit az user kiválasztott azok az elemek hanyadikak voltak a teljes string listában.

    Valami ötlet?

  • pmonitor
    aktív tag
    A megválaszolt hozzászólás már nem elérhető.

    A ChatGpt-vel közösen készítettünk COM Wrappert a hozzá tartozó demóval együtt. A Wrapper Nuget-ben itt található.. Ehhez nem kell interop dll. A forrás repo itt található. A demó pedig itt van. A Wrapper-t és a demót is átnézed, akkor gyorsan rájössz a lényegre. "Csak" ismerni kell a Word objektumait. Ehhez segítséget itt találsz.

  • Keem1
    veterán

    Én a helyedben csinálnék egy vadonatúj Asp.Net Core 9-es projektet. Itt VS-ben a varázslónál bekattintanám az Authentikációt is. És abban megnézném, hogy mi történik.
    Ennyi kódból, amit belinkeltél semmi nem derül ki.

    Végül rájöttem a megoldásra... :D

    Itt találtam a következőt, ez oldotta meg nálam is a problémát.
    services.AddSession(options => {
    options.IdleTimeout = TimeSpan.FromHours(12);
    options.Cookie.Name = ".yourApp.Session"; // <--- Add line
    options.Cookie.IsEssential = true;
    });

    Az "add this line" bekerülésével, majd cookie törlésével helyreállt a rend és működik minden. :C

  • martonx
    veterán

    Srácok, segítséget szeretnék kérni: ASP.Net Core Razor
    A probléma autentikáció során van, fórumokat, tutorialokat tekintve nem találtam problémát, a leírt 2-3 common troubleshooting mindegyikét megcsináltam.

    Az autentikáció még erősen fejlesztés alatt áll, és két részre bonthatjuk: az egyik a klasszikus, jelszó+pw lokálisan tárolt user, a másik pedig az OAuth2 login, több provider (Google, Facebook, Microsoft, Spotify, ...) de egy kaptafára.

    Mi maga a probléma? Login után (egyelőre a külsős van kész, de ez a probléma szempontjából mellékes) megkapom a login adatokat, az auth látszólag sikeres, van User.[...], vannak claimek, van access tokenem, látszólag minden van. De csak addig, míg nem navigálok el/töltök újra bármit, mert akkor a felhasználói session rész elvész. A session amúgy megmarad, bármit letárolok a sessionben, megmarad. A sample kódban látszik, hogy ideiglenesen az access tokent lementettem sessionbe, az megmarad. De a User.[...] nem érhető el, HttpContext.SignInAsync() többé false-szal tér vissza (pedig rögtön a login után, a Response metódusban tökéletesen fel volt populálva, tehát nem arról van szó, hogy a providertől nem jön meg a data), nincsenek claimek, stb.
    Több helyen írták, cookie problem, töröljem őket. De töröltem, két gépen is próbáltam, MS Azure-ben hostolva is próbáltam, a probléma perzisztens.

    Annyi még, hogy van egy ilyen warningom, nem tudom, közrejátszik-e, de igazából "csak" warning.
    Ja, és bármelyik identityvel próbálkozom, ugyanez.

    info: AspNet.Security.OAuth.Spotify.SpotifyAuthenticationHandler[12]
    AuthenticationScheme: Spotify was challenged.
    warn: Microsoft.AspNetCore.Session.SessionMiddleware[7]
    Error unprotecting the session cookie.
    System.FormatException: The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters.
    at System.Convert.FromBase64CharPtr(Char* inputPtr, Int32 inputLength)
    at System.Convert.FromBase64String(String s)
    at Microsoft.AspNetCore.Session.CookieProtection.Unprotect(IDataProtector protector, String protectedText, ILogger logger)

    Mit rontok el?

    Előre is köszi a helpet. :R

    Source kódok:
    - Startup.cs
    - Pages/Account.cshtml.cs

    Én a helyedben csinálnék egy vadonatúj Asp.Net Core 9-es projektet. Itt VS-ben a varázslónál bekattintanám az Authentikációt is. És abban megnézném, hogy mi történik.
    Ennyi kódból, amit belinkeltél semmi nem derül ki.

  • Keem1
    veterán

    Srácok, segítséget szeretnék kérni: ASP.Net Core Razor
    A probléma autentikáció során van, fórumokat, tutorialokat tekintve nem találtam problémát, a leírt 2-3 common troubleshooting mindegyikét megcsináltam.

    Az autentikáció még erősen fejlesztés alatt áll, és két részre bonthatjuk: az egyik a klasszikus, jelszó+pw lokálisan tárolt user, a másik pedig az OAuth2 login, több provider (Google, Facebook, Microsoft, Spotify, ...) de egy kaptafára.

    Mi maga a probléma? Login után (egyelőre a külsős van kész, de ez a probléma szempontjából mellékes) megkapom a login adatokat, az auth látszólag sikeres, van User.[...], vannak claimek, van access tokenem, látszólag minden van. De csak addig, míg nem navigálok el/töltök újra bármit, mert akkor a felhasználói session rész elvész. A session amúgy megmarad, bármit letárolok a sessionben, megmarad. A sample kódban látszik, hogy ideiglenesen az access tokent lementettem sessionbe, az megmarad. De a User.[...] nem érhető el, HttpContext.SignInAsync() többé false-szal tér vissza (pedig rögtön a login után, a Response metódusban tökéletesen fel volt populálva, tehát nem arról van szó, hogy a providertől nem jön meg a data), nincsenek claimek, stb.
    Több helyen írták, cookie problem, töröljem őket. De töröltem, két gépen is próbáltam, MS Azure-ben hostolva is próbáltam, a probléma perzisztens.

    Annyi még, hogy van egy ilyen warningom, nem tudom, közrejátszik-e, de igazából "csak" warning.
    Ja, és bármelyik identityvel próbálkozom, ugyanez.

    info: AspNet.Security.OAuth.Spotify.SpotifyAuthenticationHandler[12]
    AuthenticationScheme: Spotify was challenged.
    warn: Microsoft.AspNetCore.Session.SessionMiddleware[7]
    Error unprotecting the session cookie.
    System.FormatException: The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters.
    at System.Convert.FromBase64CharPtr(Char* inputPtr, Int32 inputLength)
    at System.Convert.FromBase64String(String s)
    at Microsoft.AspNetCore.Session.CookieProtection.Unprotect(IDataProtector protector, String protectedText, ILogger logger)

    Mit rontok el?

    Előre is köszi a helpet. :R

    Source kódok:
    - Startup.cs
    - Pages/Account.cshtml.cs

  • petyus_
    senior tag

    Miért nem talál (a GitHub fordító) pár NuGet-el feltett csomagot, pl. a DocumentForamat.OpenXML-t.
    https://justpaste.it/f89be
    Ezt hogyan tudom vele megetetni?

    localban csinálj egy clean-t (legjobb git clean -fxd-vel, ez törli az összes file-t, ami nincs benne a repoban), és próbáld meg ugyanazt a parancsot futtatni, mint a workflowban. VS-ben buildelsz az nem teljesen ugyanaz, mintha dotnet build-et csinálnál, így könnyebb debuggolni, hogy mi lehet a gond.

  • cigam
    titán

    Köszi, már csak a digitális aláírás van háta ...

    Miért nem talál (a GitHub fordító) pár NuGet-el feltett csomagot, pl. a DocumentForamat.OpenXML-t.
    https://justpaste.it/f89be
    Ezt hogyan tudom vele megetetni?

  • cigam
    titán

    A kommentekből kiindulva szerintem a wap= wpf app, tehát az alkalmazásod mappája, illetve a csproj fájl elérési útja

    Köszi, már csak a digitális aláírás van háta ...

  • Alexios
    veterán

    Lehet nem pont ide való, de majd átirányítotok a megfelelő helyre.
    Ha jól láttam a GitHub le is tudja fordítani a forráskódot.
    Készült egy /.github/workflows/dotnet-desktop.yml fájl, amit elkezdtem átszerkeszteni, de sok a fehér folt.
    env:
    Solution_Name: idojaras.sln # Replace with your solution name, i.e. MyWpfApp.sln.
    Test_Project_Path: idojaras\idojaras.csproj # Replace with the path to your test project, i.e. MyWpfApp.Tests\MyWpfApp.Tests.csproj.
    Wap_Project_Directory: your-wap-project-directory-name # Replace with the Wap project directory relative to the solution, i.e. MyWpfApp.Package.
    Wap_Project_Path: your-wap-project-path # Replace with the path to your Wap project, i.e. MyWpf.App.Package\MyWpfApp.Package.wapproj.
    Mijaza Wap project? Nekem látszólag nincs ilyenem. Mivel nem tudom maiz, elkészíteni se tudom. Kaphatnék ehhez egy kis segítséget, iránymutatást?

    A kommentekből kiindulva szerintem a wap= wpf app, tehát az alkalmazásod mappája, illetve a csproj fájl elérési útja

  • cigam
    titán

    Lehet nem pont ide való, de majd átirányítotok a megfelelő helyre.
    Ha jól láttam a GitHub le is tudja fordítani a forráskódot.
    Készült egy /.github/workflows/dotnet-desktop.yml fájl, amit elkezdtem átszerkeszteni, de sok a fehér folt.
    env:
    Solution_Name: idojaras.sln # Replace with your solution name, i.e. MyWpfApp.sln.
    Test_Project_Path: idojaras\idojaras.csproj # Replace with the path to your test project, i.e. MyWpfApp.Tests\MyWpfApp.Tests.csproj.
    Wap_Project_Directory: your-wap-project-directory-name # Replace with the Wap project directory relative to the solution, i.e. MyWpfApp.Package.
    Wap_Project_Path: your-wap-project-path # Replace with the path to your Wap project, i.e. MyWpf.App.Package\MyWpfApp.Package.wapproj.
    Mijaza Wap project? Nekem látszólag nincs ilyenem. Mivel nem tudom maiz, elkészíteni se tudom. Kaphatnék ehhez egy kis segítséget, iránymutatást?

  • cigam
    titán

    NullException-re fut - valami masnak is valtoznia kell ott...

    Megvan!
    Azért ált fejre, mert _utánna_ egy null értékű változót (data) próbáltam parsolni.
    De hogy ettől miért az wpfxamlloader áll fejre?

  • sztanozs
    veterán

    MI a difi a 2 megoldás között?

    data = theCell.InnerText;
    bool success = int.TryParse(data, out nightWindDirection);

    ill.

    bool success = int.TryParse(theCell.InnerText, out nightWindDirection);

    Csak mert az utóbbi formulát használva 3 cella kiolvasása jó, a 4. cella beolvasásakor fejreáll: Ha előbb beolvasom egy string változóba, akkor lefut a 4. cella kiolvasása is. Mindegyik cellában számok vannak.

    NullException-re fut - valami masnak is valtoznia kell ott...

  • cigam
    titán

    MI a difi a 2 megoldás között?

    data = theCell.InnerText;
    bool success = int.TryParse(data, out nightWindDirection);

    ill.

    bool success = int.TryParse(theCell.InnerText, out nightWindDirection);

    Csak mert az utóbbi formulát használva 3 cella kiolvasása jó, a 4. cella beolvasásakor fejreáll: Ha előbb beolvasom egy string változóba, akkor lefut a 4. cella kiolvasása is. Mindegyik cellában számok vannak.

  • cigam
    titán

    Szia!

    Az nem lehet hogy [Ez alapján] a number egy outer érték ami csak azt adja meg hogy a cella számként van-e ábrázolva.
    cellName.DataType = CellValues.Number;

    Passzolom a kérdést, nem vagyok programozó, csak egy lelkes (vagy most inkább frusztrált) autodidakta. :B

  • Postas99
    őstag

    Szokták volt mondani, az olvasottság nagy fontos:

    Retrieve the values of cells in a spreadsheet document
    The Cell type provides a DataType property that indicates the type of the data within the cell. The value of the DataType property is null for numeric and date types.

    Ugyanakkor felveti annak a kérdését, hogy akkor mire való az
    if (theCell.DataType.Value == CellValues.Number) ?!

    Szia!

    Az nem lehet hogy [Ez alapján] a number egy outer érték ami csak azt adja meg hogy a cella számként van-e ábrázolva.
    cellName.DataType = CellValues.Number;

  • cigam
    titán

        Console.WriteLine(theCell.InnerText);
        Console.WriteLine(theCell.DataType.Value);

    Ha a cellába "0" van beírva:
    0
    DocumentFormat.OpenXml.Spreadsheet.CellType.DataType.**get** returned null.
    Az álmoskönyvek szerint Ilyenkor "Number"-t kellene kiírnia

    Ha "0a" a cella értéke, akkor fura dolog történik:
    12
    SharedString

    Sajnos ilyenkor az int.Tryparse is 12-t ad vissza, hiszen 12-t kapja bemenetnek.

    Végül ez a null adott egy ötletet:
    if (theCell.DataType == null)
    most így működik az ellenőrzés, ha nincs Datatype megadva, akkor szám van a cellában.

    Tegye fel a kezét, aki érti, vagy meg tudja magyarázni, miért ilyen az online Excellel módosított fájl a helyi onedrive mappából megnyitva.

    Szokták volt mondani, az olvasottság nagy fontos:

    Retrieve the values of cells in a spreadsheet document
    The Cell type provides a DataType property that indicates the type of the data within the cell. The value of the DataType property is null for numeric and date types.

    Ugyanakkor felveti annak a kérdését, hogy akkor mire való az
    if (theCell.DataType.Value == CellValues.Number) ?!

  • cigam
    titán

    Köszi az iránymutatást, este/hétvégén megint nekifutok.

        Console.WriteLine(theCell.InnerText);
        Console.WriteLine(theCell.DataType.Value);

    Ha a cellába "0" van beírva:
    0
    DocumentFormat.OpenXml.Spreadsheet.CellType.DataType.**get** returned null.
    Az álmoskönyvek szerint Ilyenkor "Number"-t kellene kiírnia

    Ha "0a" a cella értéke, akkor fura dolog történik:
    12
    SharedString

    Sajnos ilyenkor az int.Tryparse is 12-t ad vissza, hiszen 12-t kapja bemenetnek.

    Végül ez a null adott egy ötletet:
    if (theCell.DataType == null)
    most így működik az ellenőrzés, ha nincs Datatype megadva, akkor szám van a cellában.

    Tegye fel a kezét, aki érti, vagy meg tudja magyarázni, miért ilyen az online Excellel módosított fájl a helyi onedrive mappából megnyitva.

  • cigam
    titán

    valami szinkronizacios hiba lesz (vagy nem nezed a tryparse visszateresi erteket: ha false ertekkel ter vissza a fuggveny, akkor nem valtoztatja meg az int erteket amit referenciakent megadsz).
    int i = 12;
    int.TryParse("abc", out i);
    # i erteke meg mindig 12

    Köszi az iránymutatást, este/hétvégén megint nekifutok.

  • sztanozs
    veterán

    Vagy az sem. Szerinte az "abc" az 12.

    valami szinkronizacios hiba lesz (vagy nem nezed a tryparse visszateresi erteket: ha false ertekkel ter vissza a fuggveny, akkor nem valtoztatja meg az int erteket amit referenciakent megadsz).
    int i = 12;
    int.TryParse("abc", out i);
    # i erteke meg mindig 12

  • cigam
    titán

    Offline remekül működik, de abban a pillanatban, hogy egy MS365 ingyenes online fiókban módosítják a web-es felületen, elveszti a típusát. A theCell.DataType.Value null értéket ad vissza.
    Pedig próbáltam a WEBes felületen is beállítani a cellák formázását, de tojik rá.
    Mégiscsak int.TryParse lesz belőle :(

    Vagy az sem. Szerinte az "abc" az 12.

  • cigam
    titán

    Ez lett a vége:
                    // Éjjeli maximum
                    addressName = "C4";
                    theCell = wsPart.Worksheet.Descendants<Cell>().Where(c => c.CellReference == addressName).FirstOrDefault();
                    // is Empty?
                    if (theCell.DataType != null)
                    {
                      // is Number?
                        if (theCell.DataType.Value == CellValues.Number)
                        {
                            data = theCell.InnerText;
                            if (data != "")
                            {
                                nightMaximum = int.Parse(data);
                                label_nightMaximum_ertek.Content = nightMaximum;
                            }
                            else
                            {
                                label_nightMaximum_ertek.Content = "-";
                                error = true;
                            }
                        }
                        else
                        {
                            label_nightMaximum_ertek.Foreground = Brushes.Red;
                            label_nightMaximum_ertek.Content = "?";
                            error = true;
                        }
                    }
                    else
                    {
                        label_nightMaximum_ertek.Content = "-";
                        error = true;
                    }

    Ez a sok if minden egyes cellánál, azt üvölti, hogy lehetne ez jobban is. De hogyan?Hogyan tudnám az ellenőrzést kiszervezni úgy, hogy van amelyik cella szám, van amelyik szöveg, és attól függően hogy mi a problémám vele, más más szöveget kell megjeleníteni, van aminek még a színét is módosítom.
    Egyáltalán ezt a "theCell"-t át tudom adni szubrutinnak (metódus?)?

    Offline remekül működik, de abban a pillanatban, hogy egy MS365 ingyenes online fiókban módosítják a web-es felületen, elveszti a típusát. A theCell.DataType.Value null értéket ad vissza.
    Pedig próbáltam a WEBes felületen is beállítani a cellák formázását, de tojik rá.
    Mégiscsak int.TryParse lesz belőle :(

  • cigam
    titán

    Az a kapkodás... A példám szövegre szűr, nekem meg szám kell...
    if (theCell.DataType.Value == CellValues.Number)

    Ez lett a vége:
                    // Éjjeli maximum
                    addressName = "C4";
                    theCell = wsPart.Worksheet.Descendants<Cell>().Where(c => c.CellReference == addressName).FirstOrDefault();
                    // is Empty?
                    if (theCell.DataType != null)
                    {
                      // is Number?
                        if (theCell.DataType.Value == CellValues.Number)
                        {
                            data = theCell.InnerText;
                            if (data != "")
                            {
                                nightMaximum = int.Parse(data);
                                label_nightMaximum_ertek.Content = nightMaximum;
                            }
                            else
                            {
                                label_nightMaximum_ertek.Content = "-";
                                error = true;
                            }
                        }
                        else
                        {
                            label_nightMaximum_ertek.Foreground = Brushes.Red;
                            label_nightMaximum_ertek.Content = "?";
                            error = true;
                        }
                    }
                    else
                    {
                        label_nightMaximum_ertek.Content = "-";
                        error = true;
                    }

    Ez a sok if minden egyes cellánál, azt üvölti, hogy lehetne ez jobban is. De hogyan?Hogyan tudnám az ellenőrzést kiszervezni úgy, hogy van amelyik cella szám, van amelyik szöveg, és attól függően hogy mi a problémám vele, más más szöveget kell megjeleníteni, van aminek még a színét is módosítom.
    Egyáltalán ezt a "theCell"-t át tudom adni szubrutinnak (metódus?)?

  • cigam
    titán

    Közben láttam, hogy le tudom kérdezni a cella típusát, és ki tudom szűrni, hogy szám-e:

    // A cella üres?
    if (theCell.DataType is not null)
    {
    // A cella szám?
    if (theCell.DataType.Value == CellValues.SharedString)
    {
    ....
    }
    }

    Még tesztelgetem.

    Az a kapkodás... A példám szövegre szűr, nekem meg szám kell...
    if (theCell.DataType.Value == CellValues.Number)

  • cigam
    titán

    int parse helyett int.TryParse esetleg? akkor mindegy hogy szam van-e benne... de lehet hogy en ertettem felre valamit...

    Közben láttam, hogy le tudom kérdezni a cella típusát, és ki tudom szűrni, hogy szám-e:

    // A cella üres?
    if (theCell.DataType is not null)
    {
    // A cella szám?
    if (theCell.DataType.Value == CellValues.SharedString)
    {
    ....
    }
    }

    Még tesztelgetem.

  • sztanozs
    veterán

    Újra kellene egy kis iránymutatás:

    public void GetCellValues(string fileName, string sheetName)
            {
                string addressName = null;
                string data = null;
                // Open the spreadsheet document for read-only access.
                using (SpreadsheetDocument document =
                    SpreadsheetDocument.Open(fileName, false))
                {
                    // Retrieve a reference to the workbook part.
                    WorkbookPart wbPart = document.WorkbookPart;

                    // Find the sheet with the supplied name, and then use that 
                    // Sheet object to retrieve a reference to the first worksheet.
                    Sheet theSheet = wbPart.Workbook.Descendants<Sheet>().
                      Where(s => s.Name == sheetName).FirstOrDefault();

                    // Throw an exception if there is no sheet.
                    if (theSheet == null)
                    {
                        throw new ArgumentException("sheetName");
                    }

                    // Retrieve a reference to the worksheet part.
                    WorksheetPart wsPart = (WorksheetPart)(wbPart.GetPartById(theSheet.Id));

                    // Éjjel
                    addressName = "B4";
                    Cell theCell = wsPart.Worksheet.Descendants<Cell>().Where(c => c.CellReference == addressName).FirstOrDefault();
                    // If the cell does not exist, return an empty string.
                    if (theCell != null)
                    {
                        data = theCell.InnerText;
                        if (data != "")
                        {
                            nightMinimum = int.Parse(data);
                            label_nightMinimum_ertek.Content = nightMinimum;
                        }
                        else
                        {
                            label_nightMinimum_ertek.Content = "-";
                            error = true;
                        }
                    }

    Megnyitok egy .xls fájlt, és a cellák adatait beolvasom. Működik is egészen addig, amíg számokat írok be. De ha véletlen egy "a" betű szerepel a táblázatban, kap egy 12-es értéket, mintha "12" lenne a cellába írva. Hogyan tudom megvizsgálni, hogy 1 és 50 közötti szám szerepel az adott cellában?

    int parse helyett int.TryParse esetleg? akkor mindegy hogy szam van-e benne... de lehet hogy en ertettem felre valamit...

  • cigam
    titán

    Újra kellene egy kis iránymutatás:

    public void GetCellValues(string fileName, string sheetName)
            {
                string addressName = null;
                string data = null;
                // Open the spreadsheet document for read-only access.
                using (SpreadsheetDocument document =
                    SpreadsheetDocument.Open(fileName, false))
                {
                    // Retrieve a reference to the workbook part.
                    WorkbookPart wbPart = document.WorkbookPart;

                    // Find the sheet with the supplied name, and then use that 
                    // Sheet object to retrieve a reference to the first worksheet.
                    Sheet theSheet = wbPart.Workbook.Descendants<Sheet>().
                      Where(s => s.Name == sheetName).FirstOrDefault();

                    // Throw an exception if there is no sheet.
                    if (theSheet == null)
                    {
                        throw new ArgumentException("sheetName");
                    }

                    // Retrieve a reference to the worksheet part.
                    WorksheetPart wsPart = (WorksheetPart)(wbPart.GetPartById(theSheet.Id));

                    // Éjjel
                    addressName = "B4";
                    Cell theCell = wsPart.Worksheet.Descendants<Cell>().Where(c => c.CellReference == addressName).FirstOrDefault();
                    // If the cell does not exist, return an empty string.
                    if (theCell != null)
                    {
                        data = theCell.InnerText;
                        if (data != "")
                        {
                            nightMinimum = int.Parse(data);
                            label_nightMinimum_ertek.Content = nightMinimum;
                        }
                        else
                        {
                            label_nightMinimum_ertek.Content = "-";
                            error = true;
                        }
                    }

    Megnyitok egy .xls fájlt, és a cellák adatait beolvasom. Működik is egészen addig, amíg számokat írok be. De ha véletlen egy "a" betű szerepel a táblázatban, kap egy 12-es értéket, mintha "12" lenne a cellába írva. Hogyan tudom megvizsgálni, hogy 1 és 50 közötti szám szerepel az adott cellában?

  • petyus_
    senior tag

    Igen-igen, a Spotinál egy string az ID.
    Spotify ID The base-62 identifier found at the end of the Spotify URI (see above) for an artist, track, album, playlist, etc. Unlike a Spotify URI, a Spotify ID does not clearly identify the type of resource; that information is provided elsewhere in the call.
    Example: 6rqhFgbbKwnb9MLmUQDhG

    Nálam a DB-ben az Id az egy autoincrement int, és a Spoti-féle Id-t egy Username stringben tárolom.

    @martonx:
    Innen indultam ki, amit írsz, csak míg egy object inicializálásakor megy ez:
    var _obj = new Obj()
    {
    property1 = value1;
    }

    ... addig sajnos már létező objectnél (amit kiköp létező userként a DB) már nem lehetséges, muszáj az existinguser.Property1 = value1; minden egyes módosítandó adatnál, tehát a problem, hogy mindegyik elé mehet az object neve is. Tök jó lenne, ha ugyanez működne a már kiolvasott adatnál is, és ha pl. van 10 property, de én csak 4-et módosítok, akkor a blockban csak azt a négyet sorolom fel, míg az object nevét csak egyszer, a blokk elején.

    "Igen-igen, a Spotinál egy string az ID."

    És akkor a db.Entry(existing).CurrentValues.SetValues(edited); sorban mi az edited? az edited id-ja mi? Valószínűleg abból van a probléma, hogy az edited id-ja más, mint az existing.

  • Alexios
    veterán

    Igen-igen, a Spotinál egy string az ID.
    Spotify ID The base-62 identifier found at the end of the Spotify URI (see above) for an artist, track, album, playlist, etc. Unlike a Spotify URI, a Spotify ID does not clearly identify the type of resource; that information is provided elsewhere in the call.
    Example: 6rqhFgbbKwnb9MLmUQDhG

    Nálam a DB-ben az Id az egy autoincrement int, és a Spoti-féle Id-t egy Username stringben tárolom.

    @martonx:
    Innen indultam ki, amit írsz, csak míg egy object inicializálásakor megy ez:
    var _obj = new Obj()
    {
    property1 = value1;
    }

    ... addig sajnos már létező objectnél (amit kiköp létező userként a DB) már nem lehetséges, muszáj az existinguser.Property1 = value1; minden egyes módosítandó adatnál, tehát a problem, hogy mindegyik elé mehet az object neve is. Tök jó lenne, ha ugyanez működne a már kiolvasott adatnál is, és ha pl. van 10 property, de én csak 4-et módosítok, akkor a blockban csak azt a négyet sorolom fel, míg az object nevét csak egyszer, a blokk elején.

    muszáj az existinguser.Property1 = value1; minden egyes módosítandó adatnál, tehát a problem, hogy mindegyik elé mehet az object neve is.

    De amúgy ez miért olyan nagy baj, vagy miért számít egyáltalán? Szerintem teljesen lényegtelen, martonx megoldása teljesen jól olvasható, ha nem létezik létre hozod, ha igen explicit látszik miket módosítasz, majd mentés, mindenféle magic nélkül ahol találgatni kell hogy működik és mint látjuk nehéz debugolni. Az egyetlen pont inkább ellene hogy ha az id-n kívül minden propertyt updatelni akarsz, akkor ha később hozzá adsz egy új propertyt akkor ezt is updatelni kell, de szerintem ezt azért meg lehet ugrani.

    De tényleg, az hogy használni kell az object nevét nem kódismétlés, ettől nincs duplikalt kód, redundancia, akármi. Ha ennek a metodusnak a tartalmát atmasolnad egy másikba, ahelyett hogy ezt hívnád, na ott lenne kódismétlés, és abból lehetne gond.

  • Keem1
    veterán

    var existing = db.SpotifyUsers.Where(x => x.Username == userdata.Id).SingleOrDefault();
    db.Entry(existing).CurrentValues.SetValues(edited);

    Itt mi az edited? a másik kommentedben a userdata.Id-t hasonlítottad a Username-hez, akkor gondolom a spotify-os usernek az Id-ja a username, a te entity-dnek viszont egy int az id-ja, ezért kapod a hibát. A SetValues object-et vár, tehát nincs típus ellenőrzés, ezért kapod runtime a hibát

    Igen-igen, a Spotinál egy string az ID.
    Spotify ID The base-62 identifier found at the end of the Spotify URI (see above) for an artist, track, album, playlist, etc. Unlike a Spotify URI, a Spotify ID does not clearly identify the type of resource; that information is provided elsewhere in the call.
    Example: 6rqhFgbbKwnb9MLmUQDhG

    Nálam a DB-ben az Id az egy autoincrement int, és a Spoti-féle Id-t egy Username stringben tárolom.

    @martonx:
    Innen indultam ki, amit írsz, csak míg egy object inicializálásakor megy ez:
    var _obj = new Obj()
    {
    property1 = value1;
    }

    ... addig sajnos már létező objectnél (amit kiköp létező userként a DB) már nem lehetséges, muszáj az existinguser.Property1 = value1; minden egyes módosítandó adatnál, tehát a problem, hogy mindegyik elé mehet az object neve is. Tök jó lenne, ha ugyanez működne a már kiolvasott adatnál is, és ha pl. van 10 property, de én csak 4-et módosítok, akkor a blockban csak azt a négyet sorolom fel, míg az object nevét csak egyszer, a blokk elején.

  • petyus_
    senior tag

    Van egy Spotify playlist automatizált motyóm, ami a Spotify API-val dolgozik.
    Bár az elv több része is hasonlóan fog működni, most még a loggolt user (ketten csináljuk) DB-be letárolása megy, de a playlisteké is ugyanezen elv mentén fog.

    EF vagy EF Core?
    EF Core 8

    Sajnos terjedelmi és egyéb okok miatt nem tudom bemásolni, de a logic a következő:
    Van egy metódus: SpotifyLogin(SpotifyUser user)

    public DbSet<SpotifyUser>SpotifyUsers {get;set;}

    [Table("spotifyusers")]
    public class SpotifyUser()
    {
    [Key, Column("id")]
    public int Id { get; set; }
    [Column("tstamp")]
    public DateTime? TimeStamp { get; set; } = DateTime.Now;
    [Column("username")]
    public string? Username { get; set; }
    [Column("displayname")]
    public string? Name { get; set; }
    [Column("email")]
    public string? Email { get; set; }
    [Column("accesstoken")]
    public string? AccessToken { get; set; }
    [Column("followers")]
    public int Followers { get; set; } = 0;
    [Column("image")]
    public string? Image { get; set; }
    [Column("profileurl")]
    public string? ProfileUrl { get; set; }
    [Column("lastlogin")]
    public DateTime? LastLogin { get; set; } = DateTime.Now;
    }

    Ha az API-val sikerült beloggolnia (ennek a mikéntje jelenleg mindegy is), akkor lesz egy objektumunk, kb. ilyen:
    var user = new SpotifyUser()
    {
    //itt az API által átadott adatok
    }

    és ezután kerülünk abba a metódusba, ahonnan idéztem is már: SpotifyLogin(SpotifyUser user)

    Éééés itt pedig ketté ágazik a dolog, de mint mindent, ezt is próbálom minél egyszerűbbre, univerzálisabbra, és ha lehet, a legkevésbé redundánsra csinálni.
    Szóval letároljuk a usert DB-be, van egy user objectünk, amiről még nem tudjuk, hogy új-e vagy régi.
    Ha új, egy új entry lesz a DB-ben, ha régi, akkor aktualizáljuk, de az ID-ja az változatlan marad.

    Innen már ismerős:
    using (var db = new MySqlContext())
    {
    var existing = db.SpotifyUsers.Where(x => x.Username == userdata.Id);
    if (existing != null && existing.Count()>0)
    {
    // Ez a bajos, ha létezik a user
    // Ide valami olyan lenne jó, hogy:
    // db.SpotifyUsers.Update(userdata);
    // De erre csak egy új entry-t hoz létre a DB-ben
    }
    else
    {
    //Ez működik, ha még nincs ilyen user
    db.SpotifyUsers.Add(userdata);
    return (db.SaveChanges()>0? true : false);
    }
    }

    Szóval eddig jutottam, és a playlistek kezelése is kb ugyanígy fog kinézni, ha már létezik, akkor csak updateljük a followereket, a trackek számát, stb. Ha még nincs ilyen a DB-ben, akkor meg újként elmentjük teljes egészében.

    Az update amúgy működne úgy, hogy igazából lekérem a létező usert, és soronként/propertynként "lemásolom" a datát, és úgy egy Update, de nem akarok ennyi redundanciát.

    Ja, és meghagynám annyira univerzálisnak, hogy jelenleg működik MySQL és Sqlite DB-vel is, ami maradna, MySQL a fő cél, de backupnak meghagynám az SQLite-ot is.

    Érthető valamennyire? :)

    var existing = db.SpotifyUsers.Where(x => x.Username == userdata.Id).SingleOrDefault();
    db.Entry(existing).CurrentValues.SetValues(edited);

    Itt mi az edited? a másik kommentedben a userdata.Id-t hasonlítottad a Username-hez, akkor gondolom a spotify-os usernek az Id-ja a username, a te entity-dnek viszont egy int az id-ja, ezért kapod a hibát. A SetValues object-et vár, tehát nincs típus ellenőrzés, ezért kapod runtime a hibát

  • martonx
    veterán

    && Alexios

    A redundanciát a következőre értem, illetve amit én szeretnék (egyszerűsíteni):
    userdata jön az API response-ból, mivel ez egy API (abból is a Spotify-nál beloggolt user), így nekem kell eldönteni, hogy saját DB-mben létezik-e már.
    Bárhogy is legyen, a userdata ojjektum adott, a friss, ropogós, API-ból érkező aktuális adat.
    Ha létezik, ezt csak update-elni akarom a saját kópiámban, ha még nem, értelemszerűen létrehozni.

    Sematikusan valahogy így:
    // userdata a method paraméterében
    var existing = db.SpotifyUsers.Where(x => x.Username == userdata.Id); // Ezt még módosítom ahogy javasoltátok
    if (existing != null && existing.Count()>0) db.SpotifyUsers.Update(userdata); //De ez nem megy, pedig jó lenne
    else db.SpotifyUsers.Add(userdata);

    Tehát kvázi mindegy, hogy új adat-e vagy sem, nem kell új vagy update esetén sem újra értéket adnom ugyanannak a propertynek. Ha új data, akkor a teljes object az API returnból jön (userdata), ha létező, akkor pedig a kiindulási állapot a DB-ból lekért adat, és a különbséget (a userdata-hoz képest értve) tárolom le.

    Ehelyett valami ezeréves szar trükközéssel próbálkoztál
    Ez alatt amúgy mit értettél egészen pontosan? :)

    // userdata a method paraméterében
    var existingUserData = await db.SpotifyUsers.SingleOrDefaultAsync(x => x.Username == userdata.Id);
    if (existingUserData is null) {
    db.SpotifyUsers.Add(userdata);
    }
    else
    {
    existingUserData.X = userdata.X;
    existingUserData.Y = userdata.Y
    }

    await db.SaveChangesAsync();

    Ennyi.

  • Keem1
    veterán

    Érthető, de ahogy Alexios is írja, itt nincs semmi redundancia az update-nél :D Hiszen te magad kéred le a kódban, hogy létezik-e. Ha létezik, akkor propertynként update és csá.
    Hol itt a redundacia?
    Ehelyett valami ezeréves szar trükközéssel próbálkoztál, ami persze hogy nem megy, mert ezer éves, azóta négyszer újraírták az FE-t :D meg amúgy is pont az a felesleges redundancia.
    Az existinget meg nem where-el kellene lekérned hanem SingleOrDefault-tal, az már elég csúnya lenne, ha a username-ek duplikáltak lennének.

    && Alexios

    A redundanciát a következőre értem, illetve amit én szeretnék (egyszerűsíteni):
    userdata jön az API response-ból, mivel ez egy API (abból is a Spotify-nál beloggolt user), így nekem kell eldönteni, hogy saját DB-mben létezik-e már.
    Bárhogy is legyen, a userdata ojjektum adott, a friss, ropogós, API-ból érkező aktuális adat.
    Ha létezik, ezt csak update-elni akarom a saját kópiámban, ha még nem, értelemszerűen létrehozni.

    Sematikusan valahogy így:
    // userdata a method paraméterében
    var existing = db.SpotifyUsers.Where(x => x.Username == userdata.Id); // Ezt még módosítom ahogy javasoltátok
    if (existing != null && existing.Count()>0) db.SpotifyUsers.Update(userdata); //De ez nem megy, pedig jó lenne
    else db.SpotifyUsers.Add(userdata);

    Tehát kvázi mindegy, hogy új adat-e vagy sem, nem kell új vagy update esetén sem újra értéket adnom ugyanannak a propertynek. Ha új data, akkor a teljes object az API returnból jön (userdata), ha létező, akkor pedig a kiindulási állapot a DB-ból lekért adat, és a különbséget (a userdata-hoz képest értve) tárolom le.

    Ehelyett valami ezeréves szar trükközéssel próbálkoztál
    Ez alatt amúgy mit értettél egészen pontosan? :)

  • martonx
    veterán

    Van egy Spotify playlist automatizált motyóm, ami a Spotify API-val dolgozik.
    Bár az elv több része is hasonlóan fog működni, most még a loggolt user (ketten csináljuk) DB-be letárolása megy, de a playlisteké is ugyanezen elv mentén fog.

    EF vagy EF Core?
    EF Core 8

    Sajnos terjedelmi és egyéb okok miatt nem tudom bemásolni, de a logic a következő:
    Van egy metódus: SpotifyLogin(SpotifyUser user)

    public DbSet<SpotifyUser>SpotifyUsers {get;set;}

    [Table("spotifyusers")]
    public class SpotifyUser()
    {
    [Key, Column("id")]
    public int Id { get; set; }
    [Column("tstamp")]
    public DateTime? TimeStamp { get; set; } = DateTime.Now;
    [Column("username")]
    public string? Username { get; set; }
    [Column("displayname")]
    public string? Name { get; set; }
    [Column("email")]
    public string? Email { get; set; }
    [Column("accesstoken")]
    public string? AccessToken { get; set; }
    [Column("followers")]
    public int Followers { get; set; } = 0;
    [Column("image")]
    public string? Image { get; set; }
    [Column("profileurl")]
    public string? ProfileUrl { get; set; }
    [Column("lastlogin")]
    public DateTime? LastLogin { get; set; } = DateTime.Now;
    }

    Ha az API-val sikerült beloggolnia (ennek a mikéntje jelenleg mindegy is), akkor lesz egy objektumunk, kb. ilyen:
    var user = new SpotifyUser()
    {
    //itt az API által átadott adatok
    }

    és ezután kerülünk abba a metódusba, ahonnan idéztem is már: SpotifyLogin(SpotifyUser user)

    Éééés itt pedig ketté ágazik a dolog, de mint mindent, ezt is próbálom minél egyszerűbbre, univerzálisabbra, és ha lehet, a legkevésbé redundánsra csinálni.
    Szóval letároljuk a usert DB-be, van egy user objectünk, amiről még nem tudjuk, hogy új-e vagy régi.
    Ha új, egy új entry lesz a DB-ben, ha régi, akkor aktualizáljuk, de az ID-ja az változatlan marad.

    Innen már ismerős:
    using (var db = new MySqlContext())
    {
    var existing = db.SpotifyUsers.Where(x => x.Username == userdata.Id);
    if (existing != null && existing.Count()>0)
    {
    // Ez a bajos, ha létezik a user
    // Ide valami olyan lenne jó, hogy:
    // db.SpotifyUsers.Update(userdata);
    // De erre csak egy új entry-t hoz létre a DB-ben
    }
    else
    {
    //Ez működik, ha még nincs ilyen user
    db.SpotifyUsers.Add(userdata);
    return (db.SaveChanges()>0? true : false);
    }
    }

    Szóval eddig jutottam, és a playlistek kezelése is kb ugyanígy fog kinézni, ha már létezik, akkor csak updateljük a followereket, a trackek számát, stb. Ha még nincs ilyen a DB-ben, akkor meg újként elmentjük teljes egészében.

    Az update amúgy működne úgy, hogy igazából lekérem a létező usert, és soronként/propertynként "lemásolom" a datát, és úgy egy Update, de nem akarok ennyi redundanciát.

    Ja, és meghagynám annyira univerzálisnak, hogy jelenleg működik MySQL és Sqlite DB-vel is, ami maradna, MySQL a fő cél, de backupnak meghagynám az SQLite-ot is.

    Érthető valamennyire? :)

    Érthető, de ahogy Alexios is írja, itt nincs semmi redundancia az update-nél :D Hiszen te magad kéred le a kódban, hogy létezik-e. Ha létezik, akkor propertynként update és csá.
    Hol itt a redundacia?
    Ehelyett valami ezeréves szar trükközéssel próbálkoztál, ami persze hogy nem megy, mert ezer éves, azóta négyszer újraírták az FE-t :D meg amúgy is pont az a felesleges redundancia.
    Az existinget meg nem where-el kellene lekérned hanem SingleOrDefault-tal, az már elég csúnya lenne, ha a username-ek duplikáltak lennének.

  • Alexios
    veterán

    Van egy Spotify playlist automatizált motyóm, ami a Spotify API-val dolgozik.
    Bár az elv több része is hasonlóan fog működni, most még a loggolt user (ketten csináljuk) DB-be letárolása megy, de a playlisteké is ugyanezen elv mentén fog.

    EF vagy EF Core?
    EF Core 8

    Sajnos terjedelmi és egyéb okok miatt nem tudom bemásolni, de a logic a következő:
    Van egy metódus: SpotifyLogin(SpotifyUser user)

    public DbSet<SpotifyUser>SpotifyUsers {get;set;}

    [Table("spotifyusers")]
    public class SpotifyUser()
    {
    [Key, Column("id")]
    public int Id { get; set; }
    [Column("tstamp")]
    public DateTime? TimeStamp { get; set; } = DateTime.Now;
    [Column("username")]
    public string? Username { get; set; }
    [Column("displayname")]
    public string? Name { get; set; }
    [Column("email")]
    public string? Email { get; set; }
    [Column("accesstoken")]
    public string? AccessToken { get; set; }
    [Column("followers")]
    public int Followers { get; set; } = 0;
    [Column("image")]
    public string? Image { get; set; }
    [Column("profileurl")]
    public string? ProfileUrl { get; set; }
    [Column("lastlogin")]
    public DateTime? LastLogin { get; set; } = DateTime.Now;
    }

    Ha az API-val sikerült beloggolnia (ennek a mikéntje jelenleg mindegy is), akkor lesz egy objektumunk, kb. ilyen:
    var user = new SpotifyUser()
    {
    //itt az API által átadott adatok
    }

    és ezután kerülünk abba a metódusba, ahonnan idéztem is már: SpotifyLogin(SpotifyUser user)

    Éééés itt pedig ketté ágazik a dolog, de mint mindent, ezt is próbálom minél egyszerűbbre, univerzálisabbra, és ha lehet, a legkevésbé redundánsra csinálni.
    Szóval letároljuk a usert DB-be, van egy user objectünk, amiről még nem tudjuk, hogy új-e vagy régi.
    Ha új, egy új entry lesz a DB-ben, ha régi, akkor aktualizáljuk, de az ID-ja az változatlan marad.

    Innen már ismerős:
    using (var db = new MySqlContext())
    {
    var existing = db.SpotifyUsers.Where(x => x.Username == userdata.Id);
    if (existing != null && existing.Count()>0)
    {
    // Ez a bajos, ha létezik a user
    // Ide valami olyan lenne jó, hogy:
    // db.SpotifyUsers.Update(userdata);
    // De erre csak egy új entry-t hoz létre a DB-ben
    }
    else
    {
    //Ez működik, ha még nincs ilyen user
    db.SpotifyUsers.Add(userdata);
    return (db.SaveChanges()>0? true : false);
    }
    }

    Szóval eddig jutottam, és a playlistek kezelése is kb ugyanígy fog kinézni, ha már létezik, akkor csak updateljük a followereket, a trackek számát, stb. Ha még nincs ilyen a DB-ben, akkor meg újként elmentjük teljes egészében.

    Az update amúgy működne úgy, hogy igazából lekérem a létező usert, és soronként/propertynként "lemásolom" a datát, és úgy egy Update, de nem akarok ennyi redundanciát.

    Ja, és meghagynám annyira univerzálisnak, hogy jelenleg működik MySQL és Sqlite DB-vel is, ami maradna, MySQL a fő cél, de backupnak meghagynám az SQLite-ot is.

    Érthető valamennyire? :)

    Az update amúgy működne úgy, hogy igazából lekérem a létező usert, és soronként/propertynként "lemásolom" a datát, és úgy egy Update, de nem akarok ennyi redundanciát.

    Ez mitől lenne redundencia?

  • Keem1
    veterán

    EF vagy EF Core?

    Nem látszik, honnan jön az edited. Plusz nem is igazán így kellene Ef-ben updatelni. Kérek bővebb példát és biztos tudni fogunk segíteni.

    Van egy Spotify playlist automatizált motyóm, ami a Spotify API-val dolgozik.
    Bár az elv több része is hasonlóan fog működni, most még a loggolt user (ketten csináljuk) DB-be letárolása megy, de a playlisteké is ugyanezen elv mentén fog.

    EF vagy EF Core?
    EF Core 8

    Sajnos terjedelmi és egyéb okok miatt nem tudom bemásolni, de a logic a következő:
    Van egy metódus: SpotifyLogin(SpotifyUser user)

    public DbSet<SpotifyUser>SpotifyUsers {get;set;}

    [Table("spotifyusers")]
    public class SpotifyUser()
    {
    [Key, Column("id")]
    public int Id { get; set; }
    [Column("tstamp")]
    public DateTime? TimeStamp { get; set; } = DateTime.Now;
    [Column("username")]
    public string? Username { get; set; }
    [Column("displayname")]
    public string? Name { get; set; }
    [Column("email")]
    public string? Email { get; set; }
    [Column("accesstoken")]
    public string? AccessToken { get; set; }
    [Column("followers")]
    public int Followers { get; set; } = 0;
    [Column("image")]
    public string? Image { get; set; }
    [Column("profileurl")]
    public string? ProfileUrl { get; set; }
    [Column("lastlogin")]
    public DateTime? LastLogin { get; set; } = DateTime.Now;
    }

    Ha az API-val sikerült beloggolnia (ennek a mikéntje jelenleg mindegy is), akkor lesz egy objektumunk, kb. ilyen:
    var user = new SpotifyUser()
    {
    //itt az API által átadott adatok
    }

    és ezután kerülünk abba a metódusba, ahonnan idéztem is már: SpotifyLogin(SpotifyUser user)

    Éééés itt pedig ketté ágazik a dolog, de mint mindent, ezt is próbálom minél egyszerűbbre, univerzálisabbra, és ha lehet, a legkevésbé redundánsra csinálni.
    Szóval letároljuk a usert DB-be, van egy user objectünk, amiről még nem tudjuk, hogy új-e vagy régi.
    Ha új, egy új entry lesz a DB-ben, ha régi, akkor aktualizáljuk, de az ID-ja az változatlan marad.

    Innen már ismerős:
    using (var db = new MySqlContext())
    {
    var existing = db.SpotifyUsers.Where(x => x.Username == userdata.Id);
    if (existing != null && existing.Count()>0)
    {
    // Ez a bajos, ha létezik a user
    // Ide valami olyan lenne jó, hogy:
    // db.SpotifyUsers.Update(userdata);
    // De erre csak egy új entry-t hoz létre a DB-ben
    }
    else
    {
    //Ez működik, ha még nincs ilyen user
    db.SpotifyUsers.Add(userdata);
    return (db.SaveChanges()>0? true : false);
    }
    }

    Szóval eddig jutottam, és a playlistek kezelése is kb ugyanígy fog kinézni, ha már létezik, akkor csak updateljük a followereket, a trackek számát, stb. Ha még nincs ilyen a DB-ben, akkor meg újként elmentjük teljes egészében.

    Az update amúgy működne úgy, hogy igazából lekérem a létező usert, és soronként/propertynként "lemásolom" a datát, és úgy egy Update, de nem akarok ennyi redundanciát.

    Ja, és meghagynám annyira univerzálisnak, hogy jelenleg működik MySQL és Sqlite DB-vel is, ami maradna, MySQL a fő cél, de backupnak meghagynám az SQLite-ot is.

    Érthető valamennyire? :)

  • martonx
    veterán

    Srácok, EntityFramework, lekérek egy entry-t a DB-ből, pár property-t módosítok, majd save-elném, de hiba jön.

    var existing = db.SpotifyUsers.Where(x => x.Username == userdata.Id).SingleOrDefault();
    db.Entry(existing).CurrentValues.SetValues(edited);

    Erre kapom azt, hogy:
    The property 'SpotifyUser.Id' is part of a key and so cannot be modified or marked as modified. To change the principal of an existing entity with an identifying foreign key, first delete the dependent and invoke 'SaveChanges', and then associate the dependent with the new principal.

    Hogy tudnám megmondani neki, hogy az Id-t hagyja békén, ne akarja módosítani (én se teszem, nincs ilyen property az edited-ben)? :R

    EF vagy EF Core?

    Nem látszik, honnan jön az edited. Plusz nem is igazán így kellene Ef-ben updatelni. Kérek bővebb példát és biztos tudni fogunk segíteni.

  • Keem1
    veterán

    Srácok, EntityFramework, lekérek egy entry-t a DB-ből, pár property-t módosítok, majd save-elném, de hiba jön.

    var existing = db.SpotifyUsers.Where(x => x.Username == userdata.Id).SingleOrDefault();
    db.Entry(existing).CurrentValues.SetValues(edited);

    Erre kapom azt, hogy:
    The property 'SpotifyUser.Id' is part of a key and so cannot be modified or marked as modified. To change the principal of an existing entity with an identifying foreign key, first delete the dependent and invoke 'SaveChanges', and then associate the dependent with the new principal.

    Hogy tudnám megmondani neki, hogy az Id-t hagyja békén, ne akarja módosítani (én se teszem, nincs ilyen property az edited-ben)? :R

  • martonx
    veterán

    Helló!

    Van egy általam elkészített C# .dll, amely matematikai képleteket tartalmaz, loop-ok stb, semmi igazán extrém.

    Ezt fel szeretnék használni egy VB programban. Kell nekem bármi extra dolgot csinálnom, hogy működjön az én oldalamon?

    Amennyiben C# környezetben van használva, akkor csak létre kell hozni egy példányt belőle, és már használhatóak a method-ok belőle, amelyek egy egyszerű eredményt dobnak vissza.

    Elvileg semmi extra dolgod nincs vele.

  • ReSeTer
    senior tag

    Helló!

    Van egy általam elkészített C# .dll, amely matematikai képleteket tartalmaz, loop-ok stb, semmi igazán extrém.

    Ezt fel szeretnék használni egy VB programban. Kell nekem bármi extra dolgot csinálnom, hogy működjön az én oldalamon?

    Amennyiben C# környezetben van használva, akkor csak létre kell hozni egy példányt belőle, és már használhatóak a method-ok belőle, amelyek egy egyszerű eredményt dobnak vissza.

  • martonx
    veterán

    Tényleg így kell singleton-t csinálni?

    using UnityEngine;
    public class GlobalReferences : MonoBehaviour{    

        public static GlobalReferences Instance{ get; set; } 

       private void Awake()    {       
           if (Instance != null && Instance != this) 
           {  
               Destroy(gameObject);        
           } 
           else
           {          
               Instance = this;       
           }    
        }
    }

    Sima public static class is singleton.

  • btraven
    őstag

    Tényleg így kell singleton-t csinálni?

    using UnityEngine;
    public class GlobalReferences : MonoBehaviour{    

        public static GlobalReferences Instance{ get; set; } 

       private void Awake()    {       
           if (Instance != null && Instance != this) 
           {  
               Destroy(gameObject);        
           } 
           else
           {          
               Instance = this;       
           }    
        }
    }

  • Tomi_78
    aktív tag

    Köszi, tehát a Count-1. Csak azt furcsállom, hogy olyan különösen viselkedik ezzel, ha másik névtérbe viszem át egy változóban a Count-1 értéket, mint most az elhelyez alprogramba, mert minden tankot elmozdít.

    Próbáld meg debuggerrel megnézni, hogy mi a baj.

    de az nem olyan egyszerű, ha eltérő a képek mérete.

    A programodban felhasznált képeket igazítsd a programod követelményeihez és ne a programodat a képekhez. Szerintem a tankoknak meg minden entitásnak általad előre meghatározott mérete kéne legyen és ehhez a mérethez kéne a tank képét hozzáigazítanod.

    Ha esetleg nem ismered, akkor itt tudsz inspirálódni:

    Neon shooter:
    https://github.com/MonoGame/MonoGame.Samples/tree/3.8.0/NeonShooter
    tutorial:
    https://code.tutsplus.com/make-a-neon-vector-shooter-in-xna-basic-gameplay--gamedev-9859t

    Platformer:
    https://github.com/MonoGame/MonoGame.Samples/tree/3.8.0/Platformer2D

    Köszönöm a tanácsokat és a hivatkozásokat; meg is nézem mindjárt azokat.
    Egyébként arra is gondoltam, hogy az is okozhatja a hibát, hogy a programnak nem állítok be egy fő felbontást, hanem azt szeretném érni, hogy minden képernyőfelbontáson egyformán fusson, közel azonos kinézettel, tehát legfeljebb a monitor által lekicsinyítve vagy felnagyítva a képek. Lehet, hogy tévúton vagyok ezzel az elképzeléssel is...

  • joysefke
    veterán

    Köszi, tehát a Count-1. Csak azt furcsállom, hogy olyan különösen viselkedik ezzel, ha másik névtérbe viszem át egy változóban a Count-1 értéket, mint most az elhelyez alprogramba, mert minden tankot elmozdít.
    A másik, hogy igen, az induló Y koordinátáit akarom meghatározni a dolgoknak, de az nem olyan egyszerű, ha eltérő a képek mérete. Úgy meg tudom oldani, hogy a pályán legyen külön olyan lehetőség, hogy platform fölött a tank (van is), de ez fölösleges szaporítása az elemeknek. Az lenne az ideális, ha mindenhol csak a tank, stb. lenne és önműködően az alatta vagy felette (ami közelebb van) levő platformhoz igazodna, amikor létrejön.

    Köszi, tehát a Count-1. Csak azt furcsállom, hogy olyan különösen viselkedik ezzel, ha másik névtérbe viszem át egy változóban a Count-1 értéket, mint most az elhelyez alprogramba, mert minden tankot elmozdít.

    Próbáld meg debuggerrel megnézni, hogy mi a baj.

    de az nem olyan egyszerű, ha eltérő a képek mérete.

    A programodban felhasznált képeket igazítsd a programod követelményeihez és ne a programodat a képekhez. Szerintem a tankoknak meg minden entitásnak általad előre meghatározott mérete kéne legyen és ehhez a mérethez kéne a tank képét hozzáigazítanod.

    Ha esetleg nem ismered, akkor itt tudsz inspirálódni:

    Neon shooter:
    https://github.com/MonoGame/MonoGame.Samples/tree/3.8.0/NeonShooter
    tutorial:
    https://code.tutsplus.com/make-a-neon-vector-shooter-in-xna-basic-gameplay--gamedev-9859t

    Platformer:
    https://github.com/MonoGame/MonoGame.Samples/tree/3.8.0/Platformer2D

  • Tomi_78
    aktív tag

    A Count megadja a List<T> aktuális elemszámát. Ha mindig a végéhez adod hozzá az újabb elemet (tehát nem beszúrsz) akkor a Count-1 fogja megadni az utolsónak hozzáadott elem indexét vagy -1-et ha nincsen még benne elem.

    Debuggolni próbáltad már a programodat hogy megtaláld a hibát?

    Ha a tank leesésére az animáció miatt van szükséged, az érthető. Ha viszont így akarod megkapni az induló Y koordinátáját az számomra fura. A platform elemednek van egy pozíciója az Y tengely mentén, van magassága, a tanknak is van kiterjedése ebből előre ki tudod számítani, hogy mi lesz a tank Y koordinátája.
    Mondjuk én tuti úgy oldanám meg a platfom elemeket, hogy azok egy egy mezőt teljesen elfoglaljanak, tehát játék kezdetekor a pályarajz alapján triviális legyen, hogy a mozgó elemeknek mi az Y koordinátájuk.

    Az ütközésdetektálási kód (nem próbáltam meg értelmezni) nem tűnik bombabiztosnak, illetve nem látom, hogy miért kell neked téglalapok ütközésének detektálásához kódot írnod? A frameworkben amiben dolgozol nincsen Rectangle osztály aminek lenne bool Intersects(Rectangle other) metódusa?

    Köszi, tehát a Count-1. Csak azt furcsállom, hogy olyan különösen viselkedik ezzel, ha másik névtérbe viszem át egy változóban a Count-1 értéket, mint most az elhelyez alprogramba, mert minden tankot elmozdít.
    A másik, hogy igen, az induló Y koordinátáit akarom meghatározni a dolgoknak, de az nem olyan egyszerű, ha eltérő a képek mérete. Úgy meg tudom oldani, hogy a pályán legyen külön olyan lehetőség, hogy platform fölött a tank (van is), de ez fölösleges szaporítása az elemeknek. Az lenne az ideális, ha mindenhol csak a tank, stb. lenne és önműködően az alatta vagy felette (ami közelebb van) levő platformhoz igazodna, amikor létrejön.

  • joysefke
    veterán

    Sziasztok!
    Annak megválaszolásában kérném a segítségeteket, hogy egy listába a legutóbb beszúrt elem indexét hogyan lehet megkapni? Mert én most a listanév.Count-1 képletet használom hozzá, de valamiért ez nem jó.
    A programomban van egy palya nevű térkép, amely alapján elhelyezem a képernyőre a játék elemeit, viszont nem mindenhol illeszkednek így pontosan egymáshoz, amiknek kéne, pl. a szereplőknek a platformok fölé. Ezért azt csinálom, hogy a létrehozáskor az y koordinátájuk módosuljon úgy, hogy leessenek az alattuk levő platformra, és azután indulhatna a játék - de ez eddig nem sikerült nekem.
    Így néz ki most, felvázolva lényege:
    /*1: Játékos, 2: robot1, 3: platform, 4: platform és fölötte robot1, 5: tank1, 6: platform és fölötte tank1,
                7: ketrec, 8: platform fölötte ketreccel, 9: kis drón*/
                switch (mostpalya) {
                    case 1:
                        palya = new int[,]{{0,0,0,0,0,0,0,0,0,0},
                                        {0,0,9,0,0,0,0,0,5,0},
                                        {0,0,0,0,3,3,4,8,3,3},
                                        {0,0,0,0,0,0,0,0,0,0},
                                        {3,4,3,3,0,0,0,0,0,0},
                                        {0,0,0,0,0,0,0,0,0,0},
                                        {0,0,0,3,3,0,0,3,8,3},
                                        {0,0,0,0,0,0,0,0,0,0},
                                        {0,3,3,0,0,3,3,3,0,0},
                                        {2,0,0,0,1,0,0,0,0,5},
                                        };

    Aztán egy tank létrehozása:
    case 5:
                                    var egyell3 = new JatekElemei();
                                    egyell3.xhely = xh;
                                    egyell3.yhely = yh-tank1all.Height;
                                    egyell3.nezirany = "balra";
                                    egyell3.mitcsinal = "jarkal";
                                    egyell3.mostkepe = tank1all;
                                    egyell3.neve="tank1";
                                    egyell3.mozgseb = 6;
                                    egyell3.elete=3;
                                    egyell3.melyseg = 0;
                                    jatelemlista.Add(egyell3);
                                    elhelyez(jatelemlista.Count-1,egyell3.xhely,egyell3.yhely,egyell3.mostkepe.Width,egyell3.mostkepe.Height);
                                break;

    és az elhelyező alprogramok:
    void elhelyez(int jatelem, int xh, int yh, int kepszel, int kepmag) {
                while (yh<=Screen.PrimaryScreen.Bounds.Height-talcamag-cimsormag && kivelutkozik(jatelem,xh,yh+kepmag+1,kepszel,kepmag)==-1) {
                    yh+=1;
                }
                jatelemlista[jatelem].yhely = yh;
            }

    int kivelutkozik(int hivoobj, int ittx, int itty, int objkepszel, int objkepmag) {
                for (int i=0; i<jatelemlista.Count; i++) {
                    var je = jatelemlista[i];
                    if (hivoobj!=i && je.neve!="arcocska" && ittx<je.xhely+je.mostkepe.Width && ittx+objkepszel>je.xhely && itty<je.yhely+je.mostkepe.Height && itty+objkepmag>je.yhely) return i;
                }
                return -1;
            }

    És az a fő baj, hogy az elhelyez alprogram hívása az összes tankot elmozgatja, nemcsak a jatelem indexűt, ami elvileg a jatelemlista.Count-1.
    Az meg már csak a hab a tortán, hogy nem is jól teszi lentebb őket, hanem lóg a levegőben az egyik a kettő közül.

    A Count megadja a List<T> aktuális elemszámát. Ha mindig a végéhez adod hozzá az újabb elemet (tehát nem beszúrsz) akkor a Count-1 fogja megadni az utolsónak hozzáadott elem indexét vagy -1-et ha nincsen még benne elem.

    Debuggolni próbáltad már a programodat hogy megtaláld a hibát?

    Ha a tank leesésére az animáció miatt van szükséged, az érthető. Ha viszont így akarod megkapni az induló Y koordinátáját az számomra fura. A platform elemednek van egy pozíciója az Y tengely mentén, van magassága, a tanknak is van kiterjedése ebből előre ki tudod számítani, hogy mi lesz a tank Y koordinátája.
    Mondjuk én tuti úgy oldanám meg a platfom elemeket, hogy azok egy egy mezőt teljesen elfoglaljanak, tehát játék kezdetekor a pályarajz alapján triviális legyen, hogy a mozgó elemeknek mi az Y koordinátájuk.

    Az ütközésdetektálási kód (nem próbáltam meg értelmezni) nem tűnik bombabiztosnak, illetve nem látom, hogy miért kell neked téglalapok ütközésének detektálásához kódot írnod? A frameworkben amiben dolgozol nincsen Rectangle osztály aminek lenne bool Intersects(Rectangle other) metódusa?

  • Tomi_78
    aktív tag

    Sziasztok!
    Annak megválaszolásában kérném a segítségeteket, hogy egy listába a legutóbb beszúrt elem indexét hogyan lehet megkapni? Mert én most a listanév.Count-1 képletet használom hozzá, de valamiért ez nem jó.
    A programomban van egy palya nevű térkép, amely alapján elhelyezem a képernyőre a játék elemeit, viszont nem mindenhol illeszkednek így pontosan egymáshoz, amiknek kéne, pl. a szereplőknek a platformok fölé. Ezért azt csinálom, hogy a létrehozáskor az y koordinátájuk módosuljon úgy, hogy leessenek az alattuk levő platformra, és azután indulhatna a játék - de ez eddig nem sikerült nekem.
    Így néz ki most, felvázolva lényege:
    /*1: Játékos, 2: robot1, 3: platform, 4: platform és fölötte robot1, 5: tank1, 6: platform és fölötte tank1,
                7: ketrec, 8: platform fölötte ketreccel, 9: kis drón*/
                switch (mostpalya) {
                    case 1:
                        palya = new int[,]{{0,0,0,0,0,0,0,0,0,0},
                                        {0,0,9,0,0,0,0,0,5,0},
                                        {0,0,0,0,3,3,4,8,3,3},
                                        {0,0,0,0,0,0,0,0,0,0},
                                        {3,4,3,3,0,0,0,0,0,0},
                                        {0,0,0,0,0,0,0,0,0,0},
                                        {0,0,0,3,3,0,0,3,8,3},
                                        {0,0,0,0,0,0,0,0,0,0},
                                        {0,3,3,0,0,3,3,3,0,0},
                                        {2,0,0,0,1,0,0,0,0,5},
                                        };

    Aztán egy tank létrehozása:
    case 5:
                                    var egyell3 = new JatekElemei();
                                    egyell3.xhely = xh;
                                    egyell3.yhely = yh-tank1all.Height;
                                    egyell3.nezirany = "balra";
                                    egyell3.mitcsinal = "jarkal";
                                    egyell3.mostkepe = tank1all;
                                    egyell3.neve="tank1";
                                    egyell3.mozgseb = 6;
                                    egyell3.elete=3;
                                    egyell3.melyseg = 0;
                                    jatelemlista.Add(egyell3);
                                    elhelyez(jatelemlista.Count-1,egyell3.xhely,egyell3.yhely,egyell3.mostkepe.Width,egyell3.mostkepe.Height);
                                break;

    és az elhelyező alprogramok:
    void elhelyez(int jatelem, int xh, int yh, int kepszel, int kepmag) {
                while (yh<=Screen.PrimaryScreen.Bounds.Height-talcamag-cimsormag && kivelutkozik(jatelem,xh,yh+kepmag+1,kepszel,kepmag)==-1) {
                    yh+=1;
                }
                jatelemlista[jatelem].yhely = yh;
            }

    int kivelutkozik(int hivoobj, int ittx, int itty, int objkepszel, int objkepmag) {
                for (int i=0; i<jatelemlista.Count; i++) {
                    var je = jatelemlista[i];
                    if (hivoobj!=i && je.neve!="arcocska" && ittx<je.xhely+je.mostkepe.Width && ittx+objkepszel>je.xhely && itty<je.yhely+je.mostkepe.Height && itty+objkepmag>je.yhely) return i;
                }
                return -1;
            }

    És az a fő baj, hogy az elhelyez alprogram hívása az összes tankot elmozgatja, nemcsak a jatelem indexűt, ami elvileg a jatelemlista.Count-1.
    Az meg már csak a hab a tortán, hogy nem is jól teszi lentebb őket, hanem lóg a levegőben az egyik a kettő közül.

  • pmonitor
    aktív tag

    Köszi! Nagyon régen használtam, és 50 felett már többet felejtek mint amennyit tanulok :(

    50 felett már többet felejtek mint amennyit tanulok

    Ez igaz. Én meg már 40 előtt is ezt tettem a betegségeim miatt. Azóta én már halott vagyok. Már csak vérkeringésem van. Azért arra büszke vagyok, hogy addig sztem. egész jól haladtam. Ráadásul azt figyelembe véve, hogy sehol nem tanultam programozást.

  • cigam
    titán

    Nem commitoltad a változást.

    Köszi! Nagyon régen használtam, és 50 felett már többet felejtek mint amennyit tanulok :(

  • quailstorm
    félisten

    A VS-ben módosítottam a kódot, és ezt visszatölteném a GitHub-ra, de nem akarja. Hiába nyomok egy Push-t, látszólag valamit csinál, de nem tűnik el a módosítás:
    Mit csinálok rosszul?

    Nem commitoltad a változást.

  • cigam
    titán

    A VS-ben módosítottam a kódot, és ezt visszatölteném a GitHub-ra, de nem akarja. Hiába nyomok egy Push-t, látszólag valamit csinál, de nem tűnik el a módosítás:
    Mit csinálok rosszul?

  • martonx
    veterán

    Írtam már normálisan futó programot, class library-t most csinálnék először és gondoltam van valami módszer a debugolásra anélkül, hogy csinálni kellene egy külön konzol programot csak ezért.

    Nem használhatok VS community editiont, mert az egyik ingyenességnek feltételét kimerítjük (túl nagy létszám).

    Ok, köszönöm, akkor csinálok csak debugolásra egy külön programot.

    Unit teszt is jó ötlet. Érted (vagy nem), de önmagában a class library nem futtatható, ergo nem debuggolható :D
    Ez nem debuggolási kérdés, vagy hogy VS-t használsz-e.
    Visual Studio Code is pont ugyanúgy megfelel a célnak. Egy console app-ba be kell referálnod, vagy egy unit tesztbe, vagy bármibe ami futtatható, és azon belül fogod tudni debuggolni, futtatni a class librarydet.

  • joysefke
    veterán

    Írtam már normálisan futó programot, class library-t most csinálnék először és gondoltam van valami módszer a debugolásra anélkül, hogy csinálni kellene egy külön konzol programot csak ezért.

    Nem használhatok VS community editiont, mert az egyik ingyenességnek feltételét kimerítjük (túl nagy létszám).

    Ok, köszönöm, akkor csinálok csak debugolásra egy külön programot.

    Igen, unit teszteket kéne írnod. Ha nem akarod túlgondolni a dolgot akkor a unit tesztek mehetnek közvetlenül a class librarys projektbe.

  • ReSeTer
    senior tag

    Úgy, hogy írsz egy ténylegesen futtatható programot, és abba behúzod, és voilá.
    Egyébként, ha ennyire nem értesz hozzá, miért rögtön egy class libraryvel kezdtél?
    Írj előbb egy sima futtatható programot.

    Írtam már normálisan futó programot, class library-t most csinálnék először és gondoltam van valami módszer a debugolásra anélkül, hogy csinálni kellene egy külön konzol programot csak ezért.

    Nem használhatok VS community editiont, mert az egyik ingyenességnek feltételét kimerítjük (túl nagy létszám).

    Ok, köszönöm, akkor csinálok csak debugolásra egy külön programot.

  • joysefke
    veterán

    Hogyan tudnám debugolni?
    dotnet build -c release parancs működik, tehát megkapom a .dll-t, de nem tudom sajnos ellenőrizni, ha valami gond van.

    Windowst használsz? Mert ha igen, akkor akár használhatnád az ingyenes Visual Studio Community editiont is...

  • martonx
    veterán

    Hogyan tudnám debugolni?
    dotnet build -c release parancs működik, tehát megkapom a .dll-t, de nem tudom sajnos ellenőrizni, ha valami gond van.

    Úgy, hogy írsz egy ténylegesen futtatható programot, és abba behúzod, és voilá.
    Egyébként, ha ennyire nem értesz hozzá, miért rögtön egy class libraryvel kezdtél?
    Írj előbb egy sima futtatható programot.

  • ReSeTer
    senior tag

    Ez így jó, de önmagában ezt nem fogod tudni futtatni ctrl+f5-tel, mert ez nem egy önálló program.

    Hogyan tudnám debugolni?
    dotnet build -c release parancs működik, tehát megkapom a .dll-t, de nem tudom sajnos ellenőrizni, ha valami gond van.

  • martonx
    veterán

    Helló!

    Szeretnék készíteni egy .dll-t VS Code-ban, C# nyelven, amit majd egy másik program referenciaként használni tud.

    Ezeket csináltam eddig:

    Terminal-ba: dotnet new classlib

    Aztán a Class1 osztályba ezt írtam:

    namespace DLL_proba;
    public class Class1
    {public static int osszeadas(int elso, int masodik)
    {
    int eredmeny;
    eredmeny=elso+masodik;
    return eredmeny;}
    }

    Ha nyomok egy ctrl+F5-t akkor nem igazán akar végigmenni. Hogyan lehet ezt .dll-be összerakni?

    C# Dev kit Extensiont nem használhatok, mert csak magáncélra ingyenes, és én pont egy céges gépen "tanulgatok".

    Ez így jó, de önmagában ezt nem fogod tudni futtatni ctrl+f5-tel, mert ez nem egy önálló program.

  • ReSeTer
    senior tag

    Helló!

    Szeretnék készíteni egy .dll-t VS Code-ban, C# nyelven, amit majd egy másik program referenciaként használni tud.

    Ezeket csináltam eddig:

    Terminal-ba: dotnet new classlib

    Aztán a Class1 osztályba ezt írtam:

    namespace DLL_proba;
    public class Class1
    {public static int osszeadas(int elso, int masodik)
    {
    int eredmeny;
    eredmeny=elso+masodik;
    return eredmeny;}
    }

    Ha nyomok egy ctrl+F5-t akkor nem igazán akar végigmenni. Hogyan lehet ezt .dll-be összerakni?

    C# Dev kit Extensiont nem használhatok, mert csak magáncélra ingyenes, és én pont egy céges gépen "tanulgatok".

  • pmonitor
    aktív tag

    Pontosan ilyeneket ir, nem véletlen vagy kitiltva a fő progos topikból, valószinűleg itt is azt kéne.

    int x = 0x55;
    object obj = x;

    Itt "obj" szted. hány byte-os(bites)? Elmondom. x86-on 4 byte-os(32bites), x64-en 8 byte-os(64 bites). x64-en miért is foglal le 64 bitet a fordító? Azért, mert az "obj" referencia típus(gyakorlatilag egy mutató). A mutatók pedig 64 bites programban 64 bitesek.
    De ez azt is eredményezi, hogy amit "beletesznek", azt mind ebbe a 4 vagy 8 byte-ba kell beleerőszakolni. Akár érték, akár referencia típus. Referencia típusoknál ez nagyon 1szerű, mivel "obj" is referencia típus. Érték típusoknál már nem ilyen 1szerű a helyzet. Mert itt az érték típus teljesen más típus, mint a referencia típus. Erre találták ki azt, hogy ilyen esetben létrehoznak példányosítanak 1 referencia típust, amibe belecsomagolják az érték típust(jelenleg 1 int típust). Így oldják meg, hogy 4 vagy 8 byte-ba "beleférjen" akár egy 32 byte-os érték típus is(mert a bedobozolt típus teljesen más memóriaterületen helyezkedik el).
    Ennél a posztomnál itt is létrejön az object(ami ugyebár referencia típus), csak egy másik memória területen.
    public void TorlunkHaTudja()
    {
    if (adat is ITorol)
    (adat as ITorol).delete();
    }

    Tehát van egy érték típusunk("Valami"), és van egy C#-on keresztül nem megfogható(megcímezhető) referencia típus, ami a "Valami"-nek a másolatát tartalmazza. A Main()-ben lévő genTip.TorlunkHaTudja(); a "Valami" másolatán(bedobozolt példányán) hajtódik végre. Igen ám!! Csak mivel ezt a bedobozolt "Valami"-t nem tudjuk elérni C# kódból, így nem tudjuk az érték típusú "Valami" mezőit megváltoztatni(így az "ertek"-et sem. Gyakorlatilag azt lehet mondani, hogy a nem működő, vmint. az én módosításommal kiegészített kód is majdnem karakter szerint ugyanarra az asm-ra fordul(tehát ugyanazt csinálja). Csak az általam módosított változatban "o"-n keresztül C# kódból is el tudjuk érni a bedobozolt változatot, amit a nem működő változatban nem tudunk megtenni.
    Boxing után x86 esetén az int 8 byte-ot foglal le a rendszer az 4 byte-os "int"-nek, míg x64 esetén 12 byte-ot foglal le egy 1-szerű, 4byte-os int típusnak!!
    A boxing által létrejött referencia típusokat a GC takarítja el, miután már 1 referencia sem mutat rájuk.
    Sajnos az alap könyvek is csak az érték és referencia szerinti paraméter átadást tárgyalja. Ami másik témakör. De ezt a másik témakört is 1szerűbb megérteni az általam vázolt programozási szemlélettel. Ezt egész röviden össze lehet foglalni:
    1: Az érték típusok, és a referenciák(mutatók) alapesetben érték szerint adódnak át. Tehát érték típusú paraméter esetén az egész típus másolódik át.
    2: A referencia típus esetén csak a referencia(mutató) másolódik át. Az itt levő kód esetén ezért lehet az elvileg "konstans" memóriát átírni. Ha a string érték típus lenne, akkor a "konstans" memóriát nem lehetne átírni, mert az eredeti stringnek csak egy másolatával dolgozna ez az algo.
    3: Referencia szerinti paraméter átadásnál(ref vagy out) érték típus esetén az érték típusra, referencia típus esetén a referenciára mutató "pointer" adódik át.
    Sztem ezek magától értetődő dolgok. Ezeket(mint látható) asm-ben be lehet bizonyítani. Magas szinten(C#), csak az ellentmondásokból(sok ellentmondásból) lehet következtetni, hogy ez így van, ahogy leírtam.
    Sztem. nem nehéz megérteni.

  • Alexios
    veterán

    1 troll ilyeneket ír??? Azóta sem kaptam rá választ. Sztem. pedig ennek a nézetnek alapnak kellett volna lennie a C#-ban. Csak hát ehhez programozni kellene... Sokat...
    A többire meg: No komment..

    Pontosan ilyeneket ir, nem véletlen vagy kitiltva a fő progos topikból, valószinűleg itt is azt kéne.

  • pmonitor
    aktív tag

    Srácok, olvastam a felvetést, de direkt nem válaszolok a trollkodásra. Mert ez már színtiszta trollkodás.
    Mindenki tökéletesen értette, gyanítom pmonitor is, hogy mit írtam.
    Mintha nem lehetne valaki react, vagy angular fejlesztő, miközben nyilvánvalóan javascripttel / typescripttel dolgozik.
    Trollkodni mindig lehet, válaszolni ezekre a baromságokra semmi értelme. Kérem ne etessük a trollt, lépjünk tovább, nincs itt semmi látnivaló.

    1 troll ilyeneket ír??? Azóta sem kaptam rá választ. Sztem. pedig ennek a nézetnek alapnak kellett volna lennie a C#-ban. Csak hát ehhez programozni kellene... Sokat...
    A többire meg: No komment..

  • martonx
    veterán

    Srácok, olvastam a felvetést, de direkt nem válaszolok a trollkodásra. Mert ez már színtiszta trollkodás.
    Mindenki tökéletesen értette, gyanítom pmonitor is, hogy mit írtam.
    Mintha nem lehetne valaki react, vagy angular fejlesztő, miközben nyilvánvalóan javascripttel / typescripttel dolgozik.
    Trollkodni mindig lehet, válaszolni ezekre a baromságokra semmi értelme. Kérem ne etessük a trollt, lépjünk tovább, nincs itt semmi látnivaló.

  • pmonitor
    aktív tag

    Nem trollkodni akartam. Az idézet előtt ezt írta:
    Ez éppen egy nagyon jó példa arra, hogy még Asp.Net-en belül is annyiféle megoldás van, annyira szerteágazó, hogy rohadtul nem az a kérdés, hogy a byte array hány byte-on tárolódik, hanem lásd a fenti kérdést.

    Azért Asp.Net-ben nem nagyon van byte array. C#-ban pl. annál inkább. Meg egyébként nem olyan elhanyagolható az, hogy a byte array hány byte-on tárolódik(persze nem Asp.Netben, hanem C#-ban). Ugyanis, ha biztosan belefér vminek az értéke 1 byte-ba, akkor sokkal jobban megéri a byte array, mint az int array. Mert ugyebár nem mindegy, hogy egy tömb 400 megát foglal le, vagy pedig 1600 megát!!! Ez azért elég jó optimalizáló tényező(mármint annak, aki ismeri, hogy mi hány byte-on tárolódik). Ha nem tudja, akkor hogy optimalizál??
    Ezért bátorkodtam megjegyezni.

  • joysefke
    veterán

    nem hiszem, hogy programnyelvként írta martonx, .net fejlesztő, aki főleg asp.net framework-öt használ

    Csak trollkodni akart.

  • petyus_
    senior tag

    Amire még én, mint Asp.Net fejlesztő...

    Egyébként az Asp.Net mióta lett programnyelv?

    nem hiszem, hogy programnyelvként írta martonx, .net fejlesztő, aki főleg asp.net framework-öt használ

  • pmonitor
    aktív tag

    fontos, hogy nagybetűvel írtam a Usert, ugyanis Asp.Net-ben így hívják a user entitást, ami HttpContext-ben van. Szóval reményeim szerint érti, mire gondolok. Ez éppen egy nagyon jó példa arra, hogy még Asp.Net-en belül is annyiféle megoldás van, annyira szerteágazó, hogy rohadtul nem az a kérdés, hogy a byte array hány byte-on tárolódik, hanem lásd a fenti kérdést.
    Amire még én, mint Asp.Net fejlesztő se tudok csukott szemmel válaszolni, mert razort pl. sose használtam, MVC-t, és API-t szoktam fejleszteni. Nyilván fingom sincs fejből, hogy mi lehet az OnGetAccount-ban, mire lát rá, mit kellene pluszban behúzni ahhoz, hogy megjelenjen a User.
    Meg persze kód példa nélkül nehéz is konkrétumokról beszélni :D Meg persze, ha rászánnék még plusz 20 percet, és életemben először nyitnék egy razor page-es Asp.Net-es projektet, akkor valószínűleg pontosabban tudnék válaszolni neki, így csak iránymutatást tudok adni.

    Amire még én, mint Asp.Net fejlesztő...

    Egyébként az Asp.Net mióta lett programnyelv?

  • cigam
    titán

    Olvas(gat)om, de még az angolt is töröm, nem hogy érteném, hát még amit próbál elmesélni. Biztos jó, meg okos dolog, de most csak azt látom, hogy feleslegesen túlbonyolítja. Nézegetem a Graph Explorer-t, de így sem értem. Már a nevével is problémáim vannak. Miért grafikon?
    Nekem nincs cégem, előfizetésem, azúrom, se semmim. Egy mezei ingyenes MS fiókom van. Ráadásul a OneDrive sem szinkronizálja le, a helyi meghajtóra, mert egy másik fiókban van az eredeti fájl, velem csak meg van osztva.

    Azért köszi, hogy próbálsz irányba állítani. Majd még olvasgatok. Meg a githubon is találtam egy Onedrive samples példakód gyűjtemény, hátha tanulok belőle valamit.

  • martonx
    veterán

    Végül letöltöttem a fájlt, és a Letöltéseken belül jobklikkel kiválasztottam a "Letöltési hivatkozás másolása" menüpontot, ami egy jó hosszú link, de működik. Kérdés meddig.

  • cigam
    titán

    A shared url, a webes Excel felületet nyitja meg, nem közvetlenül a fájlra mutató link. Az alábbi "trükkös" linkkel lehetett eddig közvetlenül magát a fájlt elérni. Ezt a lehetőséget zárta be most az MS. Az MS Graph nekem sűrű sötét erdő, abszolút nem értem.

    Végül letöltöttem a fájlt, és a Letöltéseken belül jobklikkel kiválasztottam a "Letöltési hivatkozás másolása" menüpontot, ami egy jó hosszú link, de működik. Kérdés meddig.

  • cigam
    titán

    Microsoft Graph erre szolgál: [link]
    De lehet, hogy csak kell neked egy shared url az xlsx-hez.

    A shared url, a webes Excel felületet nyitja meg, nem közvetlenül a fájlra mutató link. Az alábbi "trükkös" linkkel lehetett eddig közvetlenül magát a fájlt elérni. Ezt a lehetőséget zárta be most az MS. Az MS Graph nekem sűrű sötét erdő, abszolút nem értem.

  • martonx
    veterán

    Közben belekukkantottam a letöltött fájlba, és html forráskód van benne. Gondolom valami hiba/login oldal. Hogyan tudnék a OneDrive-ról (egyszerűen) letölteni egy fájlt?

    Microsoft Graph erre szolgál: [link]
    De lehet, hogy csak kell neked egy shared url az xlsx-hez.

  • cigam
    titán

    Nem tudjátok mit variált az MS? Évek óta van egy kis programom, ami a onedrive-ról letölt egy .xlsx fájlt, és a benne levő adatokat feldolgozza.
    Napok óta valami hibás fájlt tölt le. Maga a letöltés nincs túlvariálva:
    webClient.DownloadFile("https://onedrive.live.com/download?resid=2D7E...&authkey=%21...&em=3", @fileName)
    Viszont most egy olyan fájl az eredmény, amiben van valami (26kB), de nem tudom beolvasni:
    System.IO.FileFomatException: A fájl sérült, adatokat tartalmaz.
    Ha visszatöltöm a OneDrive-ba a letöltött fájlt, és megnyitnám az online Excelben, nem ismeri fel:
    A munkafüzet nem nyitható meg, mert lehet, hogy a fájl formátuma nem egyezik a fájlkiterjesztéssel.

    Ami igaz is lehet, mert ha a OneDrive WEB-es felületéről töltöm le, csak 10.6kB a fájl mérete.

    Közben belekukkantottam a letöltött fájlba, és html forráskód van benne. Gondolom valami hiba/login oldal. Hogyan tudnék a OneDrive-ról (egyszerűen) letölteni egy fájlt?

  • cigam
    titán

    Nem tudjátok mit variált az MS? Évek óta van egy kis programom, ami a onedrive-ról letölt egy .xlsx fájlt, és a benne levő adatokat feldolgozza.
    Napok óta valami hibás fájlt tölt le. Maga a letöltés nincs túlvariálva:
    webClient.DownloadFile("https://onedrive.live.com/download?resid=2D7E...&authkey=%21...&em=3", @fileName)
    Viszont most egy olyan fájl az eredmény, amiben van valami (26kB), de nem tudom beolvasni:
    System.IO.FileFomatException: A fájl sérült, adatokat tartalmaz.
    Ha visszatöltöm a OneDrive-ba a letöltött fájlt, és megnyitnám az online Excelben, nem ismeri fel:
    A munkafüzet nem nyitható meg, mert lehet, hogy a fájl formátuma nem egyezik a fájlkiterjesztéssel.

    Ami igaz is lehet, mert ha a OneDrive WEB-es felületéről töltöm le, csak 10.6kB a fájl mérete.

  • (ex)Cat
    senior tag

    Igen, ez a probléma valószínűleg, de nem tudok átugrani rajta vmiért. Próbáltam amit írsz, de sajnos nem működik. Bármi hasonló megoldással kísérleteztem, kb. ez lett a végeredmény:

    "_-* #\ ##0\ _F_t_-;-* #\ ##0\ _F_t_-;_-* "-"??\ _F_t_-;_-@_-"

    Azaz a # ## részbe az első # után is beleteszi a \ jelet és ez teljesen elcseszi a formátumot. Egészen addig jó amúgy amíg konkrétan bele nem teszem a numberfomat-ba.

    Range r = excelWS.Columns["E"]; r.NumberFormat = format;

    Azt hiszem, ezt kénytelen leszek elengedni. :(

    De egy f.sz vagyok. Ha a NumberFormatLocal-t használom, akkor jó.

  • (ex)Cat
    senior tag

    Gondolom az a baj, hogy speciális karakter van a stringben és az nincsen megfelelően escapelve.

    elsőnek sima "verbatim" stringkonstansként próbálnám megadni:

    var format = @"_-* # ##0\ _F_t_-;-* # ##0\ _F_t_-;_-* ""-""??\ _F_t_-;_-@_-";

    itt annyi történt, hogy a sztringen belüli dupla aposztróf karaktert megdupláztam, mert azt még verbatim sztringen belül is escapelni kell.

    ha ez sem megy, akkor próbáld meg raw stringként, ahol is tripla-duplaaposztróf között van a sztring.

    var format = """_-* # ##0\ _F_t_-;-* # ##0\ _F_t_-;_-* "-"??\ _F_t_-;_-@_-""";

    https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/verbatim

    Igen, ez a probléma valószínűleg, de nem tudok átugrani rajta vmiért. Próbáltam amit írsz, de sajnos nem működik. Bármi hasonló megoldással kísérleteztem, kb. ez lett a végeredmény:

    "_-* #\ ##0\ _F_t_-;-* #\ ##0\ _F_t_-;_-* "-"??\ _F_t_-;_-@_-"

    Azaz a # ## részbe az első # után is beleteszi a \ jelet és ez teljesen elcseszi a formátumot. Egészen addig jó amúgy amíg konkrétan bele nem teszem a numberfomat-ba.

    Range r = excelWS.Columns["E"]; r.NumberFormat = format;

    Azt hiszem, ezt kénytelen leszek elengedni. :(

  • joysefke
    veterán

    Sziasztok
    Egy excel táblázatot kellene létrehoznom c#-ban. Alapvetően ezzel nincs is baj, mert kész van, csak olyan gondom van, hogy bizonyos cellákra egy a user által megadott fomátumot kellene alkalmaznom

    Konkrétan a numerikus oszlopokhoz ez lenne az igény:

    _-* # ##0\ _F_t_-;-* # ##0\ _F_t_-;_-* "-"??\ _F_t_-;_-@_-

    Na most bármit is próbáltam eddig, egyszerűen nem sikerült megadni ezt mint NumberFormat-ot, mert egyrészt ugye a speciális karakterek miatt nem lehetett egy stringként összerakni, másrészt meg ha azzal trükköztem, hogy a \ és " jeleket vmi mással helyettesítve utólag kicserélem, akkor meg beszűrt néhány helyre felesleges \ jelet és onnantól persze hogy nem volt jó a képlet.

    Tud vki valami megoldást erre?

    Gondolom az a baj, hogy speciális karakter van a stringben és az nincsen megfelelően escapelve.

    elsőnek sima "verbatim" stringkonstansként próbálnám megadni:

    var format = @"_-* # ##0\ _F_t_-;-* # ##0\ _F_t_-;_-* ""-""??\ _F_t_-;_-@_-";

    itt annyi történt, hogy a sztringen belüli dupla aposztróf karaktert megdupláztam, mert azt még verbatim sztringen belül is escapelni kell.

    ha ez sem megy, akkor próbáld meg raw stringként, ahol is tripla-duplaaposztróf között van a sztring.

    var format = """_-* # ##0\ _F_t_-;-* # ##0\ _F_t_-;_-* "-"??\ _F_t_-;_-@_-""";

    https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/tokens/verbatim

  • (ex)Cat
    senior tag

    Sziasztok
    Egy excel táblázatot kellene létrehoznom c#-ban. Alapvetően ezzel nincs is baj, mert kész van, csak olyan gondom van, hogy bizonyos cellákra egy a user által megadott fomátumot kellene alkalmaznom

    Konkrétan a numerikus oszlopokhoz ez lenne az igény:

    _-* # ##0\ _F_t_-;-* # ##0\ _F_t_-;_-* "-"??\ _F_t_-;_-@_-

    Na most bármit is próbáltam eddig, egyszerűen nem sikerült megadni ezt mint NumberFormat-ot, mert egyrészt ugye a speciális karakterek miatt nem lehetett egy stringként összerakni, másrészt meg ha azzal trükköztem, hogy a \ és " jeleket vmi mással helyettesítve utólag kicserélem, akkor meg beszűrt néhány helyre felesleges \ jelet és onnantól persze hogy nem volt jó a képlet.

    Tud vki valami megoldást erre?

  • Keem1
    veterán

    Akárhány awaited lehet egy async metóduson belül. Nincs ilyen jellegű limitáció.

    Ez nem egy életbiztosítás, gondolom Te is tudod:
    groups.FirstOrDefault().GroupId

    & #10114 Alexios

    Koszonom mindkettotoknek. :R

    Ez nem egy életbiztosítás, gondolom Te is tudod
    Igen-igen, ez nem marad igy, csak a fejlesztes korai szakaszaban hasznalok ilyesmit

  • Alexios
    veterán

    Srácok, 2 await 1 metódusban mennyire OK? Működik amúgy, de lehet bármi gond vagy akármilyen ellenvetés? :R

    Mutatom:
    var groups = await API.GetGroups("");
    var items = await API.GetItemsByGroup(groups.FirstOrDefault().GroupId);

    Nincs ellenvetés, sőt.

  • joysefke
    veterán

    Srácok, 2 await 1 metódusban mennyire OK? Működik amúgy, de lehet bármi gond vagy akármilyen ellenvetés? :R

    Mutatom:
    var groups = await API.GetGroups("");
    var items = await API.GetItemsByGroup(groups.FirstOrDefault().GroupId);

    Akárhány awaited lehet egy async metóduson belül. Nincs ilyen jellegű limitáció.

    Ez nem egy életbiztosítás, gondolom Te is tudod:
    groups.FirstOrDefault().GroupId

  • Keem1
    veterán

    Srácok, 2 await 1 metódusban mennyire OK? Működik amúgy, de lehet bármi gond vagy akármilyen ellenvetés? :R

    Mutatom:
    var groups = await API.GetGroups("");
    var items = await API.GetItemsByGroup(groups.FirstOrDefault().GroupId);

  • joysefke
    veterán

    Sziasztok!
    Egy kis 3D-szerű programot készítek C#-ban és ebben szükségem van arra, hogy tudjam, hogy egy pont melyik irányban van egy másiktól a síkban.
    Ehhez a következő képletet használom, miután kiböngésztem a világháló bugyraiból:
    Math.Atan2(kamnezy-(a_kamera.yhely+5),kamnezx-(a_kamera.xhely+5))*(180/Math.PI)A kamera 10 képpont sugarú kör, ezért a középpontja +5 pixellel van a szélétől. Illetve van a kamnezx-kamnezy pont, ami 20 képpontnyira van a kamera előtt, és egy fekete vonal jelzi az irányát és a végét a mellékelt képen. A képeltben e két pont egymáshoz viszonyított irányát vizsgálom, próbaképpen.
    Na de ami furcsa, az a visszaadott értékek. Ugyanis ha a kamera felfelé néz, akkor negatív számokat mutat irányként, míg ha lefelé, akkor a várttól teljesen eltérőt, pl. a képen látható 90-et a 270 helyett.
    Végül is tudom ezeket korrigálni (felfelé az Abs() függvény használatával, míg lefelé úgy, hogy az új irányérték az a régi + (180 - régi) legyen), és így megkapni a valós értékeket, de akkor is kíváncsi vagyok arra, hogy mi lehet ezen hibák oka?
    Netán mégis rossz a képlet?

    A képlet első ránézésre jónak tűnik. Próbálj írni pár tesztesetet amelyek általad előre kiszámolt eseteknek a képlet által visszaadott végeredményét tesztelik az általad elvárttal szemben. Aztán ha valami nem stimmel, akkor addig kalapálod a képletedet amíg végül az összes teszteseted zöld nem lesz.

    Legalább minden negyedre ([0°-90°], [90°-180°], stb ) jusson egy teszteset. A -90° a +270°-el egyenértékű a képeden. -90 mod 360 = 270 mod 360. Tehát itt a -90 nem egyenlő +90-nel.

  • Tomi_78
    aktív tag

    Sziasztok!
    Egy kis 3D-szerű programot készítek C#-ban és ebben szükségem van arra, hogy tudjam, hogy egy pont melyik irányban van egy másiktól a síkban.
    Ehhez a következő képletet használom, miután kiböngésztem a világháló bugyraiból:
    Math.Atan2(kamnezy-(a_kamera.yhely+5),kamnezx-(a_kamera.xhely+5))*(180/Math.PI)A kamera 10 képpont sugarú kör, ezért a középpontja +5 pixellel van a szélétől. Illetve van a kamnezx-kamnezy pont, ami 20 képpontnyira van a kamera előtt, és egy fekete vonal jelzi az irányát és a végét a mellékelt képen. A képeltben e két pont egymáshoz viszonyított irányát vizsgálom, próbaképpen.
    Na de ami furcsa, az a visszaadott értékek. Ugyanis ha a kamera felfelé néz, akkor negatív számokat mutat irányként, míg ha lefelé, akkor a várttól teljesen eltérőt, pl. a képen látható 90-et a 270 helyett.
    Végül is tudom ezeket korrigálni (felfelé az Abs() függvény használatával, míg lefelé úgy, hogy az új irányérték az a régi + (180 - régi) legyen), és így megkapni a valós értékeket, de akkor is kíváncsi vagyok arra, hogy mi lehet ezen hibák oka?
    Netán mégis rossz a képlet?

  • pmonitor
    aktív tag

    Azért nem jó, mert onnan hiányzik az RPN- képzése. A CodeProject tudja a függvényeket, de az RPN képzése hibás. Az andreinc.net-es példánál jó az RPN képzés, de a függvényeket nem tudja. Jelenleg egy kevert verzión dolgozom. Ahol az Az andreinc.net-es rész képzi az RPN-stringet, majd azt a Rosettához hasonlóan dolgozom fel az RPN-t. Mindezt körbekerítem a codeproject-es példával.
    Hosszú menet lesz ez...

    Itt található a jelenlegi munkaverzióm. Még nagyon kusza. csak idő kell hozzá..

  • pmonitor
    aktív tag

    A rosetta miert nem jo, ott van c is implementalva amit kerestel...

    Azért nem jó, mert onnan hiányzik az RPN- képzése. A CodeProject tudja a függvényeket, de az RPN képzése hibás. Az andreinc.net-es példánál jó az RPN képzés, de a függvényeket nem tudja. Jelenleg egy kevert verzión dolgozom. Ahol az Az andreinc.net-es rész képzi az RPN-stringet, majd azt a Rosettához hasonlóan dolgozom fel az RPN-t. Mindezt körbekerítem a codeproject-es példával.
    Hosszú menet lesz ez...

  • sztanozs
    veterán

    Ez éppen egy nagyon jó példa arra, hogy még Asp.Net-en belül is annyiféle megoldás van, annyira szerteágazó, hogy rohadtul nem az a kérdés, hogy a byte array hány byte-on tárolódik, hanem lásd a fenti kérdést.
    Amire még én, mint Asp.Net fejlesztő se tudok csukott szemmel válaszolni,

    Sztem. egyébként inkább olyanok végeznek programozási munkát, akik megírták az a programot, amit még te sem tudsz megválaszolni.

    ----------------------------------------------------------------------------------------------------------------------

    Egyébként most pont 1 RPN-t próbálok készíteni/találni. Igazából ezeket az oldalakat találtam hozzá:
    [link]
    [link]
    [link]

    Ezek egyike sem hibátlan, vagy csak az egyik rész van implementálva. Ráadásul az egyik Java-ban is van, amihez a tudásom gyakorlatilag nulla. Sztem azért ez is programozás. De láthatod, hogy mintakód legalább mindegyikben van. :)) Na meg a szakkönyveket is ha nézed, azokban is vannak példa/minta kódok.
    Csak az a probléma, hogy a nagyon erős fáradékonyságom miatt értelmes munkát(akár fizikai, akár szellemi) csak igen keveset tudok időt szakítani. De mondjuk én nem igazán sietek sehová...

    A rosetta miert nem jo, ott van c is implementalva amit kerestel...

  • pmonitor
    aktív tag

    fontos, hogy nagybetűvel írtam a Usert, ugyanis Asp.Net-ben így hívják a user entitást, ami HttpContext-ben van. Szóval reményeim szerint érti, mire gondolok. Ez éppen egy nagyon jó példa arra, hogy még Asp.Net-en belül is annyiféle megoldás van, annyira szerteágazó, hogy rohadtul nem az a kérdés, hogy a byte array hány byte-on tárolódik, hanem lásd a fenti kérdést.
    Amire még én, mint Asp.Net fejlesztő se tudok csukott szemmel válaszolni, mert razort pl. sose használtam, MVC-t, és API-t szoktam fejleszteni. Nyilván fingom sincs fejből, hogy mi lehet az OnGetAccount-ban, mire lát rá, mit kellene pluszban behúzni ahhoz, hogy megjelenjen a User.
    Meg persze kód példa nélkül nehéz is konkrétumokról beszélni :D Meg persze, ha rászánnék még plusz 20 percet, és életemben először nyitnék egy razor page-es Asp.Net-es projektet, akkor valószínűleg pontosabban tudnék válaszolni neki, így csak iránymutatást tudok adni.

    Ez éppen egy nagyon jó példa arra, hogy még Asp.Net-en belül is annyiféle megoldás van, annyira szerteágazó, hogy rohadtul nem az a kérdés, hogy a byte array hány byte-on tárolódik, hanem lásd a fenti kérdést.
    Amire még én, mint Asp.Net fejlesztő se tudok csukott szemmel válaszolni,

    Sztem. egyébként inkább olyanok végeznek programozási munkát, akik megírták az a programot, amit még te sem tudsz megválaszolni.

    ----------------------------------------------------------------------------------------------------------------------

    Egyébként most pont 1 RPN-t próbálok készíteni/találni. Igazából ezeket az oldalakat találtam hozzá:
    [link]
    [link]
    [link]

    Ezek egyike sem hibátlan, vagy csak az egyik rész van implementálva. Ráadásul az egyik Java-ban is van, amihez a tudásom gyakorlatilag nulla. Sztem azért ez is programozás. De láthatod, hogy mintakód legalább mindegyikben van. :)) Na meg a szakkönyveket is ha nézed, azokban is vannak példa/minta kódok.
    Csak az a probléma, hogy a nagyon erős fáradékonyságom miatt értelmes munkát(akár fizikai, akár szellemi) csak igen keveset tudok időt szakítani. De mondjuk én nem igazán sietek sehová...

  • martonx
    veterán

    Remélhetőleg valahol látszódni fog a useren, hogy min keresztül lépett be.

    Erre a ClaimsPrincipal-on egészen biztosan lesz egy claim amit a HasClaim(claimType)-pal vagy valami hasonlóval lehet ellenőrizni.

    Elsőre elég lehet egy if az onGetAccountban,

    Azért érdemes a framework által biztosított auth check módszert használni, mert ha nem teljesül a policy, akkor a pipelineban a végrehajtás el sem jut addig hogy meghívódjon a Controller action method (gondolom Razornél is valami hasonló van annotálva), így hibázni sem tudsz és nem is kell a hiba kezelésével (redirect vagy error code) foglalkoznod.

    Persze, csak a sima Auth annotációval ráraksz valamit, ami fekete doboz, és fogalmad se lesz, hogy teljesül-e vagy nem, vagy egyáltalán jó helyen keresgélsz-e. Csak azt látod, hogy 401. :D Vagy ha mázlid van, akkor azt látod, hogy beenged.
    Ezért gondoltam elsőre annotáció nélkül megdebuggolni a metóduson belül, hogy WTF, aztán majd persze csinálni erre egy custom Auth attribute-ot.

  • junkpod
    nagyúr

    Sziasztok! Összeraktam egy kódot a CodeLite-ben C++ ban. Ha elindítom a build and execute menut akkor szépen lefordítja és futtatja, kiválóan működik. Viszont én egy külön futtatható exe-filet szeretnék ebből készíteni. De egyszerűen nem tudok rájönni, hogy kell ezt a cuccot rávenni futtatható exe fordítására.
    Átállítottam "debug"-ról "release" módra, meg is csinálta a release mappában, de az exe-re kattintva hiányolja a libc33.dll fájlt.
    Tud valaki segíteni?
    (bocs ha nem túl szakmai vagyok)

    bocs, elírtam a libc++.dll fájlt hiányolja

  • junkpod
    nagyúr

    Sziasztok! Összeraktam egy kódot a CodeLite-ben C++ ban. Ha elindítom a build and execute menut akkor szépen lefordítja és futtatja, kiválóan működik. Viszont én egy külön futtatható exe-filet szeretnék ebből készíteni. De egyszerűen nem tudok rájönni, hogy kell ezt a cuccot rávenni futtatható exe fordítására.
    Átállítottam "debug"-ról "release" módra, meg is csinálta a release mappában, de az exe-re kattintva hiányolja a libc33.dll fájlt.
    Tud valaki segíteni?
    (bocs ha nem túl szakmai vagyok)

  • joysefke
    veterán

    Szerintem ezt annotációval nem fogod tudni megoldani, no persze custom auth attribute-al szépen megoldható.
    Elsőre elég lehet egy if az onGetAccountban, ami jól látod megvizsgálja a Usert. Remélhetőleg valahol látszódni fog a useren, hogy min keresztül lépett be.
    És majd ha ez már szépen működik, majd ki lehet emelni egy custum Authentication attribute-ba.

    Remélhetőleg valahol látszódni fog a useren, hogy min keresztül lépett be.

    Erre a ClaimsPrincipal-on egészen biztosan lesz egy claim amit a HasClaim(claimType)-pal vagy valami hasonlóval lehet ellenőrizni.

    Elsőre elég lehet egy if az onGetAccountban,

    Azért érdemes a framework által biztosított auth check módszert használni, mert ha nem teljesül a policy, akkor a pipelineban a végrehajtás el sem jut addig hogy meghívódjon a Controller action method (gondolom Razornél is valami hasonló van annotálva), így hibázni sem tudsz és nem is kell a hiba kezelésével (redirect vagy error code) foglalkoznod.

Új hozzászólás Aktív témák