Hirdetés

Keresés

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

  • Homer
    tag

    pénzügy informatikában vagyok főállású programozó

    "Laza kellemes hely lehet", ha mellette ráérsz fórumozgatni is közben. :DD

    Na jól van, nem leszek gonosz. :) Az, hogy valaki mással (is) tölti az ebédidejét /szabad kapacitását nem jelenti azt, hogy olyan laza lenne a munkája. Én spec azért kezdtem el tanulni a VB-t, mert hasznát vettem a munkámban. Már nem egyszer fordult elő, hogy egy Excel-es feladatot VBA segítségével oldottam meg. Innen indult a programozás iránti érdeklődésem. Most ott tartok, hogy Turbo pascal megy valamennyire (ezt még egyetemen tanították), meg VB olyan alap-közép közti szinten (legalábbis itt érzem magam). Ezt már autodidakta módon tanultam.

  • Homer
    tag

    Szia!

    Ez egy VB topik, mi akik itt segítkezünk szeretjük a VB-t, sok mindenre szvsz a VB a legjobb választás. Viszont mint te is látod, erre a tök egyszerű dologra éppen nagyon nem jó választás. Mint látod pl. DirectX-hez, meg mindeféle alacsony szintű grafikus API-hoz baromi körülményes passzintani.
    De hogy konstruktív is legyek. Ha én VB-ben mindenképpen ezt akarnám megvalósítani, akkor:

    1. VS2010 kuka, VS2012-t használnék. Ismét megkérdezem miért VS2010-et használsz?
    2. WPF-ben csinálnám vagy Silverlight-tal (szintén halódó, de létező technológiák), sokkal jobban kezelik alapból mindeféle DirectX, meg OpenGL nélkül is az animációkat, mint a windows forms.
    3. Esetleg XNA-vel csinálnám, abszolút nem csak windows phone-ra jó, xbox-ra, meg sima windows-ra is lehet XNA-vel fejleszteni. Szvsz a sorozatos beteg MS döntések egyike (remélem a legutolsó) volt, hogy tavaly óta nem fejlesztik tovább, így win8-ra, új Xbox-ra, wp8-ra már az XNA nem megfelelő, azaz halálra van ítélve.

    Csak az első pontra válaszolnék, a többivel tulajdonképpen egyetértek. :)
    Azért, mert a munkahelyemen csak ilyet sikerült telepíttetnem a rendszergazdákkal...

    Am. ezt találtam, majd kipróbálom:
    [link]

  • Homer
    tag

    Na most érted. Ha elolvastad, amit belinkeltél, akkor mi a kérdés? Várj, mielőtt újra felteszed a két kérdésedet, kérlek újra olvasd végig, amit belinkeltél ;]
    Na ugye, hogy ott a válasz. ;)

    Gyengébbek, meg angolul nem tudók kedvéért, összefoglalom a lehetőségeidet:
    1. Visual Basic használata XNA-vel (tudnod kell, hogy az XNA a win8 megjelenésével halottnak nyilváníttatott, de ettől még használható ha nagyon akarod).
    2. VS2012 (tényleg miért éppen VS2010-et használsz) C++ projekt használata DirectX-el.

    Egyébként játékot nem windows form alkalmazásban kell írni, nagyon nem.

    Nyilván bele lehet kötni abba is, hogy egyáltalán miért éppen visual basic... Azért, mert ez van, és kész!
    Nem akarok sem windóz 9-et írni, sem quake 5-öt visual basic-ben. Én csak arra lennék kíváncsi, hogy hogyan lehet egy egyszerű alakot egy formon villódzásmentesen frissíteni 25 fps-el, mert ugye ez kell, hogy folyamatos legyen a mozgás. Ha ehhez dx kell, akkor gondoltam nézegetm azt is, de ha xna akkor azt. Egyelőre egyikhez sem konyítok. Amit olvastam eddig róla, angol fórumokon, hogy közvetlenül kell programozni a videokártya gpu-t melyhez különféle windóz api-k vannak (OpenGL,DX, XNA...stb). OpenGL és DX kilőve a VB2010-ben, mert csak VC++ lib-et lehet hozzáadni a Visual Studio-hoz, azt is csak körülményesen. Az XNA meg, (amennyire látom), windows phone-hoz van gyárilag, tehát ez is buhera megoldás. (Persze megint lehet, hogy tévedek. Javíts ki ha gondolod!) :)

    Na mindegy! Azért természetesen köszönöm a válaszokat!

  • Homer
    tag

    Sehogy, a referenciákat minden projekthez külön kell hozzáadni.
    Másrészt ha egyszer már belőttél egy projekt típust, akkor tudsz belőle saját projekt template-et csinálni. És legközelebb abból tudsz új projektet csinálni, így végeredményben az új projektedben már benne lesz a megfelelő referencia.

    És egyáltalán lehet dx11 referenciát hozzáadni vb2010 projecthez?

    Itt azt írják hogy nem:
    [link]
    :( Igaz lehet ez? Van valami alternatíva? XNA vagy ilyesmi?

    Az a problémám, hogy mozgatni szeretnék egy form főablakán egy "golyót" és folyton vibrál a frissítésnél.
    Double buffered beállítással már próbálkoztam, picit jobb de nem tökéletes.
    VB2003-ban még úgy emlékszem, hogy ment a dx. Az alapokat emlékszem, hogy próbálgattam benne, de itt sehogy nem akar összejönni.

  • Homer
    tag

    Hello,
    Visual Studio 2010-ben, Visual Basic-hez hogyan lehet beállítani a dx referenciakönyvtárat úgy, hogy az minden új projectnél megmaradjon?

    DX11 SDK (june 2010) telepítve van már.

  • Homer
    tag

    Először is visszakérdeznék, hogy miért kell asztali alkalmazás?
    Aztán ha megtudnak győzni,hogy ehhez tényleg asztali alkalmazás kell, és windows 8-ról beszélünk (netalán), akkor html5+js-el.
    És ha tényleg asztali alkalmazás kell, de windows 8 nem játszik, akkor utolsó lehetőségként wpf-el csinálnám MVVM design pattern-nel C# code-behind-al.

    Tudom ez itt egy VB.Net topik, nekem a kedvenc nyelvem a VB, de a konkrét kérdésedre, akkor is a fentieket tanácsolnám.

    Meggyőzlek!
    1.: Azért mert nem itthoni gépre kell fejleszteni! Adott a környezet amiben dolgozni kell.
    2.: Kicsit olyan mintha neked azt mondanám, hogy programozó létedre magadnak cseréled ki a dugattyúgyűrűt a trabantodban. Attól, hogy az autószerelés nem a szakmád még érdekelhet a dolog. És amikor azt mondod, hogy van már sokkal jobb is (vb.net helyett akármi), igazat adok neked! Tényleg van már sokkal jobb autó is mint a trabi, de a lehetőség adott. Hiába írnék a Porsche topicba...

    Arra a mondatra, hogy az adatbázisba csak berakom, a formokon meg kezelem..., pont ez az! Az adatbázisban (értsd adatkészletben) vannak az adatok amikből a választólistát kellene feltölteni. Ezért kellene átadni a listát a form2-nek.

    És akkor egy kis on topic is!
    Ha már C, akkor ott, hogy csinálnád?

  • Homer
    tag

    Azt nem értem miért akarsz te bármilyen adatot átadni form1-ről form2-nek? Nem pont from2-n veszed fel az adatokat, és adod vissza form1-nek? És mindez persze csak képletesen szólva, miel valójában a DB-be kell visszajuttatndo az új adatokat, majd ha már ott vannak form1-en csak frissíteni kell a grid-et.
    Szerintem te valamit nagyon túlbonyolítottál.
    Manapság már nem triviális winforms tutorialokat találni, mivel alig fejleszt bárki winforms-t. Bár szerintem az MS How do I sorozat több éves videói biztosan megtalálhatóak még valahol.

    Nem!

    Akkor még egyszer!

    A három tábla tehát:
    1. Egy összegző (fordító) tábla, mely tartalmaz egy rendszám oszlopot, egy típuskód oszlopot, és egy színkód oszlopot
    2. Egy Típus tábla, mely tartlamaz egy típuskód, és egy típus(szöveg) oszlopot
    3. Egy Szín tábla, mely tartalmaz egy színkód oszlopot és egy szín(szöveg) mezőt

    (Nem tudtam rendesen formázni a PH-n a táblákat korábbi levelemben mert csak egy szóközt enged..., talán ezért volt félreérthető.)

    A táblák közti kapcsolatok beállítva.
    Típus tábla elsődleges kulcsa a típuskód mező, mely idegen kulcs a fordító táblában.
    Szín táblában a színkód elsődleges kulcs, és ez is idegen kulcs a a fordító táblában.

    Szóval, a nyitóformon megjelenik az öszes rekord. (Nyilván nem a színkóddal és a típuskóddal, hanem a szín és a típus szöveggel, ergo sima adatkötéssel nem tudom ezt megoldani (legalábbis eddigi tudásom szerint), de nem is ez most a kérdés.)

    Szal eddig okés.

    Nah, és itt és most, szeretnék egy új ablakot nyitni az új adatok felviteléhez.
    Az új ablakban lenne mondjuk egy textbox a rendszám beírásához, és két combobox a szín és a típus kiválasztásához.
    A comboboxoknál a displaymember tulajdonságát a szöveges mezőkre, datamember tulajdonságát a kulcs oszlopra állítva tudom állítgatni a dolgokat, és egy adatsort visszaadva a főformnak, már hozzá is adható az új sor a fordítótáblához.

    Valami ilyesmit szeretnék csinálni, és ehhez szeretnék találni forráskódot, amit vizsgálgatni tudnék, hogy hogy szokás az ilyen "problémákat megoldani".
    Valójában amit itt írtam az nem a valós probléma, amit meg kellene oldani, de nem is várom el, hogy azt megoldjátok helyettem. A konkrét feladatom megoldásához vagy 5-6 táblát kellene átadogatnom a formok közt. Ezért vannak kételyeim, hogy szerencsés-e az a megoldás, ha átadom (akár) az egész adatkészletet (adot esetben akár 99 másik formnak is?), vagy egy profi programban inkább egy megosztott készletet használnának. Referenciaként adják át, így nem többszöröződik a memóriában az adatkészlet? Esetleg csak az 5-6 táblát adják át ilyenkor? Ez pedig ennyi paramétert követelne a 2. form konstruktorában...

    Összegezve: ezért lennék kíváncsi egy olyan valaki hozzászólására aki "látott már ilyet". :)

  • Homer
    tag

    Linkeljetek már légyszi egy olyan oldalt, ahol arra találok példát, hogy hogyan szokás azt megoldani, hogy egy feltöltött adatkészlethez (több táblával pl. form1-en vagy megosztva), egy másik formról, pl. form2-ről kérnek be olyan adatokat, melyeket szintén ezen adatkészletben tárolt adatok alapján lehet kiválasztani pl. különböző combobox-okból, (tehát ugyan azon adatkészlet más-más tábláiból), és az eredményt szintén ebben a táblában tárolják.
    (Remélem érthető vagyok. :) )
    Köszi!

    Hogy érthetőbb legyek:

    Tábla 1:
    Autó színe Rendszám Típus
    1 AAA-000 2
    2 BBB-000 1

    Tábla 2:
    Színkód Szín
    1 Piros
    2 Zöld

    Tábla 3:
    Tíuskód: Típus:
    1 Trabant
    2 Ferrari

    Mind a 3 tábla egy adatkészletben van a form1-en. A táblák közti kapcsolatok beállítva.
    Ez a form, teszem azt, az adatok táblázatos megjelenítésére való, egy datagriddel, amely kötve van a Tábla 1-hez, és van rajta egy nyomógomb ezzel a felirattal:"Új rekord felvitele"

    Most nyitok egy új formot (form2)

    A form2-n van egy textbox a rendszám beírásához, meg két combobox melyből egyik a szín bevitelére másik a típus bevitelére szolgál. Ha itt okét nyomok akkor kellene a form1-nek visszaadni az értéket.

    Ilyenkor hogy szokás átadni az adatokat form1-ről form2-re?
    v1: Form2-n új adattáblákat csináljak és feltöltsem a form 1 táblák adataival?
    v2: Dataview-ok használatával?
    v3: Csak String-ekkel töltsem fel a listboxokat, aztán a kiválasztott értéket keressem vissza a main adatkészlet megfelelő táblájában?

  • Homer
    tag

    Linkeljetek már légyszi egy olyan oldalt, ahol arra találok példát, hogy hogyan szokás azt megoldani, hogy egy feltöltött adatkészlethez (több táblával pl. form1-en vagy megosztva), egy másik formról, pl. form2-ről kérnek be olyan adatokat, melyeket szintén ezen adatkészletben tárolt adatok alapján lehet kiválasztani pl. különböző combobox-okból, (tehát ugyan azon adatkészlet más-más tábláiból), és az eredményt szintén ebben a táblában tárolják.
    (Remélem érthető vagyok. :) )
    Köszi!

  • Homer
    tag

    Sziasztok!

    Olyat hogy lehet csinálni hogy egy userformon lévő textboxon keresztül a user megad egy számot (1-től 10-ig) majd ennek megfelelően a program létrehozza a megadott számú textboxot ugyanezen a formon (vagy akár újon) és hogy lehet dolgozni /azonosítani ezeket a textboxot hogy ezeknek az értékeit tudjam használni?
    köszi
    b

    Pl. vb.NET-ben:

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    x = InputBox("Add meg a textboxok számát", "Program", 1)
    For i As Integer = 0 To x - 1
    Dim teksztboksz As New TextBox
    teksztboksz.Location = New Point(10, 5 + i * 20)
    Me.Controls.Add(teksztboksz)
    Next
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim hanyadik As Integer = 0
    For Each elem As Object In Me.Controls
    If TypeOf elem Is TextBox Then
    hanyadik += 1
    If elem.text <> "" Then
    MsgBox("A(z) " & hanyadik & ". textbox tartalma: " & elem.text)
    End If
    End If
    Next
    End Sub

  • Homer
    tag

    Sziasztok! A segítségeteket kérném, mivel én nem vagyok járatos Visual BAsicben, ezért hozzátok fordulnék segítségért: kaptam eg ynagyon jó ismerősömtől egy kódrészletet, ami a szakdogájához kellene, de mivel ő műszaki menedzsernek tanul távol áll tőle a programozás. A programkód a következő lenne:

    Function Szoveget_General(Hossz As Integer, Seed As Integer) As String
    Const Kisbetuk = "aábcdeéfghiíjklmnoóöőpqrstuúüűvwxyz"
    Const Szamjegyek = "0123456789"
    Const Egyeb = "'!%$/=<>()\/[]#&@{}<,;:.?+-_ "
    Dim i As Integer, db As Integer, Karakterek As String, st As String
    Rnd (-1)
    Randomize (Seed)
    Karakterek = Kisbetuk + UCase(Kisbetuk) + Szamjegyek + Egyeb
    db = Len(Karakterek)
    st = ""
    For i = 1 To Hossz
    st = st + Mid(Karakterek, Int(Rnd * db) + 1, 1)
    Next
    Szoveget_General = st
    End Function

    Előre is köszönöm a segítségeteket.

    És mi a kérdés? :))

  • Homer
    tag

    időközben kész lett a programod?

    egyébként hagyd az acces-t, de még az mdf fájlokat meg az sql lite-ot is. Lassúak. De nagyon.

    Még ha fejlesztői környezetben gyorsnak is tűnnek, a kliens gépén "kínhalál".

    Amilyen futó környezetet vázoltál, arra alkalmas lehet egy postgresql szerver (pgadminIII-mal), van hozzá net connector, és iszonyú gyors. És még az adatokat sem lehet manipulálni fájl szinten, nem úgy, mint egy acces mdb esetében.

    Egyébként ajánlanám az sql áttanulmányozását. Hihetetlenül leegyszerűsítené a dolgodat szerintem.

    És nem kell félni a bonyolult sql utasításoktól. Pont erre találták ki.

    Szia Himre82!

    Nem lett még kész a progim, de apránként azért haladok vele. :)

    Nem akartam leírni az egész problémát mert hát nem várom el senkitől, hogy megodja helyettem, és tulajdonképpen csak egy-egy részében akadok el mindig. Ezekre itt-ott mindig találok is megoldást, csak később mindig máshol futok hasonló zsákutcákba. Na de akkor már ezt is közkincs tárgyává teszem:

    Sajna nem tudok sql servert használni, mert a progimat munkahelyi környezetben használnám majd, és ott nincs lehetőségem adatszolgáltatót üzemeltetni. :\ Ezért maradtam az access file-nál. Hogy ezt is magyarázzam egy picit, az Excel kezelésével a kollégák nagy része már találkozott, így nem okoz gondot nekik a táblák módosítgatása az eddig használt VBA makrós nyilvántartásban (...ezzel persze hibákat generálva a program futásában...). Tudom, itt is le lehetne védeni a munkalapokat jelszóval, de úgy gondoltam, ha már VB, akkor kicsit fejlesztem a tudásomat és gyakorlásképpen megpróbálom inkább megcsinálni az adatkezelő progit, ami már nem excel táblákat módosítgat, hanem igazi adatbázis motorra épül. (Most jöhetnek a kritikák, hogy akkor meg miért nem tisztán accessben csinálom meg? A kérdés jogos! A válsz: azért, mert tanulom a VB-t! Mivel nem szakmám a programozás, csak hobbi szinten űzöm! Szerintem ez is nagy dolog már, hogy idáig eljutottam önszorgalomból.) Az Exceles táblával amúgy azóta semmi gond nincs. Az első pár hiba után, amit manuálisan javítottam, elmagyaráztam többieknek, hogy mi okozta, és azóta mindenki rendesen használja, csak amikor azt megírtam, akkor még nem volt arra igény, hogy mind az állapotfigyelt, és mind a nem állapotfigyelt szerszámot egy rendszerben kezeljük. (A másik dolog, hogy a VB tudásom is sokat fejlődött azóta, és egy csomó dolgot már nem úgy csinálnék meg mint anno.)

    Az SQL áttanulmányozása egyébként jó ötlet! Egyet is értek veled, de egyelőre megmaradnék az SQL alapoknál. Később biztos ráfekeszem majd erre is, ha még érdekel majd a dolog. Tényleg jó dolgokat meg lehet csinálni vele, az eddigi tudásoml már elég ahhoz, hogy ezt belássam. :)

  • Homer
    tag

    Értelek. Ez esetben recordset-eket használnék. Az ablakok között milyen adatcserét akarsz? Ha egyszer módosítasz egy adatot, az úgyis visszaíródik a DB-be, és onnan kéred le legközelebb az adatokat.

    Tulajdonképpen egy "egyszerű" szerszámnyilvántartó progit szeretnék csinálni. A különböző féle szerszámokat egy táblában tartanám nyilván, a jellemzőiket egy másikban. A progival lehetne új szerszámot felvenni, átkönyvelni két tárhely közt, életutat figyelni (azaz mikor lett kikönyvelve és mikor kaptuk vissza). A "gond" az hogy a szerszámok közt van olyan amik egyformák, de meg kell különböztetni őket egymástól. Ezeket a rajzszámuk és egy egyedi azonosító alapján lehet egyértelműen meghatározni, de értelem szerűen a jellemzőik egy másik táblában ugyan azok. Remélem érthető vagyok.
    Nah, és itt jön az amit kérdeztem. Teszem azt az első Form-on megjelennének egy listbox-ban, vagy comboboxban, vagy datagrid-ben, vagy datagridview-ban ha már VB2010 :) - de tulajdonképpen tök mindegy - a jellemzőkben felsorolt szerszámok. Ha valamelyiket kiválasztom, akkor egy új ablakban (hogy miért új ablakban, annak is megvan az oka) egy listbox-ban már csak az ehhez tartozó egyedi azonosítók jelennének meg. Itt kiválasztom a megfelelő egyedit, majd egy könyvel gombon meg kellene adni hogy egyrészt kifelé, vagy befelé történt a könyvelés, egy állaptra vonatkozó típusú érték paramétert kellene megadni, és tulajdonképpen ennyi.
    Ezt a feladatot már többféle módon is megoldottam.
    Legegyszerűbb az volt, amikor a dataset megfelelő tábláit hozzákötöttem a vezérlők datasource tulajdonságaihoz. Itt ott akadtam el amikor egy kapcsolótáblával kellett volna dolgoznom. Tehát mondjuk a második ablakban a szerszám neveit - típus alapján - egy harmadik táblából (PL.: Szerszám neve a jellemzők táblában csak egy kód, amit a harmadik táblából tároltam) kellett volna kiválasztani. Ekkor gondoltam arra, hogy adatkészletből feltöltök egy objektum kollekciót (itt minden objektum már létrehozásakor kikeresi számára a hozá tartozó infókat (név, azonosító, tulajdonságok, állapotinfók...stb), majd ezeket már egyszerűen tologathatom a Formok közt. Így is megcsináltam. Itt tök egyszerű a szerszám beazonosítása ID alapján, és az SQL parancsok is végtelenül leegyszerűsödtek :). A formok közt is már csak egy kis kollekciót kell átadni. Véleményem szerint nem túl elegáns dolog viszont az, hogy feltöltök egy adatkészelet, aztán azt még "átképzem" objektummá, és innen ered a kezdeti kérdésem... Még arra gondoltam hogy egy (-két..-öt?) datareaderrel is meg lehetne oldani ugyan ezt, így még nem próbáltam, de a visszaíráskor akkor megint SQL-ben kellene megírni az utasítsokat, ami (szintén) nem erősségem. Meg hát szerintem még 100 más módon is meg lehetne oldani.

  • Homer
    tag

    Ez esetben első lépésként tanulj meg rendes adatbázist használni. Az Access felejtős (mondom én, aki rendszeresen programozok Access makrót is akár :B )
    Javaslataim:
    Egy jó kis SQL 2012 Express, vagy Local, vagy SQL Compact 4.
    Esetleg SQLite.
    De pl. MySQL-hez, és Oracle-höz is vannak normális EF providerek.
    Hidd el a fekete könyv VB6-os tudása mit sem ér. VB.Net szintaktikailag sem egyezik meg VB6-tal, maximum ránézésre. MSDN, Gugli lesz a barátod.

    Köszönöm a sok infót amit írtok! Az a helyzet, hogy nem tudok ilyen megoldásokat használni. Nézegettem már a MySQL-t, meg az SQL-t korábban, hogy képben legyek valamennyire miről is szól a kliens-szerver megoldás, de mivel munkahelyi gépen szeretnék kezelni adattáblákat, ott nem tudom megoldani, hogy adatkiszolgáló(ka)t telepítsek. A mezei futtatható exe-t viszont el tudom indítani majd, és egy megosztott mappába helyezett mdb file-t meg "egyszerű" lesz kezelnem, és létrehoznom is. ...gondoltam én, kis naív... :)

    Tudom, hogy igazatok van, VB és .NET majdnem ég és föld, viszont itthon azt telepítek amit akarok, ezért feltettem a VS2010-et, azonban benn a cégnél csak egy régi VB2003 van feltelepítve. (Ez is agyonra kicsontozva, de ez most mellékes. Még súgó sincs benne...) Ezért mondom, hogy felváltva használom mind a kettőt, így számomra mindegy, hogy .NET vagy sem, hogy 2003 vagy 2010, vagy akár az is hogy VS vagy annak csak egy része, azaz VB. :)
    Amúgy, nem kenyerem a programozás, mm nem szakmám. Csak úgy mellékesen tanulgatom ráérő időmben, mert néha sokat tud segíteni egy-egy excel makró is. :) Ennek sincs köze ugye a .NET-hez. .NET-ről olvasgatva meg, van pár(száz) oldalnyi eltérés, de sztem tök érthető a kód, ha eltérés van is. Az alapok hasonlók, ha nem is ugyan azok. Pl.: az alapok megértéséhez, kapcsolódáshoz szükséges objektumok megértéséhez hasznosnak találtam, de ízlések és pofonok kérdése. :) Am. az EF-ről eddig még nem hallottam, szal már kaptam hasznos infót tőletek, ezért jó fórumozni! Köszi még 1x!

    Visszatérve az alap kérdéseimre: Ti hogyan oldanátok meg ilyen feltételek mellett a program működését? Arra lennék kíváncsi, hogy minden egyes rekordot egy-egy objektum-ként kezelnétek és az objektumok felelnének az adatkészlebe írásért, vagy inkább az adatkészlettel "trükköznétek" közvetlenül?
    A másik kérdésem pedig az volt eredetileg, hogy az ablakok közti adatcserét hogyan oldanátok meg? Az egész adatkészlet public-ká minősítésével a programban, objektumok (objektum kollekciók) átadásával, új rekordkészletekbe másolnátok az első készlet megfelelő mezőit, esetleg valami más módon? (Belegondolva..., tulajdonképpen ebből ered az első kérdésem is :B :D )

  • Homer
    tag

    Neked lehet, hogy mindegy hogy VB6, vagy VB.NET, de sem technológia, sem környezet, sem terminológia szempontjából nem mindegy.
    Azaz, ha neked mindegy, akkor VB.NET...

    AE

    Hát jó, legyen... :)
    De akkor most az új kérdésem: lehet használni az EF-et helyi Access (mdb) adatbázis file kezeléséhez?

  • Homer
    tag

    úristen ez a kiolvastam a fekete könyvet már rosszul indul. Mikor is írták 2001-ben? :DDD
    Te most VB6-ozni tanulsz, vagy VB.NET 4-ezni? Sőt szólok, hogy még idén befut a VB.NET 4.5 (vagy 5?) is.
    Entity Framework-öt keresed úgy vélem. Tele van az internet hozzá tartozó tutorialokkal, a hivatalos honlapján vannak minta programok is.

    Mégsem jó ez a megoldás. Amennyire most látom, az EF-et nem tudom használni, csak SQL adatszolgáltatóval. Jól látom, hogy ha én egy adatbázis file-t szeretnék OLEDB-vel közvetlenül kezelni akkor ez nem használható?

  • Homer
    tag

    úristen ez a kiolvastam a fekete könyvet már rosszul indul. Mikor is írták 2001-ben? :DDD
    Te most VB6-ozni tanulsz, vagy VB.NET 4-ezni? Sőt szólok, hogy még idén befut a VB.NET 4.5 (vagy 5?) is.
    Entity Framework-öt keresed úgy vélem. Tele van az internet hozzá tartozó tutorialokkal, a hivatalos honlapján vannak minta programok is.

    :$
    Igazából nekem tök mindegy, hogy VB6 vagy VB net. :) Lehet furán hangzik ez így, de alapnak sztem jó volt a könyv, és hozzá tudok nyúlni bármikor, ha éppen nem jut eszembe egy kifjezés szintaktikája.
    Nézegettem amit javasolsz! Lehetséges, hogy tényleg ezt keresem. :) Köszi!

  • Homer
    tag

    Sziasztok!

    Mint már korábbi hsz-eimben is írtam, autodidakta módon próbálom elsajátítani a VB-t, ezért előre is elnézést kérek, ha valami gagyi dolgot kérdeznék, amit természetes, hogy mindenki tud, csak persze én nem. :$
    Kérdésem annyi lenne, hogy oop-ban milyen módon érdemes felépíteni az objektumokat adatbázis kezeléshez? Honnan tudnám ezt megtanulni? Tudtok valami jó könyvet hozzá? A VB fekete könyvet végigolvastam, de számomra nem derül ki belőle, hogy mi lenne az optimális út.? Tulajdonképpen megismertem általa magát a nyelvet, csak nem tudom optimálisan használni. :S
    Egy konkrét, egyszerű példa, pl:
    oldedb-vel beolvasok egy adatkészletbe pár táblát, amik közt kapcsolatokat is definiálok. (Teszem azt személyeket tartok nyilván, ID alapján, mellette egy másik táblában a szemük színét. A két tábla közt pedig egy fordítótábla van. Pl: Az első tábla 1. személyéhez tartozik a második tábla 6. sorában található kék szín. Ezt tárolja a 3. tábla.) Eddig gyönyörű is a történet, megvannak a kapcsolatok, tudok vezérlőket kötni a táblák adataihoz is, ez alapján akár még szűrni is a grid megfelelő sorait. Mondjuk módosítani akarok bizonyos adatokat vezérlőkkel, és nem közvetlenül egy kapcsolt datagrid-ben, esetleg egy új formon, amiben ki akarom választani egy combobox-ban a személyt, majd szemszínt egy listbox-ból. A változást vissza akarom írni az Access mdb file-ba.
    Itt jön a kérdésem. Ha a fenti módon járok el, akkor a formok közti adatátadás során a készlet szűrt sorainak átadása jelent gondot, hiszen a szülő form adatait csak a sorszámuk alapján tudom elérni, vagy generálni kell hozzá egy key-t, ami véleményem szerint plusz adatokat generál. Sikerült így is megcsinálnom a progit, ami hellyel-közzel működött is.
    Csinálhatnék az új formon is egy új adattáblát, amibe „átmásolom” a szülő form eredménylistáját a form deklarálása után.
    Aztán gondoltam személy-objektumokkal próbálom megoldani. Ekkor csináltam minden egyes emberről egy objektumot. Az objektum tartalmazta a személy ID-jét is, így egyszerű volt kikeresni a táblában, hogy melyik személyre vonatkozik a módosítás. Megúsztam a formok közti adatcsere gondját is, hiszen egy kollekcióban át tudtam adni az összes módosítani kívánt személyt, ID-vel együtt. Itt viszont azért kellett plusz adatokat generálni, mert beolvastam az adattáblák adatait az adatkészletbe, aztán onnan megcsináltam az objektumokat, ergo mindent 2x kellett memóriába tölteni, cserébe viszont egyszerű volt megkeresni, hogy melyik sort kell módosítani a készletben, és az adatkészlet tábláinak update-elése is tötrénhetett egy-egy sima dataadapter.update(dataset) procedúrával.
    Még arra is gondoltam, hogy a kettő fenti megoldást lehetne ötvözni, és olyan objektumokat létrehozni, amelyek nem az adatkészletből generált komplett adatobjektumokat kezelnek, csak bizonyos rekordmezőket tárolnék bennük aztán ez alapján beazonsítom a kívánt sort, majd elvégzem a kívánt módosítást az adatkészletre való közvetlen hivatkozással.
    Remélem értitek a kérdésemet! Ezt hogy szokta megoldani egy vérbeli, ultraexpert, unatkozó programozó? Tudtok esetleg olyan oldalt ahol példákat találhatnék hasonló tipikus feladatokról? Nem kód érdekelne tehát, hanem az alapelgondolás. Mire építsem fel az objektumok rendszerét, és mikor? Úgy értem, esetleg egy datareader ismegoldás lehet, ahol nem kell adatkészletet feltölteni. Így egyből tudnék objektumokat létrehozni.

    Előre is köszi minden válaszra méltónak!

  • Homer
    tag

    És végezetül, hogy ezzel is bővítsük a kérdező fegyvertárát, van még egy lehetőség az adatok bekérésére! Ez pedig az inputbox:

    dim uj_valtozo as string
    uj_valtozo=Inputbox("Mi legyen az új változó értéke?")

    Talán hasznos lehet ez is.

    Még egy kicsit gondolkodtam rajta. Ez is működik: :)

    If MessageBox.Show("Hello", "Hello", MessageBoxButtons.YesNo) = DialogResult.Yes Then MsgBox("Ráokéztál")

  • Homer
    tag

    Szerintem erre gondolsz:

    dim ujform as new form
    if ujform.showdialog =dialogresult.OK then....

    Itt a dialogresult eredményét neked kell beállítani a dialog-ban.

    És végezetül, hogy ezzel is bővítsük a kérdező fegyvertárát, van még egy lehetőség az adatok bekérésére! Ez pedig az inputbox:

    dim uj_valtozo as string
    uj_valtozo=Inputbox("Mi legyen az új változó értéke?")

    Talán hasznos lehet ez is.

  • Homer
    tag

    eredmeny() = MsgBoxResult.Ok ez tuti hülyeség. Nem 100%, hogy jó megoldás, mert jóideje nem VB.Net-ezek, de
    If MsgBox("Biztos ki akarsz lépni? Mindent mentettél?", Title:="Kilépés", Buttons:=MsgBoxStyle.OkCancel) = = DialogResult.OK Then Close()

    Így már a feltétel jó lesz, a Close rémlik, hogy jó, bár lehet, hogy Exit kell helyette? Close az aktuálisan nyitott form-ot zárja, ha ez az egy volt csak nyitva, akkor egyenértékű az Exit-tel.

    Új ablakot pedig valami ilyesmivel tudsz létrehozni

    dim formuj as form - ide majd a VS-ben megcsinált formod neve fog kelleni a form helyett
    majd formuj.Show-val jön fel az ablak.

    Szerintem erre gondolsz:

    dim ujform as new form
    if ujform.showdialog =dialogresult.OK then....

    Itt a dialogresult eredményét neked kell beállítani a dialog-ban.

  • Homer
    tag

    Sziasztok !

    Most kezdek ismerkedni a Visual Studio 2010 VB részével.

    Egy olyan problémába akadtam amivel valamiért nem bírok boldogulni, pedig valószínűleg egyszerű, és kézenfekvő a megoldás:

    Private Sub KilépésToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles KilépésToolStripMenuItem.Click
    MsgBox("Biztos ki akarsz lépni? Mindent mentettél?", Title:="Kilépés", Buttons:=MsgBoxStyle.OkCancel)

    If eredmeny() = MsgBoxResult.Ok Then Close()

    Valamiért nem tudok kilépni.. Valószínűleg nem jól, vagy nem megfelelően kérdezem le az MsgBox visszatérési értékét. Vagy egyszerűen az MsgBox-ra értődik a Close() utasítás így?

    Egy másik kérdésem az lenne, hogy milyen utasítással lehet egy formon felépített menüszerkezetből ( Private Sub ValamiToolStripMenuItem1_Click(sender As System.Object, e As System.EventArgs) Handles ValamiToolStripMenuItem1.Click )
    egy új ablakot felhozni, amin pár adat bekérhető, pld inputbox, stb.. és ezek eredményeit visszaadni a főalkalmazásnak?

    Hello,
    én így csinálnám:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e _
    ..........................As System.EventArgs) Handles Button1.Click
    .........Dim valasz As integer
    .........valasz = MsgBox("Hello", MsgBoxStyle.YesNo, "Semmi")
    .........MsgBox("A válaszod: " & valasz)
    End Sub

    Eszerint az igen válasz esetén a valasz változó értéke 6 nem esetén pedig 7. ;)

    ...mondjuk ez nem VS2010 hanem VB2003, de sztem használható lesz...

    ... ha pl kilépésre akarod használni akkor tovább folytatva:

    if valasz = 6 then end

  • Homer
    tag

    Sziasztok!

    Itt mindig olyan segítőkész emberkékre találok, remélem mostani kérdésem is válaszra talál majd. A feladat a következő lenne: Adott két táblázat (munkalap), és a két táblázat különbségét kéne venni, ezt egy haramadik táblázatba (munkalapra) kéne tenni. Erre érdemes makrót írni, vagy valamit tud ezzel az excel kezdeni egyszerűen is?

    pl: adott A és B táblázatból készítünk egy C táblázatot mely AB különbségeit tartalmazza.

    (A) táblázat (oszlopokat kötőjellel választom el):

    a - 2 - 3
    a - 3 - 7
    b - 1 - 2
    b - 3 - 4

    (B) táblázat:

    a - 2 - 3
    a - 3 - 7
    b - 3 - 2
    b - 3 - 4
    c - 1 - 1

    (C) eredmény táblázat:

    b - 1 - 2
    b - 3 - 2
    c - 1 - 1

    Úgy is felfoghatjuk, hogy olyan program kell, ami azon adatokat teszi be egy táblázatba amely adatból adott A vagy B táblázatban csak az egyikben szerepel, tehát aminek a másik táblázatban nincsen párja.

    Várom az ötleteket, illetve megoldásokat. Köszönöm előre! :o))

    Elképzelhetőnek tartom, hogy a kimutatás eszközzel lehet makró nélkül is ilyet, de nem biztos.

  • Homer
    tag

    Sajnos ez van.

    Pénz nincs semmire, tehát a lightswitch kilőve.
    Az Oracle-t használja a cég (a központi szoftverünk arra lett írva), de kétlem, hogy a szerverhez kapnánk hozzáférést, mivel az a központban van, mi meg megyei szinten vagyunk.
    Az Access járható út lenne (gondoltunk is rá), de sajnos ahhoz még annyit sem konyítunk mint az excelhez és a VBA-hoz.

    Megj.: a gazdálkodói adatbázis jelenleg is excelben van (ugyan így VBA-val "megbolondítva"), de eljárt felette az idő. Új tartalmak szükségesek és megváltoztak az elvárásaink is, így arra gondoltunk, hogy már egyszerűbb újra írni, (és persze akkor már a funkciókat is kibővíteni) mint toldozni-foltozni.

    Esetleg ha lenne egy mentor akkor elkacérkodnánk az access gondolatával, de anélkül egyikünknek sincs annyi (fölös) munkaideje, hogy önerőből belevesse magát a dologba.

    Szerk.: a félreértések elkerülése végett, ez nem kiadott munka, inkább a saját munkánk megkönnyítése, és kihívás is egyben.

    Juhuhuhúú... :) Azt kell, hogy mondjam, részben egyetértek az előttem szólóval. Az excel már ehhez egy kicsit kevés, és nem erre való!

    Ami miatt viszont meg tudlak érteni, az az hogy hasonló cipőben járok. A cégnél ahol dolgozom nekem is sokat segít a makró, és én is ezért kezdtem el foglalkozni a VB-el és a VBA-al. Nálunk SAP van és abban kellene megoldani a hasonló feladatokat, de a fejlesztés időbe telik, és az a szomorú tapasztalatom, hogy ha kérünk egy programfejlesztést akkor hosszas várakozás után ugyan történik valami, de mégsem olyan lesz a z új program mint amilyet szerettünk volna.Hasonó kaliberű programokat írogattam már én is a könyvelgetéseinkhez. (SAP mellett! Egyik kollégám szerint az SAP a "Sz*pjon A P*raszt"-nak a rövidítése :) )

    Kérdésedre:
    Én egyesével töltögetném fel az oszlopban lévő adatokkal a combobox items gyűjteményét.

    valahogy így:

    dim e as scripting.dictionary
    for each elem in column(x)
    ...if not consist e elem.value and elem.value<>"" then e.add(elem.value
    next

    A fenti megoldás csak ötletelés, nem írtam be sehová, tehát valszeg nem működik ha copy-paste-zed :)

  • Homer
    tag

    Igen, a VBA makró jártasságod következő szintje, amikor visszatérsz a gyári függvényekhez, és szükség szerint azokat hívogatod makróból.
    A HOl.VAN egyébként az OFSZET-tel kiegészítve brutál dolgokat tud.

    :) Valóban "érdekes" megoldás, de a lehetőség adott hozzá...

  • Homer
    tag

    Üdv!

    Esetleg mit szóltok az excel "hol.van" (match) függvényére. Nekem úgy tűnik használható lenne az adott problémára.

    Az ötlet egyébként a kollégámé, őt illeti a dícséret.

    Microsoft excel súgó:
    "A függvény egy olyan elem tömbben elfoglalt relatív pozícióját adja vissza, amely megadott értékkel megadott módon egyezik. A HOL.VAN abban különbözik a többi kereső függvénytől, hogy a megtalált elem helyét adja meg, és nem magát az elemet.

    Szintaxis

    HOL.VAN(keresési_érték;tábla;egyezés_típus)

    Keresési_érték: Az az érték, amelynek segítségével a táblázatban a keresett érték megtalálható."

    Én még sosem használtam eddig a HOL.VAN függvényt, de jah, igazad van! Azzal is meg lehet oldani a feladatot. (Mondjuk a fenti megoldásom is hasonló eredményt adna.) :)
    A konkrét feladattól függ, hogy én melyiket használnám. Ha nem muszáj makrobizni, akkor én a helyedben megmaradnék a "gyári" függvényeknél...

  • Homer
    tag

    A baj az, hogy amit szeretnél az kivitelezhető, de összetettsége miatt baromira nem egy fórum keretein belül.
    Klasszikusan elértél arra a szintre, ahol vagy veszed a fáradtságot és magadtól kimókolod a megoldást, vagy fizetsz érte, és helyetted egy szabadúszó programozó valamelyik ráérős estéjén megcsinálja neked.

    Nem olyan bonyolult ez. Nekem nem ez a munkám, de érdekel a dolog.
    Ezt hoztam össze:

    Public Sub proba()
    ....MsgBox (keres("h"))
    End Sub

    Public Function keres(mit As String) As Integer
    ...Dim elem As Object
    ...Dim oszlop As Integer
    ...oszlop = 0
    ...For Each elem In Range("A1", "Q1")
    .....oszlop = oszlop + 1
    .........If mit = elem.Value Then
    .............keres = oszlop
    .........End If
    ...Next
    End Function

    Hogy olvashatóbb legyen bepontpontpontoztam. :) Persze ha picit még gondolkodnék rajta biztosan találnék más megoldást is. (Pl. az elem típusa nem túl elegáns object-ként kezelve, dehát műxik.)

    A lényeg, hogy ha írsz egy ilyen function-t akkor azt bárhányszor meghívhatod a fenti sub-ban. Ez a megoldás A-tól Q oszlopig vizsgálja az egyezéseket. Ha nincs egyezés akkor 0-val tér vissza a függvény.

  • Homer
    tag

    Üdv!

    Ez akár jó is lehetne, de túl hosszú és ha jól látom akkor minden egyes (keresett) oszlopfejléc szövegre meg kéne írni, ami több fáradtság lenne, mint ha minden egyes változáskor (ami mondjuk ritkán fog változni ha egyszer elkészült az egész) kézzel újraszámozom a megfelelő kódrészletet.

    Nincs esetleg valami rövidebb megoldás?

    Én gondoltam a vlookup-ra, de aztán elvetettem, minthogy meg kéne adni melyik oszlopban keresse a keresési értéket, de ha ezt tudnám akkor már nem volna szükség az egészre.

    Tulajdonképpen nekem az is elég lenne, ha találnánk valami olyan megoldást ami megmondja, hogy a keresett szöveg milyen számú oszlop milyen számú sorában van (persze elég csak az oszlop száma is). Innen már nyert ügyünk lenne.

    Egyébként köszönöm az eddigi ötletelést is!

    Ha olyan függvényt írsz ami paraméterként megkapja a keresett szöveget, visszaadási értéke pedig az oszlop száma, akkor elég egyszer megírni, utána használhatod a függvényt ahányszor, és ahol csak akarod!

    Valahogy így:

    private function oszlop(byval mitkeresel as string) as integer
    itt, a fent leírt módszerrel a fejlécsor összes elemén végigmész, majd
    ha megvan a keresett oszlop akkor
    return keresettoszlopszám
    else
    msgbox("Nincs meg minden oszlop")
    end

  • Homer
    tag

    Üdv!

    Ez akár jó is lehetne, de túl hosszú és ha jól látom akkor minden egyes (keresett) oszlopfejléc szövegre meg kéne írni, ami több fáradtság lenne, mint ha minden egyes változáskor (ami mondjuk ritkán fog változni ha egyszer elkészült az egész) kézzel újraszámozom a megfelelő kódrészletet.

    Nincs esetleg valami rövidebb megoldás?

    Én gondoltam a vlookup-ra, de aztán elvetettem, minthogy meg kéne adni melyik oszlopban keresse a keresési értéket, de ha ezt tudnám akkor már nem volna szükség az egészre.

    Tulajdonképpen nekem az is elég lenne, ha találnánk valami olyan megoldást ami megmondja, hogy a keresett szöveg milyen számú oszlop milyen számú sorában van (persze elég csak az oszlop száma is). Innen már nyert ügyünk lenne.

    Egyébként köszönöm az eddigi ötletelést is!

    Ha olyan függvényt írsz ami paraméterként megkapja a keresett szöveget, visszaadási értéke pedig az oszlop száma akkor elég egyszer megírni:

    Pl:

    private function oszlop(byval mitkeresel as string) as integer
    itt pedig a fent leírt módszerrel
    end

  • Homer
    tag

    Én úgy oldanám meg első körben, hogy a fejléc sorain végigmennék egy each cells in row(1) ciklussal, aztán egy változóban eltárolnám azt az oszlopszámot ahol a cella értéke megyezik a keresett oszlopnévvel. Ezután már hivatkozhatsz arra az oszlopra mint oszlop sorszám...

    Vagy pl:

    Public Sub test()
    Dim Keresett As String
    Keresett = "Keresettoszlopszövege"
    oszlop = 1
    Dim megvan As Boolean
    megvan = False
    While Worksheets("Munka1").Cells(1, oszlop) <> Keresett And Not megvan And _ Worksheets("Munka1").Cells(1, oszlop) <> ""
    oszlop = oszlop + 1
    If Worksheets("Munka1").Cells(1, oszlop) = Keresett Then megvan = True
    Wend
    If megvan Then MsgBox (Keresett & " megvan, a következő oszlopban: " & oszlop) Else MsgBox ("Nincs meg")
    End Sub

    Mondjuk ha a keresett oszlop pont az első akkor nem működik, de nem tartana sokáig módosítani, hogy azzal is működjön. (Neked is hagyok gondolkodni valót :) )

  • Homer
    tag

    Halihó!

    Egy újabb problémával találtam magam szemben VBA kapcsán.

    Van nekem egy adattáblám ami, ugyebár tartalmazza az adatokat.
    Userformon szeretnék keresést eszközölni a megfelelő kulcsadat segítségével.
    A probléma pedig abban áll, hogy jelenleg csak úgy tudom visszakérni a megfelelő sor megfelelő oszlopának adatát, ha megmondom neki, hogy hanyadik oszlopból kérem vissza a kívánt adatot.
    A cél viszont az lenne, hogy ne oszlopszámot kelljen megadnom, hanem az oszlopfejléc nevét, mert könnyen lehet, hogy még plusz oszlopokat kell közbeszúrnom, és ekkor minden egyes oszlopszámra hivatkozó kódrészletet újra kéne kézzel számolnom.
    Jelenleg így használom:

    ComboBox4.Text = gtorzs.Cells(gsor, 7)

    ahol gtorzs=a munkalap neve
    gsor=a kiván sor sorszáma
    7=oszlop száma

    Tehát azt szeretném, hogy a "7" helyett legyen az oszlopfejléc neve (tudom, az hosszabb lesz, de így bárhová tehetném a táblán belűl).

    Hogyan tudnám ezt kivitelezni?

    Köszönöm a segítséget!
    Üdv, vilag

    Én úgy oldanám meg első körben, hogy a fejléc sorain végigmennék egy each cells in row(1) ciklussal, aztán egy változóban eltárolnám azt az oszlopszámot ahol a cella értéke megyezik a keresett oszlopnévvel. Ezután már hivatkozhatsz arra az oszlopra mint oszlop sorszám...

  • Homer
    tag

    Köszönöm ez egyelőre jó. Az előző formátumnál arra gondoltam hogy ez a színezés ez egy előre formázott táblázatban lesz, nagyon sok oszlopa van azért kell ez hogy az egész sort átszínezi ha rajta állok és ha más sorba kerül az aktív cella akkor, az előző sornak a formátumát állítsa vissza. Nem tudom mennyire írom érthetően, még eléggé amatőr vagyok VBA-ból :D

    Örülök, hogy segíthettem. :)

    Egyébként ajánlok neked is egy könyvet:
    Balogh Gábor - Visual Basic és Excel programozás
    a neten megtalálod...

    Megpróbálom elmagyarázni mi nem volt teljesen világos:

    - Szóval ha van egy táblázatod amiben minden sor (esetleg minden oszlop is) egyforma formátumú, akkor nem gond ha előre meghatározott stílust állítasz be default értéknek.
    régi sor(x) stílus = régi formátum

    - Ha a sorok megegyeznek, de az oslopok formátuma eltér (pl színük más) akkor a cellék formátumát egyesével kell állítgatni.
    régi cella(régi sor, oszlop(1...x)) formátuma = default cellastílus (régi sor, oszlop(1...x) formátuma

    - Ha az eredeti sorok formátumai is eltérnek egymástól (azaz különbözőek), akkor még bonyolultabb a helyzeted, mert a default értéket az eredeti stílus szerint kell meghatározni.
    tehát pl a visszaállításnál a
    cella1 stílus = eredeti cellaformátum1.oszlop
    cella2 stílus = eredeti cellaformátum2.oszlop
    ...

    Tudom nem teljesen érthető a magyarázat, bocs. :)

  • Homer
    tag

    Üdv.

    Tud valaki linkelni olyan forrást, amelyből megtanulhatom a VB.NET szintaktikáját? :R

    Üdv.

    Pár könyv amiket én nézegettem:
    Magyar és angol nyelven is elérhetők:
    Fekete (és Kék) könyv. (Black book)
    Alex Mackey - A NET 4.0 és a VS 2010

    Csak angol:
    Visual Basic 2010 Programmer's Reference
    Professional Visual Basic 2010 and .NET 4
    Visual_Studio_2010_All-in-One_For_Dummies

    ...és ha nagyon kezdő vagy (, mint én is), akkor ezek is hasznosak lehetnek, mert a VB alapok elsajátításához szerintem jók:
    James Foxall - Tanuljuk meg a Visual Basic 2005 használatát 24 óra alatt
    Demeter M. Ibolya - Visual Basic 6.0 lépésről lépésre
    Juhász Tibor, Kiss Zsolt- Visual basic 2008-2010 Programozasi összefoglalo
    Tóth Bertalan - Programozzunk vb rendszerben

    (Úgy írtam a neveket, hogy rákeresve gugliban az első-második találat már a közvetlen link lesz.)

  • Homer
    tag

    Sziasztok!

    Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("A1:A50")) Is Nothing Then Exit Sub
    If Selection.Cells.Count > 1 Then Exit Sub
    If Target <> "" Then
    Rows(Target.Row).Interior.ColorIndex = 10
    Else
    Rows(Target.Row).Interior.ColorIndex = xlNone
    End If
    End Sub

    ezt a programot szeretném úgy átalakítani hogy ha kijelölök egy cellát akkor az egész sort beszinezze, de ha másik cellát jelölök ki akkor az előző sor visszaálljon az előző állapotába.

    Szia!

    Nem teljesen értettem amit akartál, de ha minden igaz akkor ilyesmi válaszra vársz. :)
    Egyrészt az nem teljesen világos, hogy az intersect minek bele? Gondolom a több cella egyszerre történő kijelölése végett van benne, így ez esetben az általam javasolt megoldás nem működik majd. De azért gondolkodtam rajta. Tess:

    Public elozo, default As Integer
    Const uj = 3

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    'Az új sor színének beállítására
    Rows(Target.Row).Interior.ColorIndex = uj

    'Annak a vizsgálatára, hogy kell-e visszaállítani formátumot, azaz első kijelölés, vagy már volt előtte kijelölve valami?
    If elozo <> 0 Then
    Rows(elozo).Interior.ColorIndex = default
    End If

    'Az előzőleg kijelölt sor száma
    elozo = ActiveCell.Row

    ' itt az eredeti cella formátumát kellene beállítani az 5 helyett de ezt pontosan nem értettem a leírásodból... :S
    default = 5
    End Sub

  • Homer
    tag

    Helló,

    Kösz az ötleteket, sajnos a megoldás nem ez lett. :F Nem értem, hogy miért, de annak ellenére, hogy egy alőző sorban aktiválom (mindegy, hogy .select vagy .activate-el) a cél munkalapot, a rows(n).select sort csak úgy fogadja el, hogy előtte a munkalapot is beírom.
    Ez működik:
    Worksheets("missing cost centers").Activate
    Worksheets("missing cost centers").Rows(n).Select

    Ez nem működik:
    Worksheets("missing cost centers").Activate
    Rows(n).Select (Rows(CStr(n) & ":" & CStr(n)).Select -el sem)

    A makrót ugyan a forrás munkalaphoz hoztam létre, de ha ez a baj, akkor sem értem a hibaüzenetet. Ha a cél munkalap aktiválása a sor kiválasztás sorra már nem hat, akkor miért nem választja ki az n. sort az anya-(forrás)munkalapon???

    Úgy látszik itt még bőven van mit megtanulni a hivatkozásokról, mert a hétköznapi logika alapján ez elég katyvasz.

    Egyébként kösz a tippeket, a cellánkénti másolás és a képernyőfrissítés kikapcsolása is hasznomra lesz még. :))

    Derűs, dolgos munkanapot

    Szia!
    "A makrót ugyan a forrás munkalaphoz hoztam létre..."
    Szerintem ezzel is lehet gond. Csinálj egy modult és másold át abba a makródat. Egy próbát megér.

    Közben rájöttem, hogy balgaságot írtam. :B
    A Rows nem csak Stringet hanem integert is el kellene hogy fogadjon, tehát a
    Rows("2:2").select-nek ugyan úgy működnie kéne mint a Rows(2)-nek.
    Bocs. :)

  • Homer
    tag

    sziasztok,
    én is most teszem kezdőlépéseimet vba-ban. és nem szeret engem. se.

    egy óriási adathalmaz adott feltétel alapján kiválasztott sorát szeretném egy másik munkalap, változóban (n) tárolt számú sorába másolni. kreáltam is egy kódot.

    Do
    Sheets("tools in SAP 3100").Activate 'forrás munkalap

    If Cells(i, 14) = "#Hiányzik" Then
    Rows(i).Select ' átmásolandó sor
    Selection.Copy
    Sheets("missing cost centers").Select 'cél munkalap
    Rows(n).Select 'ezen a ponton kiakad, Application-defined or object defined error üzenettel Hibakód:1004
    ActiveSheet.rows(n).Paste
    n = n + 1

    End If
    i = i + 1

    Loop Until Cells(i, 1) = ""

    sajnos a hibakód helpjét elolvasva sem kaptam a leghalványabb utalást sem hogy mi a nyűgje. két sorral feljebb pedig ugyanez az utasítás működik.

    van valakinek ötlete, hogy miért nem vagyunk barátok?

    előre is kösz,
    derűs, dolgos munkanapot

    Ha tudod a sorok számát akkor még ehhez hasonlóval is próbálkozhatsz:

    For Each elem In Range("A1:A10")
    MsgBox (elem.Text)
    Next

  • Homer
    tag

    sziasztok,
    én is most teszem kezdőlépéseimet vba-ban. és nem szeret engem. se.

    egy óriási adathalmaz adott feltétel alapján kiválasztott sorát szeretném egy másik munkalap, változóban (n) tárolt számú sorába másolni. kreáltam is egy kódot.

    Do
    Sheets("tools in SAP 3100").Activate 'forrás munkalap

    If Cells(i, 14) = "#Hiányzik" Then
    Rows(i).Select ' átmásolandó sor
    Selection.Copy
    Sheets("missing cost centers").Select 'cél munkalap
    Rows(n).Select 'ezen a ponton kiakad, Application-defined or object defined error üzenettel Hibakód:1004
    ActiveSheet.rows(n).Paste
    n = n + 1

    End If
    i = i + 1

    Loop Until Cells(i, 1) = ""

    sajnos a hibakód helpjét elolvasva sem kaptam a leghalványabb utalást sem hogy mi a nyűgje. két sorral feljebb pedig ugyanez az utasítás működik.

    van valakinek ötlete, hogy miért nem vagyunk barátok?

    előre is kösz,
    derűs, dolgos munkanapot

    Szia!
    Ha tudod a sorok számát akkor:

    Sub Akarmi()
    Worksheets(1).Select
    Dim ujsor As Integer
    ujsor = 1
    For Index = 1 To 10
    Rows(CStr(Index) & ":" & CStr(Index)).Select
    If Cells(Index, 2).Text <> "#HIÁNYZIK" Then
    Selection.Copy
    Worksheets(2).Select
    Rows(CStr(ujsor) & ":" & CStr(ujsor)).Select
    ActiveSheet.Paste
    Worksheets(1).Select
    ujsor = ujsor + 1
    End If
    Next Index
    End Sub

    Egyébként én cellánként másolgatnám az értékeket anélkül, hogy mindig kijelölgetném a második worksheetet valahogy így:

    Ha a vizsgált cella értéke megfelelő akkor
    Worksheets(2).Cells(XY).text=worksheets(1).cells(ZY).text
    (Sokkal gyorsabb lesz afutása a makrónak, és nem vibrál a kép futás közben ;) )

    Jah, bocs, elfelejtettem írni, hogy az a baj, hogy a sor kijelölésének formája:
    Rows("1:1").select
    Ebből gondolom látod mi a gond: String paramétert várna a rows sub
    Remélem segítettem :)

  • Homer
    tag

    Listview-ból törlés:

    ListView1.Items.Remove(RowNum) - ahol rownum a listview selecteditem-je

    Ha a fenti törlés megy, talán a legáltalánosabb megoldás, hogy a maradék listview elemekből csinálsz egy új kollekciót, a régi kollekciót meg letörlöd.

    Kár, hogy nem árultad el, hogy mi is a feladat pontosan, mert így marad a hülye kérdésre hülye válasz játék. Azért remélem a fentiekkel tudtam segíteni.

    Ne haragudj meg, de nem szeretném elárulni pontosan mi a feladat, és szerintem nem is az a fórumozás célja, hogy más oldja meg helyettünk a feladatot. Ezért kérdeztem általánosságban. Így lesz véleményem szerint a legtöbb fórumozó számára hasznos az általad javasolt megoldás is.

    Egyébként köszönöm a hsz-edet! A listview-ból való törlés valóban egyszerű megoldás lenne, csak szerintem nem túl elegáns ilyenkor újraépíteni a kollekciót.

    Mivel a kollekció elemeire csak az indexükkel lehet hivatkozni, az okozta a gondot, hogy a névsorba rendezett lista indexei összekeveredhetnek az eredeti kollekció indexeihez képest. A megoldást közben én is megtaláltam (pár órás próbálkozással rájöttem), hogy a collection elemeire lehet key-el is hivatkozni. Mivel a key sem visszakereshető programból, (így a listview feltöltésekor sem tudom átadni az adott elem key-jét), a kollekció minden objektumához hozzárendeltem egy-egy key integert. Ezt a key-t átadva a kollekció remove metódusának törölhető a kívánt elem.

  • Homer
    tag

    Itt ma senki nem tud értelmesen beszélni? Az előbb egy emberke betett ide egy rakás kódot, de nem kért semmit, aztán meg írta, hogy tárgytalan, sosem fogjuk megtudni mit szeretett volna. :DDD
    Most jössz te, beömlesztesz ide egy rakás információt, csak éppen az nem derül ki, hogy mit is akarsz.
    Tanuljunk már meg kérdezni, és válasszuk már el a lényeget a lényegtelentől. Első körben csak erre válaszolj 1-2 mondatban:
    MI A FELADAT? Mit akarsz csinálni?
    Nem érdekel a listview-d, nem érdekelnek a collection-ök rokoni kapcsolatai. Azt mondd meg, hogy mi az alap felállás, mit szeretnél megoldani a programoddal?

    Az a kérdés, hogy:
    Ha egy kollekció elemeit listview-ban jelenítem meg akkor az egér jobb klikk-jére megjenő törlés menüponttal hogyan tudom kitörölni a kollekció megfelelő elemét?

    Egyébként a kérdőjel azt jelenti a mondat végén, hogy az egy kérdés lenne. A fenti hsz-ben pedig:

    "A kérdésem az lenne, hogy az ily módon feltöltött listview-ból hogyan tudom visszanyerni az eredeti objektum "helyét" a kollekcióban?"

  • Homer
    tag

    Sziasztok!
    Még csak a szárnyaimat bontogatom programozás terén, és nem is ez a szakterületem, de a munkám során néha jól jönne némi programozástechnikai ismeret, ezért vágtam bele a fejszémet a VB-be. Egy olyan dolgot szertnék kérdezni tőletek amire nem konkrét forráskódot várnék megoldásként, inkább az elméleti háttere érdekelne a dolognak.

    Adott egy collection amiben kétféle adattípusú adatot tárolnék. Az egyik féle osztályból (kereszteljük őket mondjuk "A-típus"-ra) létrehozott objektum tartalmaz vagy 5-6 féle mezőt + pár eljárást és függvényt a kezelésükre. A másik osztály (fantáziadúsan, legyen mondjuk "B-típus") az A típusból van örköltetve viszont még plussz 5 adatot tartalmaznának az ebből képzett objektumok. A kétféle objektum egy kollekcióba gyűjthető, és a "TypeOf(object) Is A-típus" kifejezéssel megállapítható az adott elem mezőinek mivolta is. Ahhoz, hogy a feltöltött listát megjeleníthessem használnék egy Listview1 objektumot.
    A lista elemeit fel tudom tölteni ehhez hasonló módon:
    ...
    For each elem as object in kollekció
    if typeof(elem) is Atípus then listview1.items.add(elem.mező_a)
    ...(elem.mező_b)
    ...
    else
    listview1...items.add(elem.méret1)
    next

    A kérdésem az lenne, hogy az ily módon feltöltött listview-ból hogyan tudom visszanyerni az eredeti objektum "helyét" a kollekcióban? Lehet hogy alapból rosszul gondolkodom és nem is így kéne hozzálátni a feladathoz. Már többféleképpen is próbáltam, de mindig zátonyra futok valahol. A gond akkor jelentkezik amikor kijelölök egy listaelemet és ki akarom törölni a kollekcióból. Arra gondoltam, hogy a törlési eljárásban deklarálok egy objektumot, aminek manuálisan visszatöltöm az adatmezőit és ezt az objektumot használom a beazonosításra.

    így valahogy:

    sub gomb1.click(...)handles gomb1.click
    obj.mező1 = listview1.selecteditems(0).items.tostring
    obj.mező2 = istview1.selecteditems(0).subitems(0).items.tostring
    ...(és így végig az összes mezőn)
    ...
    törlés(obj)
    end sub

    sub törlés(mit as object)
    kollekció.remove(mit)
    end sub

    Nagy balgaságot követek el így? Van ennél egyszerűbb mód, azon kívül hogy adatbázist használnék? (Még addig nem juttotam el a könyvben :$ :). Még egy dolog mielőtt valaki az index-ek használatán gondolkodna: A listview-ban emelkedő sorrendben szeretném megjeleníttetni az elemeket, ami azt eredményezi hogy pl a 100-adiknak beírt adat legelőre kerül 0-s index-el(!), viszont a kollekcióban pedig időrendi sorrend szerint vannak tárolva. Viszont ami egyszerűsíti a helyzetet az az, hogy egy objektum sem ismétlődhet a sorban.

    Előre is köszönöm ha valaki válaszra méltatna és megérti a kérdésemet! :)

  • Homer
    tag

    Nah, kipróbáltam a standard maszkokkal is de azokkal sem jól működik. Valakinek valami ötlet, hozzászólás? :S

    Üdv ismét! Gondoltam leírom amit azóta sikerült megtudnom. Azaz inkább azt írom le, hogy hogyan oldottam meg a feladatot. A maskedtextbox resetonspace tulajdonságának true-ra állításával a space-ekket "lekezeli a textbox". (Space inputra a maszk nem lép digitet ha azt a karaktert a maszk nem engedi, mint pl. a "0" maszk esetén.) Azonban így is gondot okozhat ha a user az arrow key-ekkel vagy egérrel elmozdítja kurzort begépelés közben. Ezt a kivételt utólag a MaskCompleted tulajdonság ellenőrzésével egyszerűen lehet kezelni. :) A megoldás tehát:

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    MsgBox(MaskedTextBox1.MaskFull)
    End Sub

    Private Sub MaskedTextBox1_TextChanged(sender As Object, e As System.EventArgs) Handles MaskedTextBox1.TextChanged
    If MaskedTextBox1.MaskCompleted Then Button1.Enabled = True Else Button1.Enabled = False
    End Sub

    A button1 így csak akkor elérhető ha teljesen ki van töltve a textbox, és oda pedig csak érvényes karaktereket (tehát space-t nem!) lehet írni. Probléma megoldva! :) Köszönöm mindenkinek aki esetleg gondolkodott rajta! :)

  • Homer
    tag

    Köszi a választ, bár nem sokat segít amit írtál. Sajna most éppen dolgozom, de ha este hazamegyek kipróbálom a predefined maskokat, hogy azok hogy viselkednek. Ha valaki kipróbálná közben írja már le a tapasztalatát és a véleményét! Köszi előre is! És... UP! :)

    Nah, kipróbáltam a standard maszkokkal is de azokkal sem jól működik. Valakinek valami ötlet, hozzászólás? :S

  • Homer
    tag

    fogalmam sincs sose használtam, winforms-t is már évekkel ezelőtt. Esetleg az előre definiált maszkokkal mit csinál?

    Köszi a választ, bár nem sokat segít amit írtál. Sajna most éppen dolgozom, de ha este hazamegyek kipróbálom a predefined maskokat, hogy azok hogy viselkednek. Ha valaki kipróbálná közben írja már le a tapasztalatát és a véleményét! Köszi előre is! És... UP! :)

  • Homer
    tag

    Sziasztok!

    A maskedtextbox osztállyal kapcsolatban egy érdekes dolgot tapasztaltam. Mindenkinél így működik, vagy én vagyok a láma ehhez (is)?
    Szal a problémám a következő: Az MSDN szerint a maszkolásnál a 0 maszk jelentése, hogy csak egy SZÁM KARAKTERT (0...9) fogad el a box, viszont azt KÖTELEZŐ megadni. 9-es maszk esetén kellene elfogadnia a space-t és valamilyen szám digitet.

    [link]

    Ehhez képest a 000-000 maszk simán engedi a " 1-234" vagy " - " vagy a "1 2- 3" karaktersorozatokat.
    Ez miért van? Hibás az osztály, vagy az MSDN leírás róla? Esetleg valami spec Visual Studio beállítás esetén műxik csak a dolog? Amiben próbáltam: Visual Studio 2010 (Visual Basic)

    Előre is köszönöm ha valaki segítő szándékú válaszra méltatna! :)

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

Hirdetés