- Xiaomi 15T Pro - a téma nincs lezárva
- One mobilszolgáltatások
- Xiaomi 17T - T-modell
- Yettel topik
- Samsung Galaxy S23 Ultra - non plus ultra
- Táncoló okoshangszóróért csábít Apple munkaerőt az OpenAI
- Samsung Galaxy Watch8 - Classic - Ultra 2025
- Xiaomi 17 Ultra - jó az optikája
- Motorola Signature - mielőtt aláírnád...
- Honor Magic8 Pro - bevált recept kölcsönvett hozzávalókkal
-
10100 - 10001
10246 - 10201 10200 - 10101 10100 - 10001 10000 - 9901 9900 - 9801 9800 - 9701 9700 - 9601 9600 - 9501 9500 - 9401 9400 - 9301 9300 - 9201 9200 - 9101 9100 - 9001 9000 - 8901 8900 - 8801 8800 - 8701 8700 - 8601 8600 - 8501 8500 - 8401 8400 - 8301 8300 - 8201 8200 - 8101 8100 - 8001 8000 - 6001 6000 - 4001 4000 - 2001 2000 - 1
-
Fórumok
Mobilarena - mobil fórumok
Okostelefonok Mobiltelefonok Okosórák Autó+mobil Üzlet és Szolgáltatások Mobilalkalmazások Tartozékok, egyebek Mobilarena blogokPROHARDVER! - hardver fórumok
Notebookok TV & Audió Digitális fényképezés Alaplapok, chipsetek, memóriák Processzorok, tuning Hűtés, házak, tápok, modding Videokártyák Monitorok Adattárolás Multimédia, életmód, 3D nyomtatás Nyomtatók, szkennerek Tabletek, E-bookok PC, mini PC, barebone, szerver Beviteli eszközök Egyéb hardverek PROHARDVER! BlogokIT café - infotech fórumok
Infotech Hálózat, szolgáltatók OS, alkalmazások SzoftverfejlesztésGAMEPOD - játék fórumok
PC játékok Konzol játékok MobiljátékokLOGOUT - lépj ki, lépj be!
LOGOUT reakciók Monologoszféra FototrendFÁRADT GŐZ - közösségi tér szinte bármiről
Tudomány, oktatás Sport, életmód, utazás, egészség Kultúra, művészet, média Gazdaság, jog Technika, hobbi, otthon Társadalom, közélet Egyéb Lokál PROHARDVER! interaktív
Új hozzászólás Aktív témák
-
martonx
veterán
Én sem ismerem, hogy Razor-ban ez hogy van (vagy úgy általában a Razort), de feltételezem, hogy "claim" alapon könnyen megvalósítható az authorizáció, ahol végül [Authorize(Policy = "policyName")] attribútummal lenne dekorálva a top level Razor metódus.
A "policyName" policy pedig az ASP NET Core "User" claimjeit ellenőrzi. Az adott Identity Provider (Spotify) által történt azonosításra nyilván a Useren (ClaimsPrincipal-on) belül fog utalni egy claim érték, amit az adott policy ellenőrizni tud.
https://learn.microsoft.com/en-us/aspnet/core/security/authorization/claims?view=aspnetcore-8.0
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. -
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
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.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.
Akkor csak kényszerből válaszoltál? (bár lehet, hogy téged fizetnek, ezért válaszkényszerben vagy...) Mert csak úgy ex-has válaszolni..??
rohadtul nem az a kérdés, hogy a byte array hány byte-on tárolódik,
Hát hálózati/web programozásnál meg adatbázisok esetén tényleg nem. De desktopon annál inkább.
Ha annyira összetett a kérdés, akkor meg egyébként tényleg semmi értelme rizsázni róla írogatni(akár kérdezni, akár válaszolni). Sztem. Bár ahogy látom, itt inkább a "régi motorosok" írogatnak egymás között. Itt is a kérdező is, meg ti is régi motorosok vagytok. De látszik nagyon sok területre igaz az, hogy nincs rá régi motoros szaki.
Véleményem szerint az én példámból kiindulva. Mert ugye az adatbiztonság a béka hátsója alatt van. Engem pl. a fél ország lát, hogy mit csinálok. És akkor is meg tudták volna az adataim, ha nem adom meg. És a dolog érdekessége, hogy olyanok élhetnek vissza az adatokkal, ahová regisztrál az ember. Na de hát a velem történteket is látják az esetleges kezdők. Úgyhogy én ezért nem csodálkozom, hogy gyakorlatilag nincse friss újonc, meg ilyesmi. Nekem legalábbis ez a véleményem. De mondjuk ez nem az én bajom. Bocs az off-ért, de én így látom. Meg azt, hogy Magyar fórumokon legfeljebb recepteket érdemes keresgélni. Programozás témakörben nem
-
joysefke
veterán
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
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.Én sem ismerem, hogy Razor-ban ez hogy van (vagy úgy általában a Razort), de feltételezem, hogy "claim" alapon könnyen megvalósítható az authorizáció, ahol végül [Authorize(Policy = "policyName")] attribútummal lenne dekorálva a top level Razor metódus.
A "policyName" policy pedig az ASP NET Core "User" claimjeit ellenőrzi. Az adott Identity Provider (Spotify) által történt azonosításra nyilván a Useren (ClaimsPrincipal-on) belül fog utalni egy claim érték, amit az adott policy ellenőrizni tud.
https://learn.microsoft.com/en-us/aspnet/core/security/authorization/claims?view=aspnetcore-8.0
-
martonx
veterán
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
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. -
pmonitor
aktív tag
Ezt jól megszakértetted...

-
martonx
veterán
Srácok, szeretnék helpet kérni.
ASP.Net Core Razor. Van két Oauth authentication-öm: Google, Spotify.
Van a Spotify pagemoldelen belül egy OnGetAccount(), amit értelemszerűen ha a Spoti login ok, akkor jelenjen meg. Nem logged off, nem Google logged in, hanem csakis ha Spoti logged in.
Hogy tudom rávenni a /Spotify/Account oldalt, hogy ha logged in akkor OK, amúgy /Spotify/Login redirect?Valami ilyesmit találtam a metódus fejhez:
[Authenticate]De ez hatástalan, semmi nem történik.
Előre is köszi.
Ó tényleg erre nem válaszoltam. Mondjuk nem is nagyon értek hozzá, de tippre, vizsgálnám a User-t. Azaz biztos, hogy nem a metódus annotációk között keresgélnék.
Ha van User, és be van jelentkezve, akkor annak függvényében lehet ide-oda tovább dobni. -
pmonitor
aktív tag
Amúgy csupán memóriatakarékossági okból lett volna szükségem a byte típusra, mert az id és idk nem lett volna több a programban, mint 255.
Ezért mondtam, hogy érdemes lenne valami alapozó könyvet olvasgatni. Egyébként addig nincs értelme optimalizálgatni, amíg arra nincs szükség (, illetve amíg nem tudod mit csinálsz).
A programodban biztos lehetsz benne, hogy az hogy a MainForm ban egy fieldnek bool-t használsz int helyett semmi jelentősége nincsen illetve egyetlen byte-ot sem spórolsz, a MainForm byte-re pontosan ugyanakkora lesz.
Ennek az oka, hogy az objektumok fieldjei a memóriában nem feltétlenül teljesen folytonosan helyzkednek el, hanem igazítva vannak.class MyClass
{
byte B;
int Num;
}Ez például jó eséllyel a "Num" 4byteos mérete miatt 4 bytejával lesz igazítva, tehát a B is 4 byteot fog elfoglalni jó eséllyel. (futtatókörnyezet függő). Az 1byte hasznos terület után lesz 3byte foghíj. Sebességben sincsen semmi különbség két byte összeadása illetve két integer összeadása között. (Nem mintha ez bármit számítana)
De ezekkel egyelőre nincs értelme foglalkoznod.
Azért ezzel vigyázni kell, mert igaz, hogy 1 byte-ak 1 int-et foglal le, viszont több byte-nak(pl. tömbnél 16 byte-nak nem 16 int-et foglal le, hanem csak 4-int-et). Persze azt azért hozzá kell tennem, hogy az én kijelentéseim MS VS C#-ra vonatkozik(általában x86-os platformon). Ez a C# kód:
byte[] bytes = new byte[] { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x10 };
Erre fordul:64 19 df 08 10 00 00 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10
Itt az első 4 byte az object(mivel referencia típus), a következő 4 byte az int tömb hossza. Utána következnek az értékek(16 darab byte 4 intet foglal le. -
Keem1
veterán
Srácok, szeretnék helpet kérni.
ASP.Net Core Razor. Van két Oauth authentication-öm: Google, Spotify.
Van a Spotify pagemoldelen belül egy OnGetAccount(), amit értelemszerűen ha a Spoti login ok, akkor jelenjen meg. Nem logged off, nem Google logged in, hanem csakis ha Spoti logged in.
Hogy tudom rávenni a /Spotify/Account oldalt, hogy ha logged in akkor OK, amúgy /Spotify/Login redirect?Valami ilyesmit találtam a metódus fejhez:
[Authenticate]De ez hatástalan, semmi nem történik.
Előre is köszi.
-
joysefke
veterán
S valóban. Hát, erre bizony nem gondoltam volna sosem, hogy egy konkrét szám maga is lehet valamilyen típusú. De köszönöm szépen a segítséget; az int típusra állítás tényleg megoldotta.
Amúgy csupán memóriatakarékossági okból lett volna szükségem a byte típusra, mert az id és idk nem lett volna több a programban, mint 255.Amúgy csupán memóriatakarékossági okból lett volna szükségem a byte típusra, mert az id és idk nem lett volna több a programban, mint 255.
Ezért mondtam, hogy érdemes lenne valami alapozó könyvet olvasgatni. Egyébként addig nincs értelme optimalizálgatni, amíg arra nincs szükség (, illetve amíg nem tudod mit csinálsz).
A programodban biztos lehetsz benne, hogy az hogy a MainForm ban egy fieldnek bool-t használsz int helyett semmi jelentősége nincsen illetve egyetlen byte-ot sem spórolsz, a MainForm byte-re pontosan ugyanakkora lesz.
Ennek az oka, hogy az objektumok fieldjei a memóriában nem feltétlenül teljesen folytonosan helyzkednek el, hanem igazítva vannak.class MyClass
{
byte B;
int Num;
}Ez például jó eséllyel a "Num" 4byteos mérete miatt 4 bytejával lesz igazítva, tehát a B is 4 byteot fog elfoglalni jó eséllyel. (futtatókörnyezet függő). Az 1byte hasznos terület után lesz 3byte foghíj. Sebességben sincsen semmi különbség két byte összeadása illetve két integer összeadása között. (Nem mintha ez bármit számítana)
De ezekkel egyelőre nincs értelme foglalkoznod.
-
Tomi_78
aktív tag
S valóban. Hát, erre bizony nem gondoltam volna sosem, hogy egy konkrét szám maga is lehet valamilyen típusú. De köszönöm szépen a segítséget; az int típusra állítás tényleg megoldotta.
Amúgy csupán memóriatakarékossági okból lett volna szükségem a byte típusra, mert az id és idk nem lett volna több a programban, mint 255. -
joysefke
veterán
Na, ez vajon miért van?
Van egy saját osztály a programomban, a JatekElemei. Ebben egy public byte típusú, id nevű változó.
Aztán adott egy idk nevű, 0 kezdőértékű globális változó a program elején:
public partial class MainForm : Form
{
byte idk=0;És amikor létrehozom a JatekElemei egy példányát:
var egyarc = new JatekElemei();
(...)
egyarc.id=idk+1;
idk+=1;a következő hibaüzenet "örvendeztet meg" az egyarc.id=idk+1; sorral kapcsolatban:
"A(z) „int” típus nem konvertálható implicit módon „byte” típusra. Van explicit konverzió (esetleg hiányzik egy típuskonverzió). (CS0266)"Kérdésem: hol van itt az int típus, mikor mindkettőt byte-ként adtam meg?
itt:
idk+1idk az byte típusú, az "1" az int típusú, "+" operátor kimenete pedig int típusú lesz.
Az idk típusát miért nem állítod át int-re, miért byte-ra van szükséged?
-
Tomi_78
aktív tag
Na, ez vajon miért van?
Van egy saját osztály a programomban, a JatekElemei. Ebben egy public byte típusú, id nevű változó.
Aztán adott egy idk nevű, 0 kezdőértékű globális változó a program elején:
public partial class MainForm : Form
{
byte idk=0;És amikor létrehozom a JatekElemei egy példányát:
var egyarc = new JatekElemei();
(...)
egyarc.id=idk+1;
idk+=1;a következő hibaüzenet "örvendeztet meg" az egyarc.id=idk+1; sorral kapcsolatban:
"A(z) „int” típus nem konvertálható implicit módon „byte” típusra. Van explicit konverzió (esetleg hiányzik egy típuskonverzió). (CS0266)"Kérdésem: hol van itt az int típus, mikor mindkettőt byte-ként adtam meg?
-
pmonitor
aktív tag
Biztos ezért zártak ki

Már linkeltem amúgy neked a hivatalos language specet persze leírtad hogy ők sem tudják miről van szó [link] All struct types implicitly inherit from the classSystem.ValueType, which, in turn, inherits from classobject.
Tudom hogy úgysem hiszed el, de azért futtasd le ezt a kódot is és nézd meg az outputot, gondolom a nyelv maga se tudja miről beszél:int x = 1;Console.WriteLine(x is object);futtasd le ezt a kódot is és nézd meg az outputot, gondolom a nyelv maga se tudja miről beszél:
int x = 1;
Console.WriteLine(x is object);
Ez valami vicc? Megnézted, hogy mire fordul? Megmutatom:bool b;
int x = 0x11;
b = x is int;
ugyanez ASM-ben:05465EF5 mov dword ptr [ebp-3Ch],1
ezt mégegyszer kiemelem:mov dword ptr [ebp-3Ch],1
Ezzel fordítási időben(ha létezik a változó), akkor azt mondja:
Ha valaki megkérdezi, hogy 1 változó Object-e, akkor 1szerűen mond azt, hogy igen. Tehát már fordítási időben "beleégeti a kódba", hogy true-t adjon vissza. Ez ugyanaz, mintha ezt írnád:bool b = true;
object obj = b;
Console.WriteLine("{0}", obj);De ez is ugyanarra fordul:
bool b = true;
08455EEE mov dword ptr [ebp-3Ch],1
int x = 1;
Ezek az MS-es fiúk nagyon rafkósak ám!!
Bármiféle ellenőrzés nélkül kiíratják, hogy true!!
Ilyen "csalással" könnyű azt mondani, hogy minden object...
Na de nézzük meg, hogy mi is történik akkor, amikor 1 érték típust beleteszünk egy objectbe:bool b = true;
int x = 0x55;
object obj = x;
object obj2 = x as object;
Console.WriteLine("{0} {1}", obj, obj2);Ez a következőre fodul:
int x = 0x55;
05175F21 mov dword ptr [ebp-3Ch],55h
object obj = x;
05175F28 mov ecx,4E0C8D0h
05175F2D call CORINFO_HELP_NEWSFAST (0300300Ch)
05175F32 mov dword ptr [ebp-48h],eax
05175F35 mov ecx,dword ptr [ebp-48h]
05175F38 mov eax,dword ptr [ebp-3Ch]
05175F3B mov dword ptr [ecx+4],eax
05175F3E mov ecx,dword ptr [ebp-48h]
05175F41 mov dword ptr [ebp-40h],ecx
object obj2 = x as object;
05175F44 mov ecx,4E0C8D0h
05175F49 call CORINFO_HELP_NEWSFAST (0300300Ch)
05175F4E mov dword ptr [ebp-4Ch],eax
05175F51 mov edx,dword ptr [ebp-4Ch]
05175F54 mov ecx,dword ptr [ebp-3Ch]
05175F57 mov dword ptr [edx+4],ecx
05175F5A mov edx,dword ptr [ebp-4Ch]
05175F5D mov dword ptr [ebp-44h],edx
Console.WriteLine("{0} {1}", obj, obj2);Ebből ezeket a sorokat emelném ki:
05175F2D call CORINFO_HELP_NEWSFAST (0300300Ch)
05175F49 call CORINFO_HELP_NEWSFAST (0300300Ch)
Ezekben a sorokban látszik, hogy 1 új object jön létre. Boxing történt. De ezek már nem érték típusok, hanem obj-ba és obj2-be bedobozolt int-ek. Ezek már referencia típusok, amiknek a mezőjében int van. És természetes, hogy vmi érték típust dobozolnak be 1 referencia típusba(obj, obj2), akkor az már referencia típus. Ha ellenőrizné is a program, hogy tényleg object-e az ősük, akkor is nyilván true-t adna vissza, hiszen ezek object-ek. Az más kérdés, hogy azért object-ek, mert bedobozolták őket. Ezt bizonyítja a következő kód is:05175F3B mov dword ptr [ecx+4],eax
Itt az ecx regiszterben van a típus azonosító(nevezhetjük object-nek), de az értéket[ecx+4]-be teszi bele(itt is látszik, hogy ez már referencia típus, mert eax értékét nem az dword ptr [ecx]-be teszi, hanem az object címét kihagyva az [ecx+4]-be. Ez is azt igazolja, hogy ez már referencia típus. -
joysefke
veterán
A fő probléma azzal van hogy a referencia típus fogalmát kevered az object-el.
Pusztán az hogy az értéktípusok is az object-ből származnak végső soron(nem nehéz amúgy ezt belátni, nem véletlen ignoráltad gondolom a kód példámat is, de ugyanúgy elérhető minden metódus egy int-en is ami egy objectben van, csak hogy még szemléletesebb legyen, ha már a language specet teljesen ignorálod), nem jelenti azt hogy ettől a heap-ben vannak tárolva. Pont ez a System.ValueType lényege, ennek köszönhetően vannak értéktípusként kezelve. Tehát az hogy a System.ValueType-ból származik, nem jelenti hogy ez egy referencia típus, hiszen pont a System.ValueType miatt lesz értéktípus, de ettől az még az objectből származik. Ha pl. egy intet objectként kezelsz akkor jön a boxing, hiszen referencia típusként akarod kezelni(itt is látszik hogy az object az ősosztályuk amúgy, hiszen simán átadhatsz egy intet mondjuk egy metódusnak ami objectet vár, mindenféle compiler error).
Kicsit olyan ez inkább mintha egy ősosztályán át hivatkoznál egy példányra, ott sem érheted el a metódus/propertyk stb amik a leszármazott osztályban vannak, érték típusoknál meg ha objectként hivatkozol rá akkor jön a boxing, és "elveszted" a leszármazott érték típus tulajdonságokat.(ez csak egy analógia, nem a pontos mechanizmus a kötekvést elkerülendő)Magyarázhatsz neki. Ha elolvas valamit, azt nem azért teszi, hogy a hasznos tudását növelje, hanem muníciót gyűjt a következő hónapok kötekedéséhez, ahol a "profi programozókat" (az ő szava járása) szapulja akik valami fontosnak vélt dolgot nem jól tudnak.
Ha az elmúlt éveket nem trollkodással töltötte volna, akkor akár "profi programozó" programozó is lehetne ami nyilván mindig is lenni akart. -
Alexios
veterán
Ha az object az őse(rá gondolni is rossz tegyük fel), akkor miért van szükség boxing-ra???
Object -> Objet relációban mi értelme van a boxingnak?
Sztem a válasz nagy egyszerű: azért szükséges a boxing, mert az érték típusok különböznek az object től. Csak valahogyan "szinkronba" kellett hozni az érték típusokat az Object-el. Erre találták ki lényegében a boxing-ot. Ami azt hivatott szolgálni, hogy létrehoznak 1 vadi új Object-et a hap-ben, és annak a mezője az érték típus. Gyakorlatilag az érték típusokon a műveletek(metódusok) nem is érték típusokkal dolgoznak, hanem a boxingolt típussal. Pl. a Console.WriteLine() is ígys csinálja, Az is is ezt használja stb...A fő probléma azzal van hogy a referencia típus fogalmát kevered az object-el.
Pusztán az hogy az értéktípusok is az object-ből származnak végső soron(nem nehéz amúgy ezt belátni, nem véletlen ignoráltad gondolom a kód példámat is, de ugyanúgy elérhető minden metódus egy int-en is ami egy objectben van, csak hogy még szemléletesebb legyen, ha már a language specet teljesen ignorálod), nem jelenti azt hogy ettől a heap-ben vannak tárolva. Pont ez a System.ValueType lényege, ennek köszönhetően vannak értéktípusként kezelve. Tehát az hogy a System.ValueType-ból származik, nem jelenti hogy ez egy referencia típus, hiszen pont a System.ValueType miatt lesz értéktípus, de ettől az még az objectből származik. Ha pl. egy intet objectként kezelsz akkor jön a boxing, hiszen referencia típusként akarod kezelni(itt is látszik hogy az object az ősosztályuk amúgy, hiszen simán átadhatsz egy intet mondjuk egy metódusnak ami objectet vár, mindenféle compiler error).
Kicsit olyan ez inkább mintha egy ősosztályán át hivatkoznál egy példányra, ott sem érheted el a metódus/propertyk stb amik a leszármazott osztályban vannak, érték típusoknál meg ha objectként hivatkozol rá akkor jön a boxing, és "elveszted" a leszármazott érték típus tulajdonságokat.(ez csak egy analógia, nem a pontos mechanizmus a kötekvést elkerülendő) -
fatal`
titán
Ha az object az őse(rá gondolni is rossz tegyük fel), akkor miért van szükség boxing-ra???
Object -> Objet relációban mi értelme van a boxingnak?
Sztem a válasz nagy egyszerű: azért szükséges a boxing, mert az érték típusok különböznek az object től. Csak valahogyan "szinkronba" kellett hozni az érték típusokat az Object-el. Erre találták ki lényegében a boxing-ot. Ami azt hivatott szolgálni, hogy létrehoznak 1 vadi új Object-et a hap-ben, és annak a mezője az érték típus. Gyakorlatilag az érték típusokon a műveletek(metódusok) nem is érték típusokkal dolgoznak, hanem a boxingolt típussal. Pl. a Console.WriteLine() is ígys csinálja, Az is is ezt használja stb...Olvasd el a language specet. Alexios be is linkelte.
-
pmonitor
aktív tag
Ha az object az őse(rá gondolni is rossz tegyük fel), akkor miért van szükség boxing-ra???
Object -> Objet relációban mi értelme van a boxingnak?
Sztem a válasz nagy egyszerű: azért szükséges a boxing, mert az érték típusok különböznek az object től. Csak valahogyan "szinkronba" kellett hozni az érték típusokat az Object-el. Erre találták ki lényegében a boxing-ot. Ami azt hivatott szolgálni, hogy létrehoznak 1 vadi új Object-et a hap-ben, és annak a mezője az érték típus. Gyakorlatilag az érték típusokon a műveletek(metódusok) nem is érték típusokkal dolgoznak, hanem a boxingolt típussal. Pl. a Console.WriteLine() is ígys csinálja, Az is is ezt használja stb...Ha jól emléxem, akkor már többször linkeltem be ezt a linket. Ez a másik fórumról való. Ott oldottam meg. Maga a kód(ami nem működik:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GenericTest
{
interface ITorol
{
void delete();
}
class GenerikusTipus<T>
{
T adat;
public GenerikusTipus(T adat)
{
this.adat = adat;
}
public T GetErtek()
{
return adat;
}
public void TorlunkHaTudja()
{
if (adat is ITorol)
(adat as ITorol).delete();
}
}
struct Valami : ITorol
{
public int ertek;
public Valami(int ertek)
{
this.ertek = ertek;
}
public void delete()
{
ertek = 0;
}
new public string ToString()
{
return ertek.ToString();
}
}
class Program
{
static void Main(string[] args)
{
Valami v = new Valami(5);
GenerikusTipus<Valami> genTip = new GenerikusTipus<Valami>(v);
Console.WriteLine(genTip.GetErtek().ToString());
genTip.TorlunkHaTudja();
Console.WriteLine(genTip.GetErtek().ToString());
Console.ReadKey();
}
}
}A "megoldásom":
Az as operátor ugye csak referencia, ill. nullabe típusok esetén működik. Tehát akkor az adott típust ki kell tenni object-be(ami ugyebár referencia típus), ez már magában hordozza a "metaadatokat" is. Na most így már alkalmazhatónak kell lennie az object példányra az as operátornak. Viszont a végén az adat-ba be kell tenni a kapott értéket.
if (adat is ITorol)
{
object o = adat;
(o as ITorol).delete();
adat = (T)o;
}Ez érdekességnek jó, de "élesben" nem igazán használnám...
Ha ezt a kódot(és a megoldást) valaki becsülettel megnézi, akkor egyértelműen látszik, hogy a metódusok 1 boxingolt típussal(másolattal) dolgoznak. Ezért van az, hogy az o objectet a törlés után vissza kell tenni az aktuális mezőbe. Az érték típusok csak az alapműveletek esetén(*/+-) nagyon gyorsak. metódushívás esetén nagyon lassú.
-
pmonitor
aktív tag
Ha az object az őse(rá gondolni is rossz tegyük fel), akkor miért van szükség boxing-ra???
Object -> Objet relációban mi értelme van a boxingnak?
Sztem a válasz nagy egyszerű: azért szükséges a boxing, mert az érték típusok különböznek az object től. Csak valahogyan "szinkronba" kellett hozni az érték típusokat az Object-el. Erre találták ki lényegében a boxing-ot. Ami azt hivatott szolgálni, hogy létrehoznak 1 vadi új Object-et a hap-ben, és annak a mezője az érték típus. Gyakorlatilag az érték típusokon a műveletek(metódusok) nem is érték típusokkal dolgoznak, hanem a boxingolt típussal. Pl. a Console.WriteLine() is ígys csinálja, Az is is ezt használja stb... -
fatal`
titán
a var kulcsszóval deklarált változód a stacken van (a futó metódus scopeján belül) ez a változó egy referencia ami a heapen lévő objektumra mutat.
Kösz, hogy leírtad azt, amit már ~12 éve írogatok: hogy az int-nek nem őse az object. Object NEM lehet a veremben(ott csak a referenciája lehet(a stack meg csak az érték típusok memóriája.
Legalább van 1 valaki, aki ezt írja. Jól esik!
Egyébként tudod, hogy melyik alapozó könyvben vannak leírva így részletezve ezek a dolgok? Mert én ilyent sajnos nem tudok. Mert én a legjobb ms vs c# könyvnek ezt tartom.. De még abban sincsenek ezek ilyen részletességgel leírva. Ezért is zártak ki 3 topikból is, mert én le mertem írni az igazat... Ők meg könyvben nem olvasták.Az összes struct a System.ValueTypeból származik, aminek az őse az object.
-
Alexios
veterán
a var kulcsszóval deklarált változód a stacken van (a futó metódus scopeján belül) ez a változó egy referencia ami a heapen lévő objektumra mutat.
Kösz, hogy leírtad azt, amit már ~12 éve írogatok: hogy az int-nek nem őse az object. Object NEM lehet a veremben(ott csak a referenciája lehet(a stack meg csak az érték típusok memóriája.
Legalább van 1 valaki, aki ezt írja. Jól esik!
Egyébként tudod, hogy melyik alapozó könyvben vannak leírva így részletezve ezek a dolgok? Mert én ilyent sajnos nem tudok. Mert én a legjobb ms vs c# könyvnek ezt tartom.. De még abban sincsenek ezek ilyen részletességgel leírva. Ezért is zártak ki 3 topikból is, mert én le mertem írni az igazat... Ők meg könyvben nem olvasták.Biztos ezért zártak ki

Már linkeltem amúgy neked a hivatalos language specet persze leírtad hogy ők sem tudják miről van szó [link] All struct types implicitly inherit from the classSystem.ValueType, which, in turn, inherits from classobject.
Tudom hogy úgysem hiszed el, de azért futtasd le ezt a kódot is és nézd meg az outputot, gondolom a nyelv maga se tudja miről beszél:int x = 1;Console.WriteLine(x is object); -
pmonitor
aktív tag
Valami alapozó könyvet kellene olvasnod, hogy helyére kerüljenek a dolgok.
A "new" utasítással példányosítottál egy osztályt, az objektum a (heap) memóriában jött létre, a var kulcsszóval deklarált változód a stacken van (a futó metódus scopeján belül) ez a változó egy referencia ami a heapen lévő objektumra mutat. A referencián keresztül tudod elérni és használni a heapen lévő objektumodat.A var -ral deklarált változód típusa már kódszerkesztési időben ismert a fejlesztőkörnyezet számára. Ha a fejlesztőkörnyezet nem tudja a típust eldönteni, akkor be fogja azt a kódrészt pirosítani.
A var csak arra van, hogy neked kényelmesebb legyen, ne kelljen a hosszú típusnevet kiírni, illetve refaktorálásnál is előnyös lehet.var myObject = new MyClass(); esetén a myObject típusa "MyClass típusú referencia";
a var kulcsszóval deklarált változód a stacken van (a futó metódus scopeján belül) ez a változó egy referencia ami a heapen lévő objektumra mutat.
Kösz, hogy leírtad azt, amit már ~12 éve írogatok: hogy az int-nek nem őse az object. Object NEM lehet a veremben(ott csak a referenciája lehet(a stack meg csak az érték típusok memóriája.
Legalább van 1 valaki, aki ezt írja. Jól esik!
Egyébként tudod, hogy melyik alapozó könyvben vannak leírva így részletezve ezek a dolgok? Mert én ilyent sajnos nem tudok. Mert én a legjobb ms vs c# könyvnek ezt tartom.. De még abban sincsenek ezek ilyen részletességgel leírva. Ezért is zártak ki 3 topikból is, mert én le mertem írni az igazat... Ők meg könyvben nem olvasták. -
joysefke
veterán
Valami alapozó könyvet kellene olvasnod, hogy helyére kerüljenek a dolgok.
A "new" utasítással példányosítottál egy osztályt, az objektum a (heap) memóriában jött létre, a var kulcsszóval deklarált változód a stacken van (a futó metódus scopeján belül) ez a változó egy referencia ami a heapen lévő objektumra mutat. A referencián keresztül tudod elérni és használni a heapen lévő objektumodat.A var -ral deklarált változód típusa már kódszerkesztési időben ismert a fejlesztőkörnyezet számára. Ha a fejlesztőkörnyezet nem tudja a típust eldönteni, akkor be fogja azt a kódrészt pirosítani.
A var csak arra van, hogy neked kényelmesebb legyen, ne kelljen a hosszú típusnevet kiírni, illetve refaktorálásnál is előnyös lehet.var myObject = new MyClass(); esetén a myObject típusa "MyClass típusú referencia";
-
Tomi_78
aktív tag
Fordítsuk meg a kérdést és gondold át mit kéne csináljon a program akkor ha olyan ágba kerülsz ahol nem inicializálod majd később hivatkozol rá. Vagy adsz egy default értéket (pl az if/switch blokkok előtt, int valtozo =1; ), vagy minden lehetséges úton inicializálni kell ha később hivatkozol rá.
Az utóbbinál amúgy az a baja hogy ha var-t használsz akkor egyből inicializálni kell, mert a compiler nem tudja hogy mi az. A switchen belül pl az egyik ágban számot, másikban szöveget adnál neki, honnan tudja melyik a helyes? Ez egy erősen típusos nyelv, nem lehet egy változó egyszerre több típus, tehát vagy megmondod az elején hogy milyen típus lesz és később is tudod inicializálni, vagy használod a var kulcsszot és egyből értéket adsz neki hogy tudja milyen típus kell legyen.
Rendben, köszi a választ!
Egyébként ami a var kulcsszóval van megadva változó, az nálam egy saját osztálynak a new utasítással létrehozott példánya. Ez milyen típust jelent? -
Alexios
veterán
Hát igen, furcsa egy kicsit nekem a változókezelés, de azért csak kapisgálom, hogy C#-ban a blokkon vagy névtéren belül létrehozott változók csak ott érvényesek.
De pl. az miért van, hogy ha megadok egy változót és ugyanazt if feltétel elágazásaiban használnám fel, akkor rendellenesen viselkedik tőle a programom?
Akkor ezt így nem lehet?
int valtozo;
if (...) {
valtozo = ...;
(...)
}
(... még pár ugyanilyen if ág ...)
if (...) {
valtozo = ...;
(...)
}
Tehát minden ághoz külön változónevet adjak meg? Ez kissé pazarlónak tűnik a változónevekkel.
És ugyanezt tapasztaltam switch elágazásnál is:
var valtozo;
switch (...) {
case 0: valtozo = ...;
break;
case 1: valtozo = ...;
break;
}
Hibaüzenet ez utóbbinál: Az implicit típusmeghatározású lokális változókat inicializálni kell.Fordítsuk meg a kérdést és gondold át mit kéne csináljon a program akkor ha olyan ágba kerülsz ahol nem inicializálod majd később hivatkozol rá. Vagy adsz egy default értéket (pl az if/switch blokkok előtt, int valtozo =1; ), vagy minden lehetséges úton inicializálni kell ha később hivatkozol rá.
Az utóbbinál amúgy az a baja hogy ha var-t használsz akkor egyből inicializálni kell, mert a compiler nem tudja hogy mi az. A switchen belül pl az egyik ágban számot, másikban szöveget adnál neki, honnan tudja melyik a helyes? Ez egy erősen típusos nyelv, nem lehet egy változó egyszerre több típus, tehát vagy megmondod az elején hogy milyen típus lesz és később is tudod inicializálni, vagy használod a var kulcsszot és egyből értéket adsz neki hogy tudja milyen típus kell legyen.
-
Tomi_78
aktív tag
Hát igen, furcsa egy kicsit nekem a változókezelés, de azért csak kapisgálom, hogy C#-ban a blokkon vagy névtéren belül létrehozott változók csak ott érvényesek.
De pl. az miért van, hogy ha megadok egy változót és ugyanazt if feltétel elágazásaiban használnám fel, akkor rendellenesen viselkedik tőle a programom?
Akkor ezt így nem lehet?
int valtozo;
if (...) {
valtozo = ...;
(...)
}
(... még pár ugyanilyen if ág ...)
if (...) {
valtozo = ...;
(...)
}
Tehát minden ághoz külön változónevet adjak meg? Ez kissé pazarlónak tűnik a változónevekkel.
És ugyanezt tapasztaltam switch elágazásnál is:
var valtozo;
switch (...) {
case 0: valtozo = ...;
break;
case 1: valtozo = ...;
break;
}
Hibaüzenet ez utóbbinál: Az implicit típusmeghatározású lokális változókat inicializálni kell. -
pmonitor
aktív tag
Tanácsaitok alapján végül így hibaüzenetek nélkül működni kezdett a programom:
int[,] palya = null;
switch (mostpalya) {
case 1:
palya = new int[,]{{0,0,0,0,0,0,0,0,0,0},
Akkor ezek szerint az első és legfőbb deklarálási helyen már értéket kell adni neki, még ha ez null is, illetve az utána következő, értékekkel történő feltöltés helyén használni kell a new int[,]-et?Csak azért írtam, hogy addig olvasgasd dqdb posztját, mert a posztodból egyértelműen látszik, hogy nem értetted meg.
ezek szerint az első és legfőbb deklarálási helyen már értéket kell adni neki, még ha ez null is,
Ez rossz konzekvencia. Ugyanis abban az esetben, ha minden kódúton inicializálod a változót, akkor nem kell még null-t sem adni a deklarálás helyén. Tehát ez is jó:
int[,] palya;
switch (mostpalya)
{
case 1:
palya = new int[,] {{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{2,0,0,0,1,0,0,0,0,2},
};
break;
default:
palya = new int[,] {{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{2,0,0,0,1,0,0,0,0,2},
};
break;
}Itt a default ág miatt mindenképpen inicializálva van annak ellenére, hogy deklaráláskor nem adtam neki null-t.
-
pmonitor
aktív tag
Tanácsaitok alapján végül így hibaüzenetek nélkül működni kezdett a programom:
int[,] palya = null;
switch (mostpalya) {
case 1:
palya = new int[,]{{0,0,0,0,0,0,0,0,0,0},
Akkor ezek szerint az első és legfőbb deklarálási helyen már értéket kell adni neki, még ha ez null is, illetve az utána következő, értékekkel történő feltöltés helyén használni kell a new int[,]-et?Amit dqdb írt, azt olvasd el és értelmezd, amíg meg nem érted...
-
Tomi_78
aktív tag
Tanácsaitok alapján végül így hibaüzenetek nélkül működni kezdett a programom:
int[,] palya = null;
switch (mostpalya) {
case 1:
palya = new int[,]{{0,0,0,0,0,0,0,0,0,0},
Akkor ezek szerint az első és legfőbb deklarálási helyen már értéket kell adni neki, még ha ez null is, illetve az utána következő, értékekkel történő feltöltés helyén használni kell a new int[,]-et? -
dqdb
nagyúr
másold be az egész releváns kódrészletet, pusztán hibaüzenetből nehéz látni mi a gond

De ennek így jónak kéne lennie:
int[,] palya;switch (mostpalya) {case 1:palya = new int[,]{{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0},{2,0,0,0,1,0,0,0,0,2},};break;}A hibaüzenet alapján az lesz a probléma, hogy nem inicializálja minden kódúton a változót, és használná. Az
int[,] palya = nullmegoldja a fordítási hibát, de az ellenőrzéseket persze bele kell tenni a kódba. -
Alexios
veterán
Sajnos nem, mert azt írja ki, hogy:
Inicializálatlan „palya” lokális változó használata (CS0165)Pedig egyszer már deklarálva van, csak éppen a switch() névtéren kívül, az előtt.
De nekem az kéne, hogy deklarálom egyszer a MainFormLoad() elején, és azon belül felhasználható legyen akármilyen belső szerkezetben.másold be az egész releváns kódrészletet, pusztán hibaüzenetből nehéz látni mi a gond

De ennek így jónak kéne lennie:
int[,] palya;switch (mostpalya) {case 1:palya = new int[,]{{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0},{2,0,0,0,1,0,0,0,0,2},};break;} -
Tomi_78
aktív tag
Sajnos nem, mert azt írja ki, hogy:
Inicializálatlan „palya” lokális változó használata (CS0165)Pedig egyszer már deklarálva van, csak éppen a switch() névtéren kívül, az előtt.
De nekem az kéne, hogy deklarálom egyszer a MainFormLoad() elején, és azon belül felhasználható legyen akármilyen belső szerkezetben. -
joysefke
veterán
gondolom nem tetszik neki a tömbinicializálás szintaxisa ami utánna van.
ezt elfogadja?palya = new int[,]{{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0},...} -
Tomi_78
aktív tag
-
joysefke
veterán
Még egy kérdés: ha egy 2d tömböt deklarálok, de később, más névtéren belül inicializálnám, azt hogyan kell megtenni? Mert ez most hibás; azt írja, hogy: "Itt azonosítónak kellene szerepelnie."
void MainFormLoad(object sender, EventArgs e)
{
int[,] palya;
switch (mostpalya) {
case 1:
palya[,] = {{0,0,0,0,0,0,0,0,0,0},//Ennél írja a hibát!
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{2,0,0,0,1,0,0,0,0,2},
};
break;
}}töröld ezt: palya
[,] -
Tomi_78
aktív tag
Még egy kérdés: ha egy 2d tömböt deklarálok, de később, más névtéren belül inicializálnám, azt hogyan kell megtenni? Mert ez most hibás; azt írja, hogy: "Itt azonosítónak kellene szerepelnie."
void MainFormLoad(object sender, EventArgs e)
{
int[,] palya;
switch (mostpalya) {
case 1:
palya[,] = {{0,0,0,0,0,0,0,0,0,0},//Ennél írja a hibát!
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{2,0,0,0,1,0,0,0,0,2},
};
break;
}} -
Tomi_78
aktív tag
Nem kell itt próbálkozni, ott van a
Screen.PrimaryScreen.WorkingArea, azt kell beállítani az ablak pozíciójának, ha az első képernyőd akarod megjeleníteni, és ekkor a tálca nélküli teljes képernyőméretet kihasználod.A te megoldásod elvi szinten bukik el, mert az, hogy a tálca teteje, az esetek egy részében értelmezhető fogalom csak. A tálcát lehet balra, jobbra és felülre dokkolni, emellett el lehet rejteni automatikusan, több monitornál simán lehet, hogy csak az elsődleges monitoron van tálca, a többin nem, stb.
Screen.PrimaryScreen.WorkingArea.Height-(Screen.PrimaryScreen.WorkingArea.Height-ClientSize.Height)
Egyszerűsítsük kicsit a képletet:Screen.PrimaryScreen.WorkingArea.Height - (Screen.PrimaryScreen.WorkingArea.Height - ClientSize.Height) =Screen.PrimaryScreen.WorkingArea.Height - Screen.PrimaryScreen.WorkingArea.Height + ClientSize.Height =ClientSize.HeightEz csak abban az esetben adja meg a tálca tetejének helyét, ha
1. a Windowsban a tálca alulra van beállítva
2. az ablak maximalizálva van
3. az ablaknál aFormBorderStyle = FormBorderStyle.Nonevan beállítva és nincsen menüÉrtem már.
És arra van mód, hogy lekérdezzem a menüsor magasságméretét (ami most nálam 24 képpont, de ezt is az egér Y helyzetéből tudtam kikövetkeztetni)? Mert most a WorkingArea teteje (Top) 0-nál van, de mindig beleszámítja a fenti menüsort is, ami nekem nem kell.
Vagy csakis az a megoldás, hogy eltüntetek mindenféle menüsort aFormBorderStyle = FormBorderStyle.None
paranccsal? -
dqdb
nagyúr
Köszönöm a választ, Dqdb!
Ez alapján elindulva a Tálca tetejét a következő kóddarabbal találtam meg (remélhetőleg):Screen.PrimaryScreen.WorkingArea.Height-(Screen.PrimaryScreen.WorkingArea.Height-ClientSize.Height)Remélem, ez különféle felbontások és méretezések esetén is megfelelően működik majd, de ezt csak próbálgatások után tudom megállapítani.Nem kell itt próbálkozni, ott van a
Screen.PrimaryScreen.WorkingArea, azt kell beállítani az ablak pozíciójának, ha az első képernyőd akarod megjeleníteni, és ekkor a tálca nélküli teljes képernyőméretet kihasználod.A te megoldásod elvi szinten bukik el, mert az, hogy a tálca teteje, az esetek egy részében értelmezhető fogalom csak. A tálcát lehet balra, jobbra és felülre dokkolni, emellett el lehet rejteni automatikusan, több monitornál simán lehet, hogy csak az elsődleges monitoron van tálca, a többin nem, stb.
Screen.PrimaryScreen.WorkingArea.Height-(Screen.PrimaryScreen.WorkingArea.Height-ClientSize.Height)
Egyszerűsítsük kicsit a képletet:Screen.PrimaryScreen.WorkingArea.Height - (Screen.PrimaryScreen.WorkingArea.Height - ClientSize.Height) =Screen.PrimaryScreen.WorkingArea.Height - Screen.PrimaryScreen.WorkingArea.Height + ClientSize.Height =ClientSize.HeightEz csak abban az esetben adja meg a tálca tetejének helyét, ha
1. a Windowsban a tálca alulra van beállítva
2. az ablak maximalizálva van
3. az ablaknál aFormBorderStyle = FormBorderStyle.Nonevan beállítva és nincsen menü -
Tomi_78
aktív tag
És az miért van, hogy így számítom ki az értékeket:
kepernyomag=Screen.PrimaryScreen.Bounds.Height;
talcamag=kepernyomag-Screen.PrimaryScreen.WorkingArea.Height;
cimsormag=Screen.PrimaryScreen.WorkingArea.Height-ClientSize.Height;
és ha a MainFormPaint-ben a DrawString-gel kiíratom, akkor kb. 40-nel eltérnek az értékek egymástól, ha a DrawString-ben a fenti változók szerepelnek attól, mintha változók helyett a konkrét számítást tenném be, ToString()-gel a végén?
Tehát a DrawString(kepernyomag+"-"+talcamag...)
nem ugyanazt adja, mint a
DrawString(Screen.PrimaryScreen.Bounds.Height.ToString()...stb. -
Tomi_78
aktív tag
1. Miért 864 képpont nálam C#-ban a képernyőmagasság 1080 helyett?
Mert Windowsban 125%-ra állítottad a scalinget, az alkalmazásod pedig nem jelzi, hogy high DPI támogatással bír, így a Windows a tényleges helyett a scalinggel korrigált virtuális értéket adja át neked2. Hogyan kaphatom meg csak a hasznos területet a képernyőből, tehát a Tálca és a felső menüsor magassága nélküli értéket?
A felső menüsor, az ablakfejléc és a keret az alkalmazás saját felségterülete, azzal azt kezd, amit akar, azok az ablakméreten belül vannak. A tálca nélküli téglalapot aScreen.WorkingAreapropertyben találod.Egy ablak két része szedhető szét: client area, ami a hasznos felülete (a lenti képen pirossal jelezve) és a non-client area, ahová a körítés (fejléc, menü, keret) kerülnek. A hasznos területet a Control.ClientRectangle propertyvel tudod lekérdezni, ez azt a téglalapot adja vissza, ami az ablakod szabadon használható területe.
Érdemes megjegyezni, hogy több monitor esetében mind a DPI, mind a tálca mérete, mind a rendelkezésre álló terület eltérhet, és az alkalmazásodat monitorok között dobálva ez indítás után bármikor bekövetkezhet, szóval érdemes a változásokról érkező eseményeket lekezelni.
Köszönöm a választ, Dqdb!
Ez alapján elindulva a Tálca tetejét a következő kóddarabbal találtam meg (remélhetőleg):Screen.PrimaryScreen.WorkingArea.Height-(Screen.PrimaryScreen.WorkingArea.Height-ClientSize.Height)Remélem, ez különféle felbontások és méretezések esetén is megfelelően működik majd, de ezt csak próbálgatások után tudom megállapítani. -
dqdb
nagyúr
Sziasztok!
Kis programomat teljes képernyős módban futtatom az alábbi kóddarab segítségével:
InitializeComponent();Viszont lent a Windows 10 tálcája belóg a programablakba, így van úgy, hogy a grafikai elemeket is takarja, ha éppen oda helyeződnek. Kerestem a Google-lal arra, hogy hogyan lehetne eltüntetni a Tálcát C#-ban, de nem találtam semmit ezzel kapcsolatban. Aztán most próbálom megnézni, hogy mennyi a képernyőfelbontás magassága, hogy abból kivonva valami értéket megkapjam a Tálca nélküli részt, de nem találok ilyen felbontásérték visszaadó függvényt, utasítást.
WindowState = FormWindowState.Maximized;
Size=new Size(Screen.PrimaryScreen.WorkingArea.Width,Screen.PrimaryScreen.WorkingArea.Height);
Az is érdekes, hogy a Windows-ban megnézve a képernyőfelbontást, az 1920*1080, tehát 1080 képpont a magasság, viszont a C#-ot sehogysem bírom rávenni ezen érték kiírására, mert mindig 864-et mutat valamiért, mikor az egér Y koordinátáját kérdezem le, és a képernyő alján van, vagy így:e.Graphics.DrawString("Egér Yhely: "+Cursor.Position.Y+"-"+Screen.PrimaryScreen.Bounds.Height.ToString(),this.Font,new SolidBrush(Color.Black),2,2);Valaki el tudná magyarázni nekem erre a megoldást? Tehát:
1. Miért 864 képpont nálam C#-ban a képernyőmagasság 1080 helyett?
2. Hogyan kaphatom meg csak a hasznos területet a képernyőből, tehát a Tálca és a felső menüsor magassága nélküli értéket?1. Miért 864 képpont nálam C#-ban a képernyőmagasság 1080 helyett?
Mert Windowsban 125%-ra állítottad a scalinget, az alkalmazásod pedig nem jelzi, hogy high DPI támogatással bír, így a Windows a tényleges helyett a scalinggel korrigált virtuális értéket adja át neked2. Hogyan kaphatom meg csak a hasznos területet a képernyőből, tehát a Tálca és a felső menüsor magassága nélküli értéket?
A felső menüsor, az ablakfejléc és a keret az alkalmazás saját felségterülete, azzal azt kezd, amit akar, azok az ablakméreten belül vannak. A tálca nélküli téglalapot aScreen.WorkingAreapropertyben találod.Egy ablak két része szedhető szét: client area, ami a hasznos felülete (a lenti képen pirossal jelezve) és a non-client area, ahová a körítés (fejléc, menü, keret) kerülnek. A hasznos területet a Control.ClientRectangle propertyvel tudod lekérdezni, ez azt a téglalapot adja vissza, ami az ablakod szabadon használható területe.
Érdemes megjegyezni, hogy több monitor esetében mind a DPI, mind a tálca mérete, mind a rendelkezésre álló terület eltérhet, és az alkalmazásodat monitorok között dobálva ez indítás után bármikor bekövetkezhet, szóval érdemes a változásokról érkező eseményeket lekezelni.
-
Tomi_78
aktív tag
Sziasztok!
Kis programomat teljes képernyős módban futtatom az alábbi kóddarab segítségével:
InitializeComponent();Viszont lent a Windows 10 tálcája belóg a programablakba, így van úgy, hogy a grafikai elemeket is takarja, ha éppen oda helyeződnek. Kerestem a Google-lal arra, hogy hogyan lehetne eltüntetni a Tálcát C#-ban, de nem találtam semmit ezzel kapcsolatban. Aztán most próbálom megnézni, hogy mennyi a képernyőfelbontás magassága, hogy abból kivonva valami értéket megkapjam a Tálca nélküli részt, de nem találok ilyen felbontásérték visszaadó függvényt, utasítást.
WindowState = FormWindowState.Maximized;
Size=new Size(Screen.PrimaryScreen.WorkingArea.Width,Screen.PrimaryScreen.WorkingArea.Height);
Az is érdekes, hogy a Windows-ban megnézve a képernyőfelbontást, az 1920*1080, tehát 1080 képpont a magasság, viszont a C#-ot sehogysem bírom rávenni ezen érték kiírására, mert mindig 864-et mutat valamiért, mikor az egér Y koordinátáját kérdezem le, és a képernyő alján van, vagy így:e.Graphics.DrawString("Egér Yhely: "+Cursor.Position.Y+"-"+Screen.PrimaryScreen.Bounds.Height.ToString(),this.Font,new SolidBrush(Color.Black),2,2);Valaki el tudná magyarázni nekem erre a megoldást? Tehát:
1. Miért 864 képpont nálam C#-ban a képernyőmagasság 1080 helyett?
2. Hogyan kaphatom meg csak a hasznos területet a képernyőből, tehát a Tálca és a felső menüsor magassága nélküli értéket? -
Tomi_78
aktív tag
Sziasztok!
Egyedi képeket már tudok kezelni (betölteni és megjeleníteni) a C#-pal, de jó volna tudnom kezelni képcsíkokat.
Van erre lehetőség és ha igen, hogyan, milyen utasítás alkalmas arra, hogy egy nagy képből kinyerjem annak alképeit és hozzárendeljem egy bitmap-hoz? -
Tomi_78
aktív tag
-
sztanozs
veterán
Úgy látszik, a WindowState nem állítja át az ablak Width és Height értékeit - legalábbis ha ezt a kódot alkalmazom és kiíratom az ablszel és ablmag változók értékeit, azok még mindig a 800*600-at mutatják, amik az InitializeComponent()-ben is be vannak állítva:
InitializeComponent();
WindowState = FormWindowState.Maximized;
Size = new Size(Width,Height);
ablszel=Size.Width;
ablmag=Size.Height;Milyen .NET verziora forditod a kodot?
-
Tomi_78
aktív tag
Úgy látszik, a WindowState nem állítja át az ablak Width és Height értékeit - legalábbis ha ezt a kódot alkalmazom és kiíratom az ablszel és ablmag változók értékeit, azok még mindig a 800*600-at mutatják, amik az InitializeComponent()-ben is be vannak állítva:
InitializeComponent();
WindowState = FormWindowState.Maximized;
Size = new Size(Width,Height);
ablszel=Size.Width;
ablmag=Size.Height; -
sztanozs
veterán
És az miért van, hogy ha én maximumra állítom a játéktér ablakméretét, akkor induláskor a játékelemek az eredeti, 800*600-as beállításhoz alkalmazzák a koordinátáikat?
Tehát az alábbi kód beállítja ugyan a képernyő kitöltésére a pályát, de ha pl. az a_jatekos példány lekérdezi magának induláskor a Width és Height koordinátákat, azok mintha még mindig 800 és 600 lennének, holott nálam 1600*900-nak kellene lenniük (kiírva is annyi), de mégis a közép elhelyezés helyett balra fel kerül a játékelem:InitializeComponent();
WindowState = FormWindowState.Maximized;
Size = new Size(Width,Height);a_jatekos = new Jatekos();
a_jatekos.kepe = jaturhajokepe1;
a_jatekos.xhely = Width/2+a_jatekos.kepe.Width;
a_jatekos.yhely = Height-a_jatekos.kepe.Height*2;scoping problema lehet
-
quailstorm
félisten
És az miért van, hogy ha én maximumra állítom a játéktér ablakméretét, akkor induláskor a játékelemek az eredeti, 800*600-as beállításhoz alkalmazzák a koordinátáikat?
Tehát az alábbi kód beállítja ugyan a képernyő kitöltésére a pályát, de ha pl. az a_jatekos példány lekérdezi magának induláskor a Width és Height koordinátákat, azok mintha még mindig 800 és 600 lennének, holott nálam 1600*900-nak kellene lenniük (kiírva is annyi), de mégis a közép elhelyezés helyett balra fel kerül a játékelem:InitializeComponent();
WindowState = FormWindowState.Maximized;
Size = new Size(Width,Height);a_jatekos = new Jatekos();
a_jatekos.kepe = jaturhajokepe1;
a_jatekos.xhely = Width/2+a_jatekos.kepe.Width;
a_jatekos.yhely = Height-a_jatekos.kepe.Height*2;Valószínűleg letárolod máshol és nem frissíted be.
A Size legyen singleton vagy public static és mindenki abból kérdezze le az értéket. Amúgy meg az érték legyen feliratkozva valami WindowStateChanged eventre hogy mindig az aktuális érték legyen.
-
Tomi_78
aktív tag
És az miért van, hogy ha én maximumra állítom a játéktér ablakméretét, akkor induláskor a játékelemek az eredeti, 800*600-as beállításhoz alkalmazzák a koordinátáikat?
Tehát az alábbi kód beállítja ugyan a képernyő kitöltésére a pályát, de ha pl. az a_jatekos példány lekérdezi magának induláskor a Width és Height koordinátákat, azok mintha még mindig 800 és 600 lennének, holott nálam 1600*900-nak kellene lenniük (kiírva is annyi), de mégis a közép elhelyezés helyett balra fel kerül a játékelem:InitializeComponent();
WindowState = FormWindowState.Maximized;
Size = new Size(Width,Height);a_jatekos = new Jatekos();
a_jatekos.kepe = jaturhajokepe1;
a_jatekos.xhely = Width/2+a_jatekos.kepe.Width;
a_jatekos.yhely = Height-a_jatekos.kepe.Height*2; -
pmonitor
aktív tag
Akkor még egyszer utoljára leírom.
Az állítás nem az volt hogy mindegy melyiket használod _bármelyik_ esetben, hanem hogy _ebben_ az esetben mindegy volt, hiszen ezek ciklusok, nem típusokon lehet végigmenni velük, hanem gyűjteményeken. Az eredeti kérdező kérdése az volt hogy mire jó a foreach, továbbra is fenntartom, hogy az ő esetében az lett volna a lényeg hogy gyűjteményt csináljnon és menjen rajta végig(ahogy végülis meg is csinálta), ezt pedig bármivel megcsinálhatta, foreach/for/while _ebben_ az esetben mindegy, hiszen a gond nem a foreach-el magával volt hanem hogy amit ő szeretett volna abban a formában nem lehet.
Azt hogy mit lehet módosítani közben, vagy törölni, csak te hoztad ide, senki más nem vitatta, hiszen az állítás nem az volt hogy foreachben az aktuális itemet nem lehet megváltoztatni, hanem hogy az hogy pl. foreach(string a string) miért nem értelmes.while() és a for() egyébként csak megerőszakolva működik minden enumeratoron(de nyilván nem erre tervezték.
Ez egy teljesen mellékszál, de ez nem megerőszakolás, és annyira erre tervezték hogy a foreach egy syntactic sugar ahogy fatal is írta, azaz valójában build után ez while-al fog menni az enumeratoron. Ettől függetlenül te, én, stb, mint végfelhasználó nem így fogjuk írni, hiszen nyilván azért hozták létre a syntactic sugar-t hogy használjuk, de ettől még nem árt tisztában lenni a működésével, és azzal hogy ez nem megerőszakolás.
Illetve a mindegy nem mindegy részhez annyit, hogy _mindent_ amit foreach-el meg lehet írni, meg lehet for vagy while ciklussal(hiszen a foreach is egy fancy while ciklus), de fordítva ez már nem igaz, szóval fölösleges újabb példákat hozni rá, mert senki nem vitatja ezt.+1 a linkedről:
c#-ban mindennek van egy közös szülőtípusa, úgy hívják object
Most ha attól eltekintünk hogy tök nyilvánvaló kötekvés ha azt nézzük az eredeti kérdező kérdésének mi volt a lényege, ha jól értem erre a cáfolatod a struct akar lenni [link] itt a hivatalos msdn c# language spec doksi, ez egyértelműen írja hogy All struct types implicitly inherit from the classSystem.ValueType, which, in turn, inherits from classobject
Tehát minden struct implicit a System.ValueType-ból származik, az pedig az objectből. Ettől még nyilván van lényegi különbség a value és reference típusok között, nem kell cáfolaltot felhozni, ha ez nem tetszik a Microsoft-al vitatkozz, ők tervezték a nyelvet, és ez az ő reference dokumentumuk.a hivatalos msdn c# language spec doksi, ez egyértelműen írja hogy All struct types implicitly inherit from the class System.ValueType
1: És ha a hivatalos msdn doksi azt írja, hogy ugorj a kútba, akkor beleugrasz?
2: Szted. az érték típusoknak van referenciájuk? -
pmonitor
aktív tag
Akkor még egyszer utoljára leírom.
Az állítás nem az volt hogy mindegy melyiket használod _bármelyik_ esetben, hanem hogy _ebben_ az esetben mindegy volt, hiszen ezek ciklusok, nem típusokon lehet végigmenni velük, hanem gyűjteményeken. Az eredeti kérdező kérdése az volt hogy mire jó a foreach, továbbra is fenntartom, hogy az ő esetében az lett volna a lényeg hogy gyűjteményt csináljnon és menjen rajta végig(ahogy végülis meg is csinálta), ezt pedig bármivel megcsinálhatta, foreach/for/while _ebben_ az esetben mindegy, hiszen a gond nem a foreach-el magával volt hanem hogy amit ő szeretett volna abban a formában nem lehet.
Azt hogy mit lehet módosítani közben, vagy törölni, csak te hoztad ide, senki más nem vitatta, hiszen az állítás nem az volt hogy foreachben az aktuális itemet nem lehet megváltoztatni, hanem hogy az hogy pl. foreach(string a string) miért nem értelmes.while() és a for() egyébként csak megerőszakolva működik minden enumeratoron(de nyilván nem erre tervezték.
Ez egy teljesen mellékszál, de ez nem megerőszakolás, és annyira erre tervezték hogy a foreach egy syntactic sugar ahogy fatal is írta, azaz valójában build után ez while-al fog menni az enumeratoron. Ettől függetlenül te, én, stb, mint végfelhasználó nem így fogjuk írni, hiszen nyilván azért hozták létre a syntactic sugar-t hogy használjuk, de ettől még nem árt tisztában lenni a működésével, és azzal hogy ez nem megerőszakolás.
Illetve a mindegy nem mindegy részhez annyit, hogy _mindent_ amit foreach-el meg lehet írni, meg lehet for vagy while ciklussal(hiszen a foreach is egy fancy while ciklus), de fordítva ez már nem igaz, szóval fölösleges újabb példákat hozni rá, mert senki nem vitatja ezt.+1 a linkedről:
c#-ban mindennek van egy közös szülőtípusa, úgy hívják object
Most ha attól eltekintünk hogy tök nyilvánvaló kötekvés ha azt nézzük az eredeti kérdező kérdésének mi volt a lényege, ha jól értem erre a cáfolatod a struct akar lenni [link] itt a hivatalos msdn c# language spec doksi, ez egyértelműen írja hogy All struct types implicitly inherit from the classSystem.ValueType, which, in turn, inherits from classobject
Tehát minden struct implicit a System.ValueType-ból származik, az pedig az objectből. Ettől még nyilván van lényegi különbség a value és reference típusok között, nem kell cáfolaltot felhozni, ha ez nem tetszik a Microsoft-al vitatkozz, ők tervezték a nyelvet, és ez az ő reference dokumentumuk.Akkor már csak 1 kérdésem van: mi a bánatnak ennyiféle ciklus, ha tökmind1, hogy melyiket használjuk? Elég lenne a while(), 'oszt jó napot! Ennek ellenére van a while(), van a do..while, van a for(), és még ráadásul ott van ez a foreach() is. Minek?
-
Alexios
veterán
Itt részletezem. De nem értem, hogy kinek jutna eszébe végfelhasználóként while() ciklussal megvalósítani a foreach()-t? De a lényeg az, hogy nagyon nem mind1, hogy foreach, for, vagy while. A while() és a for() egyébként csak megerőszakolva működik minden enumeratoron(de nyilván nem erre tervezték. A foreach() minden enumeratoron működik, de iteráció közben nem módosítható. Erre azt mondani, hogy tökmind1, az barokkos túlzás!
Akkor még egyszer utoljára leírom.
Az állítás nem az volt hogy mindegy melyiket használod _bármelyik_ esetben, hanem hogy _ebben_ az esetben mindegy volt, hiszen ezek ciklusok, nem típusokon lehet végigmenni velük, hanem gyűjteményeken. Az eredeti kérdező kérdése az volt hogy mire jó a foreach, továbbra is fenntartom, hogy az ő esetében az lett volna a lényeg hogy gyűjteményt csináljnon és menjen rajta végig(ahogy végülis meg is csinálta), ezt pedig bármivel megcsinálhatta, foreach/for/while _ebben_ az esetben mindegy, hiszen a gond nem a foreach-el magával volt hanem hogy amit ő szeretett volna abban a formában nem lehet.
Azt hogy mit lehet módosítani közben, vagy törölni, csak te hoztad ide, senki más nem vitatta, hiszen az állítás nem az volt hogy foreachben az aktuális itemet nem lehet megváltoztatni, hanem hogy az hogy pl. foreach(string a string) miért nem értelmes.while() és a for() egyébként csak megerőszakolva működik minden enumeratoron(de nyilván nem erre tervezték.
Ez egy teljesen mellékszál, de ez nem megerőszakolás, és annyira erre tervezték hogy a foreach egy syntactic sugar ahogy fatal is írta, azaz valójában build után ez while-al fog menni az enumeratoron. Ettől függetlenül te, én, stb, mint végfelhasználó nem így fogjuk írni, hiszen nyilván azért hozták létre a syntactic sugar-t hogy használjuk, de ettől még nem árt tisztában lenni a működésével, és azzal hogy ez nem megerőszakolás.
Illetve a mindegy nem mindegy részhez annyit, hogy _mindent_ amit foreach-el meg lehet írni, meg lehet for vagy while ciklussal(hiszen a foreach is egy fancy while ciklus), de fordítva ez már nem igaz, szóval fölösleges újabb példákat hozni rá, mert senki nem vitatja ezt.+1 a linkedről:
c#-ban mindennek van egy közös szülőtípusa, úgy hívják object
Most ha attól eltekintünk hogy tök nyilvánvaló kötekvés ha azt nézzük az eredeti kérdező kérdésének mi volt a lényege, ha jól értem erre a cáfolatod a struct akar lenni [link] itt a hivatalos msdn c# language spec doksi, ez egyértelműen írja hogy All struct types implicitly inherit from the classSystem.ValueType, which, in turn, inherits from classobject
Tehát minden struct implicit a System.ValueType-ból származik, az pedig az objectből. Ettől még nyilván van lényegi különbség a value és reference típusok között, nem kell cáfolaltot felhozni, ha ez nem tetszik a Microsoft-al vitatkozz, ők tervezték a nyelvet, és ez az ő reference dokumentumuk. -
pmonitor
aktív tag
Itt részletezem. De nem értem, hogy kinek jutna eszébe végfelhasználóként while() ciklussal megvalósítani a foreach()-t? De a lényeg az, hogy nagyon nem mind1, hogy foreach, for, vagy while. A while() és a for() egyébként csak megerőszakolva működik minden enumeratoron(de nyilván nem erre tervezték. A foreach() minden enumeratoron működik, de iteráció közben nem módosítható. Erre azt mondani, hogy tökmind1, az barokkos túlzás!
-
Alexios
veterán
Tanácsaitok alapján végül egy List használatával oldottam meg a problémát, mégpedig így:
class JatekElemei
{
public int xhely,yhely;
}
List<JatekElemei> jatelemeilista = new List<JatekElemei>();
class Jatekos: JatekElemei
{
public Bitmap kepe;
public byte animidozito=5,lovesvsz;
};Jatekos a_jatekos;
class JatLovedekei: JatekElemei
{
public Bitmap kepe;
};
List<JatLovedekei> jatlovlista = new List<JatLovedekei>();
class Deneverek: JatekElemei
{
public int dirx,diry;
public Bitmap kepe;
public byte animidozito=5;
}List<Deneverek> deneverlista = new List<Deneverek>();Aztán minden példányt a létrehozásakor beleteszek ebbe a jatelemeilista listába, pl.:a_jatekos = new Jatekos();
(...)
jatelemeilista.Add(a_jatekos);S most már mehet rajta a foreach ciklus:foreach (var jatelem in jatelemeilista) {
jatelem.xhely=...
}
Nekem jónak tűnik így, de ha láttok benne valami hibát, írjátok meg okvetlenül.Jó lesz így már, nyilván kód szervezésre nem feltétlenül ez a legjobb, vagy nevezéktanra, de ha működik akkor működik. A lényeg az hogy valahogy nyilván kell tartanod ha valami konkrétan akarsz végigiterálni, aztán erre vannak különböző módok még, de kezdésnek elég lesz szerintem ez neked.
#10046 fatal` : Hagyd, átment a saját blogjára továbbra is csak a lényegi mondandót kiforgatva olyanokról vitatkozni amit senki nem mondott
-
Tomi_78
aktív tag
Még egy kérdés a tisztelt szakértőkhöz: van rá valamilyen mód C#-ban, hogy egyszerűen végigmenjek egy osztály tagjain? Mert most én kezdőként úgy próbálkoztam, hogy van egy fő osztály, amelyből minden más osztály származik a programban és foreach ciklussal próbálkozom elérni a tagokat - sikertelenül.
Tehát ez a mostani kódom:class JatekElemei{public int xhely,yhely;}class Jatekos: JatekElemei{public Bitmap kepe;public byte animidozito=5,lovesvsz; //alképváltó és lövésvisszaszámláló};class JatLovedekei: JatekElemei{public Bitmap kepe;};List<JatLovedekei> jatlovlista = new List<JatLovedekei>();byte jatlovdb = 0;class Deneverek: JatekElemei{public int dirx,diry;public Bitmap kepe;public byte animidozito=5;};És így próbálok végigmenni rajtuk az ablak átméretezésekor:void MainFormResize(object sender, EventArgs e)
{
foreach (JatekElemei jatelem in JatekElemei) {
jatelem.xhely*=Width/ablakszel;
jatelem.yhely*=Height/ablakmag;
}
ablakszel=Width;
ablakmag=Height;
}Erre kapom ezt a hibaüzenetet:
A(z) „Animacios.MainForm.JatekElemei” egy „típus” konstruktor, de „változó” konstruktorként használva. (CS0118)Most akkor mi hogyan van ebben a foreach-ben? Vagy ez nem is jó erre?Azért lenne jó valami hasonló megoldást találni, hogy amikor szükséges végigmenni valamiért a program összes elemén, el lehessen azt intézni egy ciklussal.Tanácsaitok alapján végül egy List használatával oldottam meg a problémát, mégpedig így:
class JatekElemei
{
public int xhely,yhely;
}
List<JatekElemei> jatelemeilista = new List<JatekElemei>();
class Jatekos: JatekElemei
{
public Bitmap kepe;
public byte animidozito=5,lovesvsz;
};Jatekos a_jatekos;
class JatLovedekei: JatekElemei
{
public Bitmap kepe;
};
List<JatLovedekei> jatlovlista = new List<JatLovedekei>();
class Deneverek: JatekElemei
{
public int dirx,diry;
public Bitmap kepe;
public byte animidozito=5;
}List<Deneverek> deneverlista = new List<Deneverek>();Aztán minden példányt a létrehozásakor beleteszek ebbe a jatelemeilista listába, pl.:a_jatekos = new Jatekos();
(...)
jatelemeilista.Add(a_jatekos);S most már mehet rajta a foreach ciklus:foreach (var jatelem in jatelemeilista) {
jatelem.xhely=...
}
Nekem jónak tűnik így, de ha láttok benne valami hibát, írjátok meg okvetlenül. -
fatal`
titán
Sok mindent meg lehet csinálni.
HashSet<TesztOsztaly> htesztosztalyok = new HashSet<TesztOsztaly>();
.......
HashSet<TesztOsztaly>.Enumerator enumerator = htesztosztalyok.GetEnumerator();Aztán használható úgy, ahogy írod. Csak kérdés, hogy a gyakorlatban mennyire gyakran alkalmazzák így. Sztem. kb. zéró. Meg ettől még nem lesz módosítható...
Hogy jön ide a módosítás? Senki nem beszélt erről.
Egyébként az objektumok módosíthatóak, a referenciájuk iteráció közben nyilván nem.
A foreach egyébként pont egy syntactic sugar az enumeratoron.
-
pmonitor
aktív tag
Nincs olyan amin foreach-el végig lehet menni, de while-al nem, fentebb mutattam is példát miért van ez így(mert pl. a foreach is egy while-ra fordul), a hashset sem kivétel ezalól(for-al is meg lehet természetesen csinálni, nem muszáj indexel elérni elemeket for cikluson belül is, mégha nem is célszerű). Az más kérdés persze megint, hogy magaddal vitatkozol.
Sok mindent meg lehet csinálni.
HashSet<TesztOsztaly> htesztosztalyok = new HashSet<TesztOsztaly>();
.......
HashSet<TesztOsztaly>.Enumerator enumerator = htesztosztalyok.GetEnumerator();Aztán használható úgy, ahogy írod. Csak kérdés, hogy a gyakorlatban mennyire gyakran alkalmazzák így. Sztem. kb. zéró. Meg ettől még nem lesz módosítható...
-
Alexios
veterán
Nincs olyan amin foreach-el végig lehet menni, de while-al nem, fentebb mutattam is példát miért van ez így(mert pl. a foreach is egy while-ra fordul), a hashset sem kivétel ezalól(for-al is meg lehet természetesen csinálni, nem muszáj indexel elérni elemeket for cikluson belül is, mégha nem is célszerű). Az más kérdés persze megint, hogy magaddal vitatkozol.
-
pmonitor
aktív tag
-
Alexios
veterán
-
pmonitor
aktív tag
Nézd már meg az eredeti kérdést, nem volt benne .Count, pont erről beszéltem hogy az nem egy gyűjtemény, hanem egy típus. A JatekElemei nem egy lista, tömb, akármi más volt, hanem egy osztály típus, max statikus countja lehetne technikailag, ami nincs. Ahogy ez is volt a kérdés hogy miért nem lehet végig menni foreachel rajta, és azért mert nem egy gyűjtemény. Ugyanúgy for és while-al se lehet vegigmenni rajta, mert nem egy gyűjtemény, de még csak nem is egy peldanyositott akármi
De a for és a while indexekkel operál, amíg a foreach gyűjtemény elemein. Nagyon nem mind1!
-
Alexios
veterán
Ha már ennyire magyarázod, hogy mind1, akkor azt sem kell elfelejteni, hogy for-ról és while-ról szó sem volt a kérdésben. Azt csak te képzelted bele. De ha már beleképzeled, akkor nézzük:
A kérdés nem úgy merülne fel, hogy for(típus), hanem úgy, hogy for(int i; i<típusok.Count;......
Na meg nem úgy, hogy while(típus), hanem hogy while(i<típusok.Count)....Nézd már meg az eredeti kérdést, nem volt benne .Count, pont erről beszéltem hogy az nem egy gyűjtemény, hanem egy típus. A JatekElemei nem egy lista, tömb, akármi más volt, hanem egy osztály típus, max statikus countja lehetne technikailag, ami nincs. Ahogy ez is volt a kérdés hogy miért nem lehet végig menni foreachel rajta, és azért mert nem egy gyűjtemény. Ugyanúgy for és while-al se lehet vegigmenni rajta, mert nem egy gyűjtemény, de még csak nem is egy peldanyositott akármi
-
pmonitor
aktív tag
De tökmindegy, hiszen arról volt szó hogy az esetben _mindegy_ melyikkel iterálna végig rajta, egy gyűjteményen(vagy enumeratoron, mielőtt ebbe köt valaki) kell és nem egy típuson. Ebből a szempontból teljsen mindegy hogy for, while, foreach, mert a kérdés nem ez volt, hanem az hogy lehetséges-e ilyen:
foreach(tipus objnev tipus){}
ami ugye nem. Ilyen szempontból tökmindegy, mert ilyet sem lehet hogy while(tipus) meg olyat sem hogy for(tipus), mert értelmezhetetlen ebbe a formában, hiszen ez nem egy gyűjtemény. Az állítás nem az volt hogy mindig mindegy melyiket használod, hanem ebben az esetben az.Ha már ennyire magyarázod, hogy mind1, akkor azt sem kell elfelejteni, hogy for-ról és while-ról szó sem volt a kérdésben. Azt csak te képzelted bele. De ha már beleképzeled, akkor nézzük:
A kérdés nem úgy merülne fel, hogy for(típus), hanem úgy, hogy for(int i; i<típusok.Count;......
Na meg nem úgy, hogy while(típus), hanem hogy while(i<típusok.Count).... -
Alexios
veterán
De tökmindegy, hiszen arról volt szó hogy az esetben _mindegy_ melyikkel iterálna végig rajta, egy gyűjteményen(vagy enumeratoron, mielőtt ebbe köt valaki) kell és nem egy típuson. Ebből a szempontból teljsen mindegy hogy for, while, foreach, mert a kérdés nem ez volt, hanem az hogy lehetséges-e ilyen:
foreach(tipus objnev tipus){}
ami ugye nem. Ilyen szempontból tökmindegy, mert ilyet sem lehet hogy while(tipus) meg olyat sem hogy for(tipus), mert értelmezhetetlen ebbe a formában, hiszen ez nem egy gyűjtemény. Az állítás nem az volt hogy mindig mindegy melyiket használod, hanem ebben az esetben az. -
pmonitor
aktív tag
Ha el is olvasod az egész mondatot amit írtam beszéljünk.
Ha már nagyon kötekvés akkor meg lehet nézni mit is csinál egy foreach:int number;while (enumerator.MoveNext()) { number = enumerator.Current; }Innen tök érthető hogy miért nem lehet megváltoztatni, csak hát sosem mondtam hogy meg lehet, sőt, teljesen másról beszéltem.
Az egész mondat így hangzik:
Igen. Foreachel, de igazából, while, for, tökmindegy mivel gyűjteményeken iterálsz végig, nem típuson.
Erre írtam, hogy nem tökmind1.
-
Alexios
veterán
Ha el is olvasod az egész mondatot amit írtam beszéljünk.
Ha már nagyon kötekvés akkor meg lehet nézni mit is csinál egy foreach:int number;while (enumerator.MoveNext()) { number = enumerator.Current; }Innen tök érthető hogy miért nem lehet megváltoztatni, csak hát sosem mondtam hogy meg lehet, sőt, teljesen másról beszéltem.
-
pmonitor
aktív tag
Így talán érthetőbb:
foreach (var item in tesztosztalyok)
{
if (item.X == 2) item = new TesztOsztaly(6); //Invalid!!!
}Ezt sem engedi. De ezért nem tökmind1, hogy foreach-t, for-t, vagy while-t használsz. Mert for és while esetén mindkét művelet valid. Vagy szted. mind1?
-
fatal`
titán
-
Alexios
veterán
Ezt pláne nem értem,
using System.Collections.Generic;
namespace Teszt
{
class TesztOsztaly
{
public int X { get; set; }
public TesztOsztaly(int x)
{
X = x;
}
}
internal class Program
{
static void Main(string[] args)
{
List<TesztOsztaly> tesztosztalyok = new List<TesztOsztaly>();
tesztosztalyok.Add(new TesztOsztaly(1));
tesztosztalyok.Add(new TesztOsztaly(2));
tesztosztalyok.Add(new TesztOsztaly(3));
foreach (var item in tesztosztalyok)
{
if (item.X == 2) tesztosztalyok.Remove(item); //Invalid!!!
}
}
}
}Így már érted?
Nem tudom ennél érthetőbben leírni, sajnálom ha csak pár szavas kiragadásig sikerül eljutni, olvasd tovább a mondatot is, sőt azt is leírtam futólag hogy miért nem lehet módosítani a gyűjteményt később.
-
pmonitor
aktív tag
Most nem teljesen értem ebből a szempontból a kötekvést, be lehet hozni persze értéktípusokat, akkor 98%-ban minden az objectből jön, a lényeg hogy nem kell csinálni egy őstípust csak azért hogy legyen egy őstípus.
Nem tök mind1. Mert pl. foreach esetén nem módosíthatod magát az objektumot. Csak az objektum.akármi-t.
Ezt pláne nem értem, ha az egész mondatot olvasod és nem csak a részét kiragadva, akkor úgy folytatódik hogy mindegy mert gyűjteményeken mennek végig. Persze most bele lehet menni iterátorokba, stb, meg abba hogy ez se teljesen igaz így, hiszen ha valami yield return-el adja a cuccokat az biztos gyűjtemény-e, de emberünk nem tudja min lehet egy ciklussal végigmenni, nem gondolnám hogy ez itt releváns.Mert pl. foreach esetén nem módosíthatod magát az objektumot. Csak az objektum.akármi-t.
Ha már ennyire kötekedni akarunk, a gyűjteményt nem tudod módosítani, pont azért mert egy enumerátoron megy a foreachEzt pláne nem értem,
using System.Collections.Generic;
namespace Teszt
{
class TesztOsztaly
{
public int X { get; set; }
public TesztOsztaly(int x)
{
X = x;
}
}
internal class Program
{
static void Main(string[] args)
{
List<TesztOsztaly> tesztosztalyok = new List<TesztOsztaly>();
tesztosztalyok.Add(new TesztOsztaly(1));
tesztosztalyok.Add(new TesztOsztaly(2));
tesztosztalyok.Add(new TesztOsztaly(3));
foreach (var item in tesztosztalyok)
{
if (item.X == 2) tesztosztalyok.Remove(item); //Invalid!!!
}
}
}
}Így már érted?
-
Alexios
veterán
c#-ban mindennek van egy közös szülőtípusa, úgy hívják object
Kivéve, aminek nem az.

Foreachel, de igazából, while, for, tökmindegy
Nem tök mind1. Mert pl. foreach esetén nem módosíthatod magát az objektumot. Csak az objektum.akármi-t.
quailstorm:
Az osztály egy absztrakt fogalom, egy memóriaértelmezési térkép.
Innentől kezd érdekessé válni a történet. Lásd pl. itt.
Most nem teljesen értem ebből a szempontból a kötekvést, be lehet hozni persze értéktípusokat, akkor 98%-ban minden az objectből jön, a lényeg hogy nem kell csinálni egy őstípust csak azért hogy legyen egy őstípus.
Nem tök mind1. Mert pl. foreach esetén nem módosíthatod magát az objektumot. Csak az objektum.akármi-t.
Ezt pláne nem értem, ha az egész mondatot olvasod és nem csak a részét kiragadva, akkor úgy folytatódik hogy mindegy mert gyűjteményeken mennek végig. Persze most bele lehet menni iterátorokba, stb, meg abba hogy ez se teljesen igaz így, hiszen ha valami yield return-el adja a cuccokat az biztos gyűjtemény-e, de emberünk nem tudja min lehet egy ciklussal végigmenni, nem gondolnám hogy ez itt releváns.Mert pl. foreach esetén nem módosíthatod magát az objektumot. Csak az objektum.akármi-t.
Ha már ennyire kötekedni akarunk, a gyűjteményt nem tudod módosítani, pont azért mert egy enumerátoron megy a foreach -
pmonitor
aktív tag
Tehát ha mindennek van egy közös szülőobjektuma
Amúgy c#-ban mindennek van egy közös szülőtípusa, úgy hívják objectAkkor hozzak létre egy Listát is, amelybe belekerülnek az osztályobjektumok, és ennek a Listának a nevét adjam meg a foreach-ben az egyik JatekElemei helyett?
Igen. Foreachel, de igazából, while, for, tökmindegy mivel gyűjteményeken iterálsz végig, nem típuson.
lassanként elvész az egyszerűség, mert ezesetben ugyanúgy gondoskodni kell a Lista kezeléséről, amikor elemeket adok hozzá vagy törlök belőle.
De valakinek csak gondoskodni kell róla nem? Vagy nem teljesen értem az elképzelésed, honnan tudja az alkalmazás hogy min akarsz végigmenni, mi legyen benne vagy nem? Az hogy van egy szülőtípus az nem azt jelenti hogy ő tisztában van minden leszármazott példányáról, ez csak a típus meghatározásban segít neked.
#10026 quailstorm : igen, én is írtam hogy reflectionnel meg lehet csinálni, csak 90%-ban ha felmerül hogy reflectionnel menne, az egy rossz gondolat
Kezdőknél pedig 100%-ban rossz gondolat, kizárt hogy egy kezdőnek bármilyen szempontból _tényleg_ szüksége legyen rá. c#-ban mindennek van egy közös szülőtípusa, úgy hívják object
Kivéve, aminek nem az.

Foreachel, de igazából, while, for, tökmindegy
Nem tök mind1. Mert pl. foreach esetén nem módosíthatod magát az objektumot. Csak az objektum.akármi-t.
quailstorm:
Az osztály egy absztrakt fogalom, egy memóriaértelmezési térkép.
Innentől kezd érdekessé válni a történet. Lásd pl. itt.
-
Alexios
veterán
Quailstorm: Ron Penton: Kezdő C# játékprogramozás c. könyvéből tanulom most az alapokat, valamint a világhálóról böngészgetve.
Alexios: azt, hogy egy fő osztályból származik minden más osztály, azért csináltam, hogy megkönnyítsem a dolgom olyan esetekre, amikor a program összes elemén végig kell menni, pl. mentés esetére vagy ha az ablak átméretezésekor mindent új helyre kell rakni.
Tehát ha mindennek van egy közös szülőobjektuma, akkor elvileg elég lenne ezen végigmenni az eredmény eléréséhez. Azt gondoltam, ehhez elég egy foreach ciklus, bár azt is, hogy az nem lesz jó, hogy a JatekElemei kétszer szerepel benne, mert nem tudom, hogy osztályokat milyen változótípusként kell megadni - már ha egyáltalán lehet.
Akkor hozzak létre egy Listát is, amelybe belekerülnek az osztályobjektumok, és ennek a Listának a nevét adjam meg a foreach-ben az egyik JatekElemei helyett? Akkor így már lassanként elvész az egyszerűség, mert ezesetben ugyanúgy gondoskodni kell a Lista kezeléséről, amikor elemeket adok hozzá vagy törlök belőle.Tehát ha mindennek van egy közös szülőobjektuma
Amúgy c#-ban mindennek van egy közös szülőtípusa, úgy hívják objectAkkor hozzak létre egy Listát is, amelybe belekerülnek az osztályobjektumok, és ennek a Listának a nevét adjam meg a foreach-ben az egyik JatekElemei helyett?
Igen. Foreachel, de igazából, while, for, tökmindegy mivel gyűjteményeken iterálsz végig, nem típuson.
lassanként elvész az egyszerűség, mert ezesetben ugyanúgy gondoskodni kell a Lista kezeléséről, amikor elemeket adok hozzá vagy törlök belőle.
De valakinek csak gondoskodni kell róla nem? Vagy nem teljesen értem az elképzelésed, honnan tudja az alkalmazás hogy min akarsz végigmenni, mi legyen benne vagy nem? Az hogy van egy szülőtípus az nem azt jelenti hogy ő tisztában van minden leszármazott példányáról, ez csak a típus meghatározásban segít neked.
#10026 quailstorm : igen, én is írtam hogy reflectionnel meg lehet csinálni, csak 90%-ban ha felmerül hogy reflectionnel menne, az egy rossz gondolat
Kezdőknél pedig 100%-ban rossz gondolat, kizárt hogy egy kezdőnek bármilyen szempontból _tényleg_ szüksége legyen rá. -
quailstorm
félisten
Quailstorm: Ron Penton: Kezdő C# játékprogramozás c. könyvéből tanulom most az alapokat, valamint a világhálóról böngészgetve.
Alexios: azt, hogy egy fő osztályból származik minden más osztály, azért csináltam, hogy megkönnyítsem a dolgom olyan esetekre, amikor a program összes elemén végig kell menni, pl. mentés esetére vagy ha az ablak átméretezésekor mindent új helyre kell rakni.
Tehát ha mindennek van egy közös szülőobjektuma, akkor elvileg elég lenne ezen végigmenni az eredmény eléréséhez. Azt gondoltam, ehhez elég egy foreach ciklus, bár azt is, hogy az nem lesz jó, hogy a JatekElemei kétszer szerepel benne, mert nem tudom, hogy osztályokat milyen változótípusként kell megadni - már ha egyáltalán lehet.
Akkor hozzak létre egy Listát is, amelybe belekerülnek az osztályobjektumok, és ennek a Listának a nevét adjam meg a foreach-ben az egyik JatekElemei helyett? Akkor így már lassanként elvész az egyszerűség, mert ezesetben ugyanúgy gondoskodni kell a Lista kezeléséről, amikor elemeket adok hozzá vagy törlök belőle.Az osztály egy absztrakt fogalom, egy memóriaértelmezési térkép. Abból először példányokat kellene létrehozni hogy legyen mit foreachelni. A foreach nem típusokon tud iterálni hanem típuspéldányok felsorolásán.
Az általad említett könyvben benne van a C# és úgy egyáltalán a programozás elméleti alapjának összefoglalása, de nem a legérthetőbb és néhol pongyola. Inkább menj át a Ruzsinszki könyvön és utána csak a konkrét játékprogramozós részekkel folytasd.
-
Tomi_78
aktív tag
Quailstorm: Ron Penton: Kezdő C# játékprogramozás c. könyvéből tanulom most az alapokat, valamint a világhálóról böngészgetve.
Alexios: azt, hogy egy fő osztályból származik minden más osztály, azért csináltam, hogy megkönnyítsem a dolgom olyan esetekre, amikor a program összes elemén végig kell menni, pl. mentés esetére vagy ha az ablak átméretezésekor mindent új helyre kell rakni.
Tehát ha mindennek van egy közös szülőobjektuma, akkor elvileg elég lenne ezen végigmenni az eredmény eléréséhez. Azt gondoltam, ehhez elég egy foreach ciklus, bár azt is, hogy az nem lesz jó, hogy a JatekElemei kétszer szerepel benne, mert nem tudom, hogy osztályokat milyen változótípusként kell megadni - már ha egyáltalán lehet.
Akkor hozzak létre egy Listát is, amelybe belekerülnek az osztályobjektumok, és ennek a Listának a nevét adjam meg a foreach-ben az egyik JatekElemei helyett? Akkor így már lassanként elvész az egyszerűség, mert ezesetben ugyanúgy gondoskodni kell a Lista kezeléséről, amikor elemeket adok hozzá vagy törlök belőle. -
quailstorm
félisten
Még egy kérdés a tisztelt szakértőkhöz: van rá valamilyen mód C#-ban, hogy egyszerűen végigmenjek egy osztály tagjain? Mert most én kezdőként úgy próbálkoztam, hogy van egy fő osztály, amelyből minden más osztály származik a programban és foreach ciklussal próbálkozom elérni a tagokat - sikertelenül.
Tehát ez a mostani kódom:class JatekElemei{public int xhely,yhely;}class Jatekos: JatekElemei{public Bitmap kepe;public byte animidozito=5,lovesvsz; //alképváltó és lövésvisszaszámláló};class JatLovedekei: JatekElemei{public Bitmap kepe;};List<JatLovedekei> jatlovlista = new List<JatLovedekei>();byte jatlovdb = 0;class Deneverek: JatekElemei{public int dirx,diry;public Bitmap kepe;public byte animidozito=5;};És így próbálok végigmenni rajtuk az ablak átméretezésekor:void MainFormResize(object sender, EventArgs e)
{
foreach (JatekElemei jatelem in JatekElemei) {
jatelem.xhely*=Width/ablakszel;
jatelem.yhely*=Height/ablakmag;
}
ablakszel=Width;
ablakmag=Height;
}Erre kapom ezt a hibaüzenetet:
A(z) „Animacios.MainForm.JatekElemei” egy „típus” konstruktor, de „változó” konstruktorként használva. (CS0118)Most akkor mi hogyan van ebben a foreach-ben? Vagy ez nem is jó erre?Azért lenne jó valami hasonló megoldást találni, hogy amikor szükséges végigmenni valamiért a program összes elemén, el lehessen azt intézni egy ciklussal.Mi alapján tanulsz? Eddigi kommentjeidből úgy néz ki, hogy nem vagy birtokában stabil tudásnak, nem érted a fogalmakat és eszközöket amiket próbálsz használni, csak másolsz és csavarsz rajta valamit.
Mielőtt nekiállsz egy grafikus játéknak, legalább egy programozás könyvön rágd át magad.#10025 Alexios: amúgy ki lehet gyűjteni reflectionnel egy assemblyben egy adott típus összes implementációját. Pl. arra jó, hogy a tesztpluginunkba így elég egy új osztályt behajítani és a lefordított plugin már ki is teszi az új osztályt a UI-ra mint választható test scenario.
-
Alexios
veterán
Még egy kérdés a tisztelt szakértőkhöz: van rá valamilyen mód C#-ban, hogy egyszerűen végigmenjek egy osztály tagjain? Mert most én kezdőként úgy próbálkoztam, hogy van egy fő osztály, amelyből minden más osztály származik a programban és foreach ciklussal próbálkozom elérni a tagokat - sikertelenül.
Tehát ez a mostani kódom:class JatekElemei{public int xhely,yhely;}class Jatekos: JatekElemei{public Bitmap kepe;public byte animidozito=5,lovesvsz; //alképváltó és lövésvisszaszámláló};class JatLovedekei: JatekElemei{public Bitmap kepe;};List<JatLovedekei> jatlovlista = new List<JatLovedekei>();byte jatlovdb = 0;class Deneverek: JatekElemei{public int dirx,diry;public Bitmap kepe;public byte animidozito=5;};És így próbálok végigmenni rajtuk az ablak átméretezésekor:void MainFormResize(object sender, EventArgs e)
{
foreach (JatekElemei jatelem in JatekElemei) {
jatelem.xhely*=Width/ablakszel;
jatelem.yhely*=Height/ablakmag;
}
ablakszel=Width;
ablakmag=Height;
}Erre kapom ezt a hibaüzenetet:
A(z) „Animacios.MainForm.JatekElemei” egy „típus” konstruktor, de „változó” konstruktorként használva. (CS0118)Most akkor mi hogyan van ebben a foreach-ben? Vagy ez nem is jó erre?Azért lenne jó valami hasonló megoldást találni, hogy amikor szükséges végigmenni valamiért a program összes elemén, el lehessen azt intézni egy ciklussal.Min akarsz végig iterálni?
foreach (JatekElemei jatelem in JatekElemei) {itt a foreach ugye maga a ciklus. Ezek után a zárójelen belül először jön a típusa az adatoknak ami esetedben JatekElemei lenne(amúgy használhatsz var-t is ha nem akarod kiírni, de itt most pont jól látszik) aztán a ciklusváltozónév amit adsz az adott elemnek, majd magát a listát amin végig akarsz iterálni. Viszont te az objektum típusát adtad meg és nem egy listát/tömböt/valamit amin végig lehet menni.
Mivel egy gyűjteményed van az egészben, és az is más típusú, ezért ha tippelnem kéne nem erre akarod használni, viszont kicsit zavaros számomra hogy mit szeretnél akkor.
Ha a kérdésed az hogy az összes JatekElemei típusú objektumodat szeretnéd frissíteni, akkor ezeket valahol trackelned kéne és azon végigiterálni(vagy technikailag reflectionnel is meg lehet valószínűleg csinálni, de ne tedd), de ebben a kódrészletben az se világos igazából hol hozod létre azokat amiket frissíteni szeretnél itt
van egy fő osztály, amelyből minden más osztály származik a programban
Már ez a kiindulási pont is rosszul hangzik amúgy hogy miért akarsz ilyet csinálni, biztos erre van-e szükséged -
Tomi_78
aktív tag
Még egy kérdés a tisztelt szakértőkhöz: van rá valamilyen mód C#-ban, hogy egyszerűen végigmenjek egy osztály tagjain? Mert most én kezdőként úgy próbálkoztam, hogy van egy fő osztály, amelyből minden más osztály származik a programban és foreach ciklussal próbálkozom elérni a tagokat - sikertelenül.
Tehát ez a mostani kódom:class JatekElemei{public int xhely,yhely;}class Jatekos: JatekElemei{public Bitmap kepe;public byte animidozito=5,lovesvsz; //alképváltó és lövésvisszaszámláló};class JatLovedekei: JatekElemei{public Bitmap kepe;};List<JatLovedekei> jatlovlista = new List<JatLovedekei>();byte jatlovdb = 0;class Deneverek: JatekElemei{public int dirx,diry;public Bitmap kepe;public byte animidozito=5;};És így próbálok végigmenni rajtuk az ablak átméretezésekor:void MainFormResize(object sender, EventArgs e)
{
foreach (JatekElemei jatelem in JatekElemei) {
jatelem.xhely*=Width/ablakszel;
jatelem.yhely*=Height/ablakmag;
}
ablakszel=Width;
ablakmag=Height;
}Erre kapom ezt a hibaüzenetet:
A(z) „Animacios.MainForm.JatekElemei” egy „típus” konstruktor, de „változó” konstruktorként használva. (CS0118)Most akkor mi hogyan van ebben a foreach-ben? Vagy ez nem is jó erre?Azért lenne jó valami hasonló megoldást találni, hogy amikor szükséges végigmenni valamiért a program összes elemén, el lehessen azt intézni egy ciklussal. -
Tomi_78
aktív tag
Köszönöm mindhármótok segítségét!
A List használatával sikerült működésre bírnom a programot:
List<Deneverek> deneverlista = new List<Deneverek>(); -
Alexios
veterán
Azzal max rájön mi a gond, de a megoldás nem ez lesz mert az ArrayList nem generic ahogy joysefke is írta, szóval objectet ad vissza. Vagy castolja amit visszaad Deneverek-re, vagy mivel 0 értelme van 2024-ben ArrayList-et használni ott a List<> erre
-
sztanozs
veterán
Sziasztok!
Arraylist-et hogy kell használni arra, hogy osztályokat teszek bele és törlöm őket? Van néhány ilyen objektumom, amiket így hozok létre:
public partial class MainForm : Form{Bitmap deneverkepe1 = new Bitmap("kepei\\kisdenever1bmp.bmp");Bitmap deneverkepe2 = new Bitmap("kepei\\kisdenever2bmp.bmp");class Deneverek{public int dirx,diry,xhely,yhely;public Bitmap kepe;};Deneverek egydenever;System.Collections.ArrayList deneverlista = new System.Collections.ArrayList();public MainForm(){for (int i=0; i<3; i++) {egydenever = new Deneverek();svsz = vsz.Next(1);if (svsz==0) {egydenever.dirx = -1;} else {egydenever.dirx = 1;};svsz = vsz.Next(1);if (svsz==0) {egydenever.diry = -1;} else {egydenever.diry = 1;};svsz = vsz.Next(1);if (svsz==0) {egydenever.kepe = deneverkepe1;} else {egydenever.kepe = deneverkepe2;};egydenever.xhely=vsz.Next(1,Width-egydenever.kepe.Width);egydenever.yhely=vsz.Next(1,Height-egydenever.kepe.Height);deneverlista.Add(egydenever);};
Eddig rendben is van (remélhetőleg), de ha pl. már ki akarom rajzolni őket így:void MainFormPaint(object sender, PaintEventArgs e){for (int i=0; i<3; i++) {var denever = deneverlista[i];e.Graphics.DrawImage(denever.kepe,denever.xhely,denever.yhely,denever.kepe.Width,denever.kepe.Height);};}
akkor hibaüzenetet kapok, hogy "„object” nem tartalmazza a(z) „dirx” metódus definícióját, és nem található olyan „dirx” kiterjesztésmetódus, amely „object” típusú első argumentumot fogad el (esetleg hiányzik egy „using” direktíva vagy egy szerelvényre mutató hivatkozás). (CS1061)"
és ugyanez a többi változójára is.
Azt szeretném, hogy legyenek ilyen képi objektumok a programomban, amikből később el is távolíthatok. Eredetileg sima tömbbel próbálkoztam, de azok tartalmát nem lehet megváltoztatni.var denever = ...helyettDeneverek denever = ... -
joysefke
veterán
Sziasztok!
Arraylist-et hogy kell használni arra, hogy osztályokat teszek bele és törlöm őket? Van néhány ilyen objektumom, amiket így hozok létre:
public partial class MainForm : Form{Bitmap deneverkepe1 = new Bitmap("kepei\\kisdenever1bmp.bmp");Bitmap deneverkepe2 = new Bitmap("kepei\\kisdenever2bmp.bmp");class Deneverek{public int dirx,diry,xhely,yhely;public Bitmap kepe;};Deneverek egydenever;System.Collections.ArrayList deneverlista = new System.Collections.ArrayList();public MainForm(){for (int i=0; i<3; i++) {egydenever = new Deneverek();svsz = vsz.Next(1);if (svsz==0) {egydenever.dirx = -1;} else {egydenever.dirx = 1;};svsz = vsz.Next(1);if (svsz==0) {egydenever.diry = -1;} else {egydenever.diry = 1;};svsz = vsz.Next(1);if (svsz==0) {egydenever.kepe = deneverkepe1;} else {egydenever.kepe = deneverkepe2;};egydenever.xhely=vsz.Next(1,Width-egydenever.kepe.Width);egydenever.yhely=vsz.Next(1,Height-egydenever.kepe.Height);deneverlista.Add(egydenever);};
Eddig rendben is van (remélhetőleg), de ha pl. már ki akarom rajzolni őket így:void MainFormPaint(object sender, PaintEventArgs e){for (int i=0; i<3; i++) {var denever = deneverlista[i];e.Graphics.DrawImage(denever.kepe,denever.xhely,denever.yhely,denever.kepe.Width,denever.kepe.Height);};}
akkor hibaüzenetet kapok, hogy "„object” nem tartalmazza a(z) „dirx” metódus definícióját, és nem található olyan „dirx” kiterjesztésmetódus, amely „object” típusú első argumentumot fogad el (esetleg hiányzik egy „using” direktíva vagy egy szerelvényre mutató hivatkozás). (CS1061)"
és ugyanez a többi változójára is.
Azt szeretném, hogy legyenek ilyen képi objektumok a programomban, amikből később el is távolíthatok. Eredetileg sima tömbbel próbálkoztam, de azok tartalmát nem lehet megváltoztatni.ArrayList helyett használj List<T> -t. Konkrétan List<Deneverek> -t. Az ArrayList nem típusosan tárolja az elemeit, hanem object-ként. A List<T> viszont típusosan.
-
Tomi_78
aktív tag
Sziasztok!
Arraylist-et hogy kell használni arra, hogy osztályokat teszek bele és törlöm őket? Van néhány ilyen objektumom, amiket így hozok létre:
public partial class MainForm : Form{Bitmap deneverkepe1 = new Bitmap("kepei\\kisdenever1bmp.bmp");Bitmap deneverkepe2 = new Bitmap("kepei\\kisdenever2bmp.bmp");class Deneverek{public int dirx,diry,xhely,yhely;public Bitmap kepe;};Deneverek egydenever;System.Collections.ArrayList deneverlista = new System.Collections.ArrayList();public MainForm(){for (int i=0; i<3; i++) {egydenever = new Deneverek();svsz = vsz.Next(1);if (svsz==0) {egydenever.dirx = -1;} else {egydenever.dirx = 1;};svsz = vsz.Next(1);if (svsz==0) {egydenever.diry = -1;} else {egydenever.diry = 1;};svsz = vsz.Next(1);if (svsz==0) {egydenever.kepe = deneverkepe1;} else {egydenever.kepe = deneverkepe2;};egydenever.xhely=vsz.Next(1,Width-egydenever.kepe.Width);egydenever.yhely=vsz.Next(1,Height-egydenever.kepe.Height);deneverlista.Add(egydenever);};
Eddig rendben is van (remélhetőleg), de ha pl. már ki akarom rajzolni őket így:void MainFormPaint(object sender, PaintEventArgs e){for (int i=0; i<3; i++) {var denever = deneverlista[i];e.Graphics.DrawImage(denever.kepe,denever.xhely,denever.yhely,denever.kepe.Width,denever.kepe.Height);};}
akkor hibaüzenetet kapok, hogy "„object” nem tartalmazza a(z) „dirx” metódus definícióját, és nem található olyan „dirx” kiterjesztésmetódus, amely „object” típusú első argumentumot fogad el (esetleg hiányzik egy „using” direktíva vagy egy szerelvényre mutató hivatkozás). (CS1061)"
és ugyanez a többi változójára is.
Azt szeretném, hogy legyenek ilyen képi objektumok a programomban, amikből később el is távolíthatok. Eredetileg sima tömbbel próbálkoztam, de azok tartalmát nem lehet megváltoztatni. -
vlevi
nagyúr
-
joysefke
veterán
Most próbáltam dotnetfiddle.net-ben és belefutott az if-ágba akár NY-Y akár Ny-y párossal próbáltam, hiába állítottam be előtte, hogy:
CultureInfo.CurrentCulture = new CultureInfo("hu-HU", false); -
Szancsó
aktív tag
Úgy tűnik, mintha a magyarhoz tartozó comparer elfelejtett volna magyarul, vagy nem tudom.
Nem elfelejtett, hanem megtanult.Itt tudsz kísérletezni, kifejtés itt.
A betűrendbe sorolás
14. c) A magánhangzók rövid-hosszú párjait jelölő betűk (a – á, e – é, i – í, o – ó, ö – ő, u – ú, ü – ű) betűrendbe soroláskor a kialakult szokás szerint mind a szavak elején, mind pedig a szavak belsejében azonos értékűnek számítanak. A hosszú magánhangzót tartalmazó szó tehát meg is előzheti a megfelelő rövid magánhangzót tartalmazót, például:
ír Irán író
Irak írandó iroda
iram iránt iróniaA rövid magánhangzós szó kerül viszont előbbre olyankor, ha a két szó betűsora csak a megfelelő magánhangzók hosszúságában különbözik, például:
Eger kerek szel
egér kerék szél
egyfelé keres szeles
egyféle kérés széles
elöl (hol?) koros szüret
elől (honnan?) kóros szűretAaazigen. Valóban nagyon rég koptattam az iskolapadot, nem igazán rémlett ilyesmi.
Normál "hu-HU" esetén ok is lenne, a "hu-HU_technl" -nél azért el bírtam volna viselni, ha figyel az ékezetre, de ezek szerint jogos: az a 16. pontnak megfelelő spéci rendezés lenne. ("mind a magyar, mind az idegen többjegyű betűknek minden egyes eleme külön, önálló egységnek számít, és a besorolás nincs tekintettel sem a magyar ékezetekre, sem az idegen betűk mellékjeleire")
Na szép, akkor tanulhatom a magyart, plusz lehet átverekedni ügyfél oldalra a dolgot
Köszönöm!
-
vlevi
nagyúr
El is felejtettem, hogy lehet kérdezni

Nem tudom más belefutott-e, de egyszerű rendezéses gondom lenne: a magyar ABC szerint Framework alatt még ment a rendezés, de Core óta nem, és most .Net 6 / 8 alatt sem.
Külsős komponenscsomagról van szó, de egyszerűen szimulálható is:var comp = System.StringComparer.Create(CultureInfo.GetCultureInfo("hu-HU_technl"), false);var strings = new string[] { "brummm", "ábránd", "üveg", "űr", "út", "undok", "asd", "ásd", "álm", "alm" };Console.WriteLine(string.Join(", ", strings.OrderBy(item => item, comp)));
Az elvárt: "alm, asd, ábránd, álm, ásd, brummm, undok, út, üveg, űr"Úgy tűnik, mintha a magyarhoz tartozó comparer elfelejtett volna magyarul, vagy nem tudom. Erre van valami egyszerű megoldás? (Egyelőre írtam sajátot és azt kapja a control, de nem hiszem el, egy egy beépített gyári cucc így elromlott.)
Ennél szebb, amikor azt kérdezed tőle, hogy
string szo = "NY";if szo.Contains("Y") {...}És nem megy be az if-be, te meg lesel, mint vak a moziban, aztán rájössz, hogy az alapértelmezett culture info magyar, ezért az nem egy N és egy Y betű, hanem Ny, és abban nincs külön Y

-
petyus_
senior tag
Úgy tűnik, mintha a magyarhoz tartozó comparer elfelejtett volna magyarul, vagy nem tudom.
Nem elfelejtett, hanem megtanult.Itt tudsz kísérletezni, kifejtés itt.
A betűrendbe sorolás
14. c) A magánhangzók rövid-hosszú párjait jelölő betűk (a – á, e – é, i – í, o – ó, ö – ő, u – ú, ü – ű) betűrendbe soroláskor a kialakult szokás szerint mind a szavak elején, mind pedig a szavak belsejében azonos értékűnek számítanak. A hosszú magánhangzót tartalmazó szó tehát meg is előzheti a megfelelő rövid magánhangzót tartalmazót, például:
ír Irán író
Irak írandó iroda
iram iránt iróniaA rövid magánhangzós szó kerül viszont előbbre olyankor, ha a két szó betűsora csak a megfelelő magánhangzók hosszúságában különbözik, például:
Eger kerek szel
egér kerék szél
egyfelé keres szeles
egyféle kérés széles
elöl (hol?) koros szüret
elől (honnan?) kóros szűretén azt hittem, az a-á e-é külön betűnek számít, nem rövid-hosszú párnak.
-
dqdb
nagyúr
El is felejtettem, hogy lehet kérdezni

Nem tudom más belefutott-e, de egyszerű rendezéses gondom lenne: a magyar ABC szerint Framework alatt még ment a rendezés, de Core óta nem, és most .Net 6 / 8 alatt sem.
Külsős komponenscsomagról van szó, de egyszerűen szimulálható is:var comp = System.StringComparer.Create(CultureInfo.GetCultureInfo("hu-HU_technl"), false);var strings = new string[] { "brummm", "ábránd", "üveg", "űr", "út", "undok", "asd", "ásd", "álm", "alm" };Console.WriteLine(string.Join(", ", strings.OrderBy(item => item, comp)));
Az elvárt: "alm, asd, ábránd, álm, ásd, brummm, undok, út, üveg, űr"Úgy tűnik, mintha a magyarhoz tartozó comparer elfelejtett volna magyarul, vagy nem tudom. Erre van valami egyszerű megoldás? (Egyelőre írtam sajátot és azt kapja a control, de nem hiszem el, egy egy beépített gyári cucc így elromlott.)
Úgy tűnik, mintha a magyarhoz tartozó comparer elfelejtett volna magyarul, vagy nem tudom.
Nem elfelejtett, hanem megtanult.Itt tudsz kísérletezni, kifejtés itt.
A betűrendbe sorolás
14. c) A magánhangzók rövid-hosszú párjait jelölő betűk (a – á, e – é, i – í, o – ó, ö – ő, u – ú, ü – ű) betűrendbe soroláskor a kialakult szokás szerint mind a szavak elején, mind pedig a szavak belsejében azonos értékűnek számítanak. A hosszú magánhangzót tartalmazó szó tehát meg is előzheti a megfelelő rövid magánhangzót tartalmazót, például:
ír Irán író
Irak írandó iroda
iram iránt iróniaA rövid magánhangzós szó kerül viszont előbbre olyankor, ha a két szó betűsora csak a megfelelő magánhangzók hosszúságában különbözik, például:
Eger kerek szel
egér kerék szél
egyfelé keres szeles
egyféle kérés széles
elöl (hol?) koros szüret
elől (honnan?) kóros szűret -
Szancsó
aktív tag
El is felejtettem, hogy lehet kérdezni

Nem tudom más belefutott-e, de egyszerű rendezéses gondom lenne: a magyar ABC szerint Framework alatt még ment a rendezés, de Core óta nem, és most .Net 6 / 8 alatt sem.
Külsős komponenscsomagról van szó, de egyszerűen szimulálható is:var comp = System.StringComparer.Create(CultureInfo.GetCultureInfo("hu-HU_technl"), false);var strings = new string[] { "brummm", "ábránd", "üveg", "űr", "út", "undok", "asd", "ásd", "álm", "alm" };Console.WriteLine(string.Join(", ", strings.OrderBy(item => item, comp)));
Az elvárt: "alm, asd, ábránd, álm, ásd, brummm, undok, út, üveg, űr"Úgy tűnik, mintha a magyarhoz tartozó comparer elfelejtett volna magyarul, vagy nem tudom. Erre van valami egyszerű megoldás? (Egyelőre írtam sajátot és azt kapja a control, de nem hiszem el, egy egy beépített gyári cucc így elromlott.)
-
Keem1
veterán
Én a helyedben egyelőre maradnék a 6-nál, novemberben úgyis lejár a support, tehát legkésőbb akkor illene frissíteni. Közben meg előfordulhat, hogy belefutsz valamibe, ahol breaking change volt 7/8 alatt, és onnantól amúgy sem tudnál továbbmenni mindhárommal egyszerre.
martonx: nem pontosan értem mire gondolsz, milyen issue-t csináljon, mert ez nem bug, hanem az elvárt működés. A multi-target nem arra való, hogy webapp-ot futtass több környezeten, inkább library-knél jó, hogy több frameworkkel is kompatibilis legyen (nyilván ilyenkor is figyelni kell a breaking changekre, és egy idő után lesz pár #if NET6_0, stb).
Akkor ez lesz, maradok dotnet 6.0-n.
-
petyus_
senior tag
De-de, jó, igazából most is .net 6-ot használok, csak mivel a webapp jelenleg teljesen kompatibilis mindhárom jelenlegi verzióval, gondoltam, kicsit tervezek a jövőre is, így pl. windowson lebuildelem mindhármat, hátha valami inkompatibilitás állna elő. De jelenleg csak pár warning csúfítja az outputot. Azure-on is 6.0-n fut, pont azért, mert a legrégebbi a linux jelenleg. És mivel a VPS ownere nem én vagyok, nem sok befolyásom van a dotnet upgrade-re (lassú lenne a folyamat, ha ráállnék).
Én a helyedben egyelőre maradnék a 6-nál, novemberben úgyis lejár a support, tehát legkésőbb akkor illene frissíteni. Közben meg előfordulhat, hogy belefutsz valamibe, ahol breaking change volt 7/8 alatt, és onnantól amúgy sem tudnál továbbmenni mindhárommal egyszerre.
martonx: nem pontosan értem mire gondolsz, milyen issue-t csináljon, mert ez nem bug, hanem az elvárt működés. A multi-target nem arra való, hogy webapp-ot futtass több környezeten, inkább library-knél jó, hogy több frameworkkel is kompatibilis legyen (nyilván ilyenkor is figyelni kell a breaking changekre, és egy idő után lesz pár #if NET6_0, stb).
-
martonx
veterán
Srácok, ASP.Net Core (.Net 6.0), Azure deploy Githubról.
Ez az error:
The current .NET SDK does not support targeting .NET 7.0. Either target .NET 6.0 or lower, or use a version of the .NET SDK that supports .NET 7.0.A csprojban ez van: <TargetFrameworks>net6.0;net7.0;net8.0</TargetFrameworks>
Az Azure web app runtime stack-je .Net 6.0
Ha a fenti multi FW-t kicserélem erre: <TargetFramework>net6.0</TargetFramework>, akkor működik a deploy (természetesen ha végigzongorázom 6-tól 8-ig, ugyanez, single FW ok, multi FW failure).
Ha windowson, linuxon buildelek, akkor az összes FW verzióval megy.Hogy tudom rábírni az Azure-ra hogy a neki tetszőt válassza ki, a többit hagyja figyelmen kívül?

Szerk: sajnos kell a multi FW, mert fut windowson, tesztelek Azure-on és megy egy linux szerveren is, ahol sajnos csak .NET 6.0 van. Külön fejleszteni nem akarok, mert tuti egyszer elfelejtek vmit, így meg githubról automatikusa deployódik. És a kód fordul/fut mindhárom verzión
A megfelelő github action dokumentációját kellene átnézd. Ennyiből amit küldtél még az se derül ki, hogy ez App Service vagy egy virtuális gép, vagy Azure function, vagy egy docker image. Szóval amelyik lépésnél dobódik ez a hiba, annak az actionnek a doksiját nézd át, github issue-jait, hátha meg lesz a megoldás.
Ha nem lesz meg, akkor pedig érdemes indítanod github issue-t nekik. -
Keem1
veterán
De-de, jó, igazából most is .net 6-ot használok, csak mivel a webapp jelenleg teljesen kompatibilis mindhárom jelenlegi verzióval, gondoltam, kicsit tervezek a jövőre is, így pl. windowson lebuildelem mindhármat, hátha valami inkompatibilitás állna elő. De jelenleg csak pár warning csúfítja az outputot. Azure-on is 6.0-n fut, pont azért, mert a legrégebbi a linux jelenleg. És mivel a VPS ownere nem én vagyok, nem sok befolyásom van a dotnet upgrade-re (lassú lenne a folyamat, ha ráállnék).
-
petyus_
senior tag
Srácok, ASP.Net Core (.Net 6.0), Azure deploy Githubról.
Ez az error:
The current .NET SDK does not support targeting .NET 7.0. Either target .NET 6.0 or lower, or use a version of the .NET SDK that supports .NET 7.0.A csprojban ez van: <TargetFrameworks>net6.0;net7.0;net8.0</TargetFrameworks>
Az Azure web app runtime stack-je .Net 6.0
Ha a fenti multi FW-t kicserélem erre: <TargetFramework>net6.0</TargetFramework>, akkor működik a deploy (természetesen ha végigzongorázom 6-tól 8-ig, ugyanez, single FW ok, multi FW failure).
Ha windowson, linuxon buildelek, akkor az összes FW verzióval megy.Hogy tudom rábírni az Azure-ra hogy a neki tetszőt válassza ki, a többit hagyja figyelmen kívül?

Szerk: sajnos kell a multi FW, mert fut windowson, tesztelek Azure-on és megy egy linux szerveren is, ahol sajnos csak .NET 6.0 van. Külön fejleszteni nem akarok, mert tuti egyszer elfelejtek vmit, így meg githubról automatikusa deployódik. És a kód fordul/fut mindhárom verzión
Ha több target frameworköt is megadsz, akkor mindegyiket le fogja buildelni, nem egyet választ közülük. (Így az adott package kompatibilis lesz több verzióval is.)
Miért nem jó, ha mindenhol dotnet 6-ot használsz? Vagy nem lehet frissíteni mindenhol, és 8-at használni?
-
Keem1
veterán
Srácok, ASP.Net Core (.Net 6.0), Azure deploy Githubról.
Ez az error:
The current .NET SDK does not support targeting .NET 7.0. Either target .NET 6.0 or lower, or use a version of the .NET SDK that supports .NET 7.0.A csprojban ez van: <TargetFrameworks>net6.0;net7.0;net8.0</TargetFrameworks>
Az Azure web app runtime stack-je .Net 6.0
Ha a fenti multi FW-t kicserélem erre: <TargetFramework>net6.0</TargetFramework>, akkor működik a deploy (természetesen ha végigzongorázom 6-tól 8-ig, ugyanez, single FW ok, multi FW failure).
Ha windowson, linuxon buildelek, akkor az összes FW verzióval megy.Hogy tudom rábírni az Azure-ra hogy a neki tetszőt válassza ki, a többit hagyja figyelmen kívül?

Szerk: sajnos kell a multi FW, mert fut windowson, tesztelek Azure-on és megy egy linux szerveren is, ahol sajnos csak .NET 6.0 van. Külön fejleszteni nem akarok, mert tuti egyszer elfelejtek vmit, így meg githubról automatikusa deployódik. És a kód fordul/fut mindhárom verzión
-
fatal`
titán
Üdvözlet! Van egy .NET Framework 4.5 32 bites projekt (Visual Studio 2012), amiből az egyik assembly-nek a nevét sikerült magyarul megadni, azaz hosszú ékezetes betűket is tartalmaz.
Egy hónapja ez az alkalmazás nem indul el bizonyos eszközökön, ahol előtte igen. A program egyszerűen nem indul el, pontosabban elindul, majd az első UI felület (bejelentkezés) megjelenése előtt leáll, kivétel nem lép fel, az eseménynaplóba csak egy ucrtbase.dll hiba kerül bele.
Ha módosítjuk az assembly nevét magyar ékezetes betűk nélkülire, a program rendben működik. Találkozott más is ilyennel? Jó lenne az okokat is kideríteni, kereséssel nem találtam hasonló jelenséget.Első körben megnézném a rendszer területi és nyelvi beállításait. Különösen a nem unicode programok nyelvét, ez szokott angolon maradni és okozhat ilyen anomáliákat.
Más kérdés, hogy mégis miért kell a namespaceben/assemblyben ékezetet használni?
-
rgeorge
addikt
Üdvözlet! Van egy .NET Framework 4.5 32 bites projekt (Visual Studio 2012), amiből az egyik assembly-nek a nevét sikerült magyarul megadni, azaz hosszú ékezetes betűket is tartalmaz.
Egy hónapja ez az alkalmazás nem indul el bizonyos eszközökön, ahol előtte igen. A program egyszerűen nem indul el, pontosabban elindul, majd az első UI felület (bejelentkezés) megjelenése előtt leáll, kivétel nem lép fel, az eseménynaplóba csak egy ucrtbase.dll hiba kerül bele.
Ha módosítjuk az assembly nevét magyar ékezetes betűk nélkülire, a program rendben működik. Találkozott más is ilyennel? Jó lenne az okokat is kideríteni, kereséssel nem találtam hasonló jelenséget. -
skyrush7
aktív tag
Szia!
Ahogy látom a booking.com-nak van nagyon profi API-ja: Booking.com APIs and Documentation
Szallas.hu esetében viszont nem igazán találtam ilyet, én a helyedben felvenném velük a kapcsolatot, szeretném hinni, hogy van nekik is API-juk.
iCal-t a helyedben nem erőltetném, API integráció irányába mennék.Köszönöm szépen!
-
martonx
veterán
Sziasztok!
Problémáma ütköztem, nemrég kezdtem el .NET Core-ban egy foglaló oldalt lérehozni a vendégházunkhoz. Az alapfunkcionalitás rendben, tudnak dátum szerint foglalást leadni, amely mentésre kerül a DB-be.
A probléma ott van, hogy jó lenne valamilyen szinten szinkronizálni Booking és Szállás.hu-val. Mindkettőhöz van egy iCal link.
Ezt hogyan tudnám beintegrálni a .NET-es oldalamba? Lényeg, hogy ne engedjen az oldal foglalni olyan dátumra, ahova már Bookingon keresztül le lett adva foglalás.
Sajnos neten nem nagyon találtam anyagot hozzá, aránylag kezdő is vagyok még. Az iCal.NET libraryra rátaláltam, de nem nagyon találtam oktatóanyagot hozzá, hogyan is lehetne használni.
Tudtok valami tippet adni merre induljak el?Szia!
Ahogy látom a booking.com-nak van nagyon profi API-ja: Booking.com APIs and Documentation
Szallas.hu esetében viszont nem igazán találtam ilyet, én a helyedben felvenném velük a kapcsolatot, szeretném hinni, hogy van nekik is API-juk.
iCal-t a helyedben nem erőltetném, API integráció irányába mennék. -
skyrush7
aktív tag
Sziasztok!
Problémáma ütköztem, nemrég kezdtem el .NET Core-ban egy foglaló oldalt lérehozni a vendégházunkhoz. Az alapfunkcionalitás rendben, tudnak dátum szerint foglalást leadni, amely mentésre kerül a DB-be.
A probléma ott van, hogy jó lenne valamilyen szinten szinkronizálni Booking és Szállás.hu-val. Mindkettőhöz van egy iCal link.
Ezt hogyan tudnám beintegrálni a .NET-es oldalamba? Lényeg, hogy ne engedjen az oldal foglalni olyan dátumra, ahova már Bookingon keresztül le lett adva foglalás.
Sajnos neten nem nagyon találtam anyagot hozzá, aránylag kezdő is vagyok még. Az iCal.NET libraryra rátaláltam, de nem nagyon találtam oktatóanyagot hozzá, hogyan is lehetne használni.
Tudtok valami tippet adni merre induljak el?
Új hozzászólás Aktív témák
-
10100 - 10001
10246 - 10201 10200 - 10101 10100 - 10001 10000 - 9901 9900 - 9801 9800 - 9701 9700 - 9601 9600 - 9501 9500 - 9401 9400 - 9301 9300 - 9201 9200 - 9101 9100 - 9001 9000 - 8901 8900 - 8801 8800 - 8701 8700 - 8601 8600 - 8501 8500 - 8401 8400 - 8301 8300 - 8201 8200 - 8101 8100 - 8001 8000 - 6001 6000 - 4001 4000 - 2001 2000 - 1
-
Fórumok
Mobilarena - mobil fórumok
Okostelefonok Mobiltelefonok Okosórák Autó+mobil Üzlet és Szolgáltatások Mobilalkalmazások Tartozékok, egyebek Mobilarena blogokPROHARDVER! - hardver fórumok
Notebookok TV & Audió Digitális fényképezés Alaplapok, chipsetek, memóriák Processzorok, tuning Hűtés, házak, tápok, modding Videokártyák Monitorok Adattárolás Multimédia, életmód, 3D nyomtatás Nyomtatók, szkennerek Tabletek, E-bookok PC, mini PC, barebone, szerver Beviteli eszközök Egyéb hardverek PROHARDVER! BlogokIT café - infotech fórumok
Infotech Hálózat, szolgáltatók OS, alkalmazások SzoftverfejlesztésGAMEPOD - játék fórumok
PC játékok Konzol játékok MobiljátékokLOGOUT - lépj ki, lépj be!
LOGOUT reakciók Monologoszféra FototrendFÁRADT GŐZ - közösségi tér szinte bármiről
Tudomány, oktatás Sport, életmód, utazás, egészség Kultúra, művészet, média Gazdaság, jog Technika, hobbi, otthon Társadalom, közélet Egyéb Lokál PROHARDVER! interaktív
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Multimédiás / PC-s hangfalszettek (2.0, 2.1, 5.1)
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- World of Tanks - MMO
- AMD Ryzen 9 / 7 / 5 9***(X) "Zen 5" (AM5)
- Diablo IV
- Formula-1
- Könyvajánló
- Budapest és környéke adok-veszek-beszélgetek
- Battlefield 6
- Xiaomi 15T Pro - a téma nincs lezárva
- További aktív témák...
- i5-14400F / RTX 5060 8GB WHITE / DDR5 32GB / Kompakt Gamer PC / Garancia
- ÚJ Alienware 16X Aurora - 16"WQHD 240Hz - Ultra 7 255HX - 32GB - 1TB - RTX 5060 - 3 év garancia
- Bomba ár! Lenovo ThinkPad T15 G2 - i5-11G I 16GB I 256GB SSD I 15,6" FHD I Cam I W11 I Gari!
- Dobozos! Xbox One X 1 TB + kontroller 6 hó garancia, számlával!
- Új! Acer Nitro V i7-13620H 16GB 512GB RTX 5060 FHD 165Hz 2 év garancia
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.

Ilyen "csalással" könnyű azt mondani, hogy minden object...


