Hirdetés

2024. május 3., péntek

Gyorskeresés

Útvonal

Fórumok  »  Szoftverfejlesztés  »  Visual Basic

Hozzászólások

(#1501) Cpt. Flint válasza ArchElf (#1500) üzenetére


Cpt. Flint
tag

Általánosságban: jó, majd olvasgatok, ha lesz időm. (de azért, mert _itt_ újonc vagyok, még nem bizti, hogy totál hülye is.)
VB 6.5, Office 2003 SP3

1-2. Melyik függvény hozza létre újra, ha public?
Én ezt csináltam (volna, ha menne):

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) 'Ügyirat főszámba csak számot enged írni

Dim vezerlo As Object
set vezerlo = ActiveControl
csakszam

End Sub

Sub csakszam()

If Shift <> 0 Then
vezerlo.Locked = True
Else
If KeyCode = 8 Or KeyCode = 46 Or _
(KeyCode >= 48 And KeyCode <= 57) _
Or (KeyCode >= 96 And KeyCode <= 105) Then
vezerlo.Locked = False
Else
vezerlo.Locked = True
End If
End If

End Sub

Úgy gondoltam, hogy amikor a KeyDown subból meghívom a csakszam subot, akkor a KeyCode és a Shift ott is ugyanazt az értéket fogja még tartalmazni. De nem, ezek kiürülnek. Akkor is, ha külön felveszem őket public változóként. Ezért a KeyDown subban mindkettő értékét kiíratom egy-egy saját változóba (kc=KeyCode, ks=Shift) és a csakszam subban már azokat használom. Ez nem probléma, csak két plusz sor és két plusz változó.
Kipróbáltad, hogy át lehet-e adni (úgy, ahogy írtad) a KeyCode-ot? Mert nálam nem lehet, csakszam TextBox1, KeyCode-re ezt kapom: Compile error: ByRef type mismatch.
És mint írtam, pont azt szeretném elkerülni, hogy a TextBox1-et bárhol is leírjam (értékadásba vagy érték átadásba), mert azt majd akkor minden egyes subban át kell írnom a megfelelőre (ráadásul még ComboBox is lesz). Ezért szeretném az ActiveControlt használni helyette, ami általános, és elvileg mindig azt adná, ami épp kell).
"le kell ellenőrizni, hogy az aktuális ActiveControl TextBox-e"
Leellenőriztem, nem az. De MIÉRT nem az, mikor azon van a fókusz, abban szerkesztek, abból fut le a KeyDown sub??? A VB helpje szerint az ActiveControl az, amelyik épp fókuszban van. De mégsem a TextBox1-et kapom, hanem a MultiPage1-et.
Próbáltam így: set vezerlo=MultiPage1.Pages(0).ActiveControl. Ez eggyel beljebb vitt, mert így Frame1-et kaptam eredménynek, amiben a TextBox1 is van, de még mindig nem a textboxot... És ez már ebben a formában úgysem érne semmit, hiszen már akkor ha a konkrét lapot meg kell adnom, az sem jobb semmivel, mintha éppenséggel a konkrét vezérlőt adom meg.
Én sem igen szeretem a globális változókat szaporítani, de miért kell elfelejteni? Van valami komoly hátrányuk?
3. Miért lenne hack? Ez egy egyszerű, frappáns megoldás, egy darab létező tulajdonságot állítok át, és a felhasználó annyit lát, hogy ha nem megfelelő billentyűt nyom, egész egyszerűen nem történik semmi. Nyista vágólap, mert a Ctrl+akármit ez a rutin a KeyCode-ok közül nem engedélyezi (ugye vizsgálom a Shift-et, és ha nem 0, akkor eleve locked, de ha éppen nem a Ctrl-ra, akkor meg a v-re lenne az).
4. sem a VB helpjében, sem az Object Browserben nem találok MaskedEditet, egyetlen Mask tulajdonságot leltem, ami csak a CommandBarButton-ra alkalmazható.
Osztályom sincs olyan, hogy MaskEdBox, vagy akár MaskedTextBox. Sőt, az ominózus MSMASK32.OCX sem található meg a gépemen.

Egyébként természetesen köszönöm a segítséget és az eszmecserét, sokat tanulok belőle. :R

(#1502) ArchElf válasza Cpt. Flint (#1501) üzenetére


ArchElf
addikt

Pedig jó volna ha megértenéd a változók hatókörét. Nem tudom milyen fejlesztési tapasztalatod lehet, de ez a VB-re nem nagyon terjed ki.

Anélkül elég nehezen tudom elmagyarázni azt, amit látsz (és nem éresz meg). De röviden azért megpróbálom:
- Ha egy függvény definíciójában van definiálva egy változó (vastaggal)
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
azt hiába definiálod előre, az adott függvényben az itt definiált "változat" fog élni.
- Ha definiálsz egy változót egy függvényben, attól még az onnan meghívott függvényekben a változó nem létezik. A változó hatóköre csak a definiálás helyére érvényes (kivétel a kód "gyökerében" globálisan definiált változók, de azok a függvényekben felüldefiniálhatók - pl. mint paraméter)
- Használd az Option Explicit parancsot (kód legelején), hogy lásd, hogy minden változód helyesen van definiálva (és nem írtál el sehol semmit). Ez az utasítás kikényszeríti a változók definiálását.

Az ActiveControl az aktuális konténerben aktív kontrolt kéri le. Arra meg kell nézned, hogy Container típusú-e és vannak-e tagjai, ha iden abban is meg kell nézni, hogy van-e aktív komponens -rekurzívan el lehet jutni az utolsó tagig, ami jelen esetben a TextBox1 komponens. De a KeyCode-ot és Shift-et nem lehet nem átadni. (Ha pedig odaírod, hogy ByVal - azaz érték és nem referencia szerinti átadás van -, akkor átkonvertálja neked az MSForms.ReturnInteger-t mezei Integer-ré)

Option Explicit

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
csakszam KeyCode, Shift
End Sub

Sub csakszam(ByVal KeyCode As Integer, ByVal Shift As Integer)
Dim Vezerlo As Control
Set Vezerlo = GetActive(ActiveControl)
'MsgBox TypeName(GetActive(ActiveControl))
If TypeName(Vezerlo) <> "TextBox" Then
Exit Sub
End If
If Shift <> 0 Then
Vezerlo.Locked = True
Else
If KeyCode = 8 Or KeyCode = 46 Or _
(KeyCode >= 48 And KeyCode <= 57) _
Or (KeyCode >= 96 And KeyCode <= 105) Then
Vezerlo.Locked = False
Else
Vezerlo.Locked = True
End If
End If
End Sub

Private Function GetActive(con As Control) As Control
If TypeName(con) = "UserForm" Then
Dim f As UserForm
Set f = con
Set GetActive = GetActive(f.ActiveControl)
ElseIf TypeName(con) = "MultiPage" Then
Dim mp As MultiPage
Set mp = con
Set GetActive = GetActive(mp.SelectedItem)
ElseIf TypeName(con) = "Page" Then
Dim pg As Page
Set pg = con
Set GetActive = GetActive(pg.ActiveControl)
ElseIf TypeName(con) = "Frame" Then
Dim fr As Frame
Set fr = con
Set GetActive = GetActive(fr.ActiveControl)
Else
Set GetActive = con
End If
End Function

AE

[ Szerkesztve ]

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#1503) martonx válasza ArchElf (#1502) üzenetére


martonx
veterán

ember te nagyon diplomatikus vagy. :R
Cpt. Flint pedig nem attól hülye, hogy itt mi a rangja, hanem a kérdése minőségétől.
Értsd ha egy programozás fórumban megkérdezed, hogy miért piros a majom feneke, akkor nem azért fognak kiröhögni mert újoncként kérdezed. Sőt egy újoncnak még esetleg jobban el is néznek egy ilyen kérdést.
Devportálon meg prog.hu-n mostanában renike24 nick tud olyanokat kérdezni ASP.Net vonalon, hogy ajánlom mindenki figyelmébe, aki jót akar röhögni. Próbáltam volna rávezetni a megoldásra (tanulás, olvasás), de még én lettem leszólva, hogy miért nem mondom meg a megoldást.
Biztos én vagyok a bunkó, de egyszerűen valami hihetetlen mélységekből jönnek elő ezek a mai fiatalok.

Én kérek elnézést!

(#1504) ArchElf válasza martonx (#1503) üzenetére


ArchElf
addikt

Igyekszik az ember (bár vannak bőven napok, amikor nem jön össze). :)
Az volt a szerencséje, hogy nem VB6, hanem VBA: így 5 perc alatt összedobtam a gépemen.

AE

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#1505) Cpt. Flint válasza ArchElf (#1502) üzenetére


Cpt. Flint
tag

nem vagyok fejlesztő. ez probléma? itt csak azok lehetnek tagok? mert akkor szorri, lelépek. autodidakta excel vba projekt író vagyok (mondjuk), félig kényszerből, félig szórakozásból. :B Az angolom is hagy kívánnivalót maga után, úgyhogy ha nagy ritkán végképp nem találok valamire megoldást, akkor szoktam jólelkű fórumozókhoz fordulni. nyilván valszleg magában az objektumorientált programozás alapjaiban is vannak hiányosságaim, ezt vagy elnézitek nekem, vagy nem. ha nem, akkor nem válaszoltok, volt már ilyen.
ha egy többszázas google találati oldalt linkelsz, az nemigen ösztönzi az embert olvasásra. ettől függetlenül szemezgettem belőle, de az általad írtakat sajna pont nem találtam meg.

"- Ha egy függvény definíciójában van definiálva egy változó (vastaggal)
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
azt hiába definiálod előre, az adott függvényben az itt definiált "változat" fog élni."
most már érteni vélem (úgy látszik, mégis el tudod magyarázni ha van kedved, ugye nem is kellett hozzá olyan hatalmas energia). arra valóban nem gondoltam, hogy a KeyDown függvény paramétereiben voltaképp újradefiniálom a változót...
de nekem úgy tűnik, a csakszam-hoz már elég ez is: Sub csakszam(KeyCode, Shift)

már látom, hogy mi volt a ByRef hiba oka; többféle változónévvel futottunk itt a példákban, aztán nem egyezett az átadott az átvettel. úgyhogy valóban, köszi, működik.

Az a GetActive nagyon frappáns ki hackelés :D, mélységes hálám a visszafejtésért (vannak benne önmagukban is új/hasznos dolgok számomra); de hogy miért (csak) így működik, azt nem tudod véletlenül? Szerintem az ActiveControl így elég használhatatlan/bacsapós önmagában... nincs olyan utasítás, ami ténylegesen, közvetlenül, azonnal azt az egy darab, fókuszban levő vezérlőt adná eredményül?

masked editre akkor semmi ötlet?

:R

(#1506) Cpt. Flint válasza martonx (#1503) üzenetére


Cpt. Flint
tag

"Cpt. Flint pedig nem attól hülye, hogy itt mi a rangja, hanem a kérdése minőségétől. ... Biztos én vagyok a bunkó, de egyszerűen valami hihetetlen mélységekből jönnek elő ezek a mai fiatalok."

Cpt. Flint nem hülye, csak ugyanolyan érzékeny, mint te. A "kérdés minőségétől" se lesz valaki hülye, legfeljebb tudatlan. Azért kérdez. Nem láttam a fórum szabályzatában, hogy csak okleveles, elsővonalbeli programozók lehetnek tagok és azok is csak – általad – értelmesnek minősített kérdéseket tehetnek fel. Nagyon szépen kérlek, ha hülyének tartasz, ne foglalkozz a hozzászólásaimmal. Bizonyára te is tudnál olyat kérdezni, amiért én körberöhögnélek (lehet, hogy már kérdeztél is máshol), és a lehülyézés bizonyára neked is rosszul esne (mert az ekkora arcoknak szokott leginkább).

Ja, és sajnos baromira nem vagyok mai fiatal. Valszleg pont ez az egyik oka annak, hogy kérdeznem kell, én nem úgy kezdtem, hogy 10 évesen már javascriptet írtam mondjuk, vagy akármi. Kb. egy avíttas FORTRAN könyv volt az első kapcsolatom a számítástechnikával. Lehet, azóta se vittem többre véleményed szerint, de ez annyira azért nem izgat. És hát hiába, nem ez a szakmám, úgyhogy ne kívánd tőlem, hogy nekiálljak informatikusnak tanulni, mielőtt kérdezek. Elég nekem a saját szakmámat követni, dolgozni, családot eltartani. Elhiheted, hogy csak akkor fordulok a fórumokhoz, ha sehol nem találtam számomra érthető megoldást. Aztán van aki bunkózik, van aki válaszol.

(#1507) ArchElf válasza Cpt. Flint (#1505) üzenetére


ArchElf
addikt

Azért olvasgass utána, jó? :) Google keresést csak akkor szoktam linkelni, ha az első oldalon nagyrészt csak releváns találatok vannak. Ebben az esetben nem szükségszerűen VBA témakörben - mivel ez az alapelv majd minden fejlesztői nyelvre azonos.

Amúgy em nagyképű itt általában senki (legalább is itt a programozás fórumon talán nem azok a befordult kockák vannak csak, mint máshol...) Másrész nem kell offenzívnek venni azt, hogy egyből az a reakció, hogy "hülyeségeket kérdezel". Attól még, hogy megsértödsz, hülye a kérdés - legalább is azt mutatja, hogy az alpokkal nagyon nem vagy tisztában. Nem probléma magában ez sem - csak nem kell feltétlen arra várni, hogy valaki megoldjon helyetted mindent - és nem kell érzelmi irányba terelni a dolgot, hiszen gyakorlati kérdésben jöttél.
Egy kis alázat nem árt, még ha nehezen is megy néha. Soha nem találkoztál az itt fórumozó emberekkel, és talán soha nem is fogsz - ha megvan a megoldás, vagy az oda vezető út, ne akadj fent azon, hogy valakinek rossz napja van. Itt mindenki önszántából magyarázná el (illetve - ha rossz napja van - éppen nem magyarázná el) 1001-szer az alapokat.

Ha hobbi szinten csinálod, szánj rá - még - egy-két órát, és máris csak annyi hátrányban leszel, hogy nem tudod egyből hogy merre indulj el (nem pedig alapvető problémáid lesznek).

GetActive - ha vannak benne új dolgok (a használt TypeName függvény kivételével) - pl. rekurzió, típusok, akkor tényleg mielőbb keríts egy (alapszintű, bármilyen nyelvet bemutató) programozási könyvet. Nem bántásból mondom: 20-30 oldal után kész megvilágosodásban lesz részed, ha van érzéked a témához.

Sub csakszam(KeyCode, Shift) - ebben az esetben u.n. Varian típusra deklarálod a változókat (típus nélküli változó), ami az értékadáskor pontosítja a változó típusát. Használata mellőzendő, hacsak nem elkerülhetetlen - mivel növeli a kód bizonytalanságát. Ugyanez vonatkozik az Option Explicit-re is: célszerű használni, mert rákényszerít a pontosságra.

MaskedEdit VB6 kontrol, nem VBA (VB 6.5 = Visual Basic for Applications = gyak. Office VB). Azért nem találtad, mert valami egységcsomagban lenne benne (asszem MS Common Controls, vagy valami hasonló) - neten rá kell keresni és lehetőleg MS oldalról letölteni.
Azután ha megvan (feltelepítve), akkor először hozzá kell adni a References... hez, majd már használható lesz a kontroll-ok között.

AE

[ Szerkesztve ]

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#1508) ArchElf válasza martonx (#1503) üzenetére


ArchElf
addikt

Nagylevegő, tízigszámol, kifúj...
Csuklást megszünteti ;)

AE

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#1509) erich85T


erich85T
csendes tag

Sziasztok! Új vagyok a fórumon. Nem tudom, hogy mennyire nehéz megvalósítani, de ha esetleg van valakinek valami ötlete, esetleg kész megoldása a problémámra azt szívesen fogadnám. A kérdésem excel makro programozása témakörhöz kapcsolódik.

Van két oszlop, az első oszlopban nevek vannak a másodikban meg a névhez tartozó adatok. Valahogy így:

név - adat
a - x
a - y
a - z
b - q
b - w
b - p
b - q

Ezen táblázatot úgy szeretném transzponálni, hogy a név (egy adott sorban) csak egyszer szerepeljen, és az adatok a sorokból, egymás mellé kerüljenek oszlopokba. Így:

a - x - y - z
b - q - w - p - q

Több problémát is meg kellene így oldani a kódolásban:
- a kódnak figyelnie kell az azonos neveket, mivel valamelyik névhez lehet másik névhez meg akár 200 adat is tartozhat.
- ennek megfelelően az egymás mellé kerülő oszlopok száma is változik
- át kell rendeznie a táblázatot,a fenti formának megfelelően stb stb.

Ha valakinek van erre ötlete, hogy miképpen lássak neki, esetleg kész kódja van ehhez azt megköszönném.

Erik

(#1510) ArchElf válasza erich85T (#1509) üzenetére


ArchElf
addikt

Excel topicban szerintem hamarabb találsz megoldást ;)

AE

[ Szerkesztve ]

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#1511) martonx válasza erich85T (#1509) üzenetére


martonx
veterán

Node ez egy sima transzponálás. Tartományt kiválasztod, majd irányított beillesztés, transzponálást bepipálod és kész.
Vagy félreértettelek?

Én kérek elnézést!

(#1512) erich85T válasza martonx (#1511) üzenetére


erich85T
csendes tag

Igen ez stimmel, valóban transzponálásról van szó. Viszont automatizálni szeretném ezt a folyamatot, nekem arra kell egy program, hogy a tartományt kiválassza és a fent leírt elv szerint transzponálja. Nagyon sok sor van a táblázatban, és a tartományok méretei is különböznek. Nekem azt kellene, hogy megvalósítsa a program, hogy kijelölje a megfelelő tartományt, jelen esetemben az egymás alatt lévő azonos neveket. Ehhez a névhez tartozó adatokat pedig egymás mellé oszlopba transzponálja.

tehát ebből:

név1 - adat1
név1 - adat 2
név1 - adat 3

név2 - adat 4
név2 - adat 5
név3 - adat 6

ezt csinálja:

név 1 - adat 1 - adat 2 - adat 3
név 2 - adat 4 - adat 5
név 3 - adat 6

Köszönöm az eddigi hozzászólásokat, várom a további megoldásokat, javaslatokat.

(#1513) martonx válasza erich85T (#1512) üzenetére


martonx
veterán

Szia!

Erre való a makró rögzítő. Ami mellé kell egy kis VBA gyakorlat, és már kész is. Javaslom kezdd el, és ha valahol megakadsz segítünk.

Üdv: martonx

Én kérek elnézést!

(#1514) Des1gnR


Des1gnR
őstag

Sziasztok!

Egy olyan programot készítek ami egy weboldalról tölt le egy képet, majd ugrik a következőre és letölti azt is és így tovább :)
Így néz ki a kódrész ami a fájlt letölti:
Try
download.DownloadFileAsync(New Uri(sourceURL), (filedir))
Catch ex As Exception
MsgBox("Failed" + ErrorToString(), MsgBoxStyle.Critical)
End Try

Azt szeretném megcsinálni, hogy csak akkor ugorjon át a következő képre, ha már letöltötte az aktuálisat. Mivel vizsgáljam ezt?

Válaszotokat előre is köszönöm.

Dell G3 3779 || Samsung S23+ || Samsung Watch 5 Pro || Oculus Quest 2 || Creality Ender 3 V2

(#1515) Des1gnR válasza Des1gnR (#1514) üzenetére


Des1gnR
őstag

Jah azt még jelezném, hogy ez nem akar működni:
Private Sub download_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles download.DownloadProgressChanged
ProgressBar1.Value = e.ProgressPercentage
End Sub

Ezen kívül más megoldás lehetséges? :F

Dell G3 3779 || Samsung S23+ || Samsung Watch 5 Pro || Oculus Quest 2 || Creality Ender 3 V2

(#1516) martonx válasza Des1gnR (#1515) üzenetére


martonx
veterán

miért aszinkron töltöd le?
Ha már olyan fontos, hogy sorba menj, töltsd le szinkronban.

Ehhez a nem működés részhez kéne még némi infó, mondjuk, hogy milyen objektum is az a download.

Én kérek elnézést!

(#1517) Des1gnR válasza martonx (#1516) üzenetére


Des1gnR
őstag

Ezt a szinkron-aszinkron dolgot nem teljesen értem.
Erről az oldalról töltenék le: https://familysearch.org/pal:/MM9.3.1/TH-1951-20648-29594-35?cc=1452460&wc=12890478

És itt a teljes forráskód:
Imports System.Net
Public Class Form1
Private WithEvents download As WebClient

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim download As New WebClient
download = New WebClient


Dim i As Integer
Dim a As String
'For i = 1 To 3
a = i

Dim link As String = WebBrowser1.Document.GetElementById("save").GetAttribute("href")
TextBox1.Text = ("https://familysearch.org" + link)

Dim sourceURL = TextBox1.Text
Dim filedir = ("C:\" + a + ".jpg")
ProgressBar1.Value = 0
ProgressBar1.Maximum = 100
Try
download.DownloadFileAsync(New Uri(sourceURL), (filedir))
Catch ex As Exception
MsgBox("Failed" + ErrorToString(), MsgBoxStyle.Critical)
End Try
WebBrowser1.Document.GetElementById("next").InvokeMember("click")
' Next
End Sub

Private Sub download_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles download.DownloadProgressChanged
ProgressBar1.Value = e.ProgressPercentage
End Sub
End Class

Ez még változni fog itt-ott annyiban, hogy lehessen mappát választani és lehessen megadni más url-t is, de most csak az a lényeg hogy működjön :)

[ Szerkesztve ]

Dell G3 3779 || Samsung S23+ || Samsung Watch 5 Pro || Oculus Quest 2 || Creality Ender 3 V2

(#1518) martonx válasza Des1gnR (#1517) üzenetére


martonx
veterán

Webclient-tel kétféleképpen tudsz letölteni. Aszinkron módon, azaz elindul a letöltés, de a kódod fut tovább, nem várja meg, hogy mi lett a letöltés eredménye. Ez a DownloadFileAsync.
Vagy szinkron módon, azaz elindul a letöltés, a kód megvárja míg letöltődik, és csak ezután fut tovább. Ez a sima DownloadFile.
Remélem érthető a különbség.
Emellett a létező legegyszerűbb letöltési lehetőség a My.Computer.Network.DownloadFile használata.
Sőt letölteni lehet a webhttprequest-tel is. A lehetőségek tárháza szinte végtelen.
Esetedben javaslom a szinkron letöltést, mert így a legegyszerűbb sorba mindent letölteni, és ha jól értem nem több száz megás cuccokat töltesz le.
De ha már aszinkron, azért nem működik a DownloadProgressChanged eseményed, mert ehhez a WebClient-edhez előbb hozzá kell kapcsolnod ezt az eseményt. Ezt az AddHandlerrel tudod megtenni.

Én kérek elnézést!

(#1519) Des1gnR válasza martonx (#1518) üzenetére


Des1gnR
őstag

Köszönöm a segítséget, ez nagyon korrekt válasz volt.
Ezt a verziót választottam:
Dim mettől As Integer = TextBox4.Text
Dim meddig As Integer = TextBox2.Text
Dim i As Integer
Dim a As String
For i = mettől To meddig
a = i

Dim link As String = WebBrowser1.Document.GetElementById("save").GetAttribute("href")
TextBox1.Text = ("https://familysearch.org" + link)

Dim sourceURL = TextBox1.Text
Dim filedir = ("C:\" + a + ".jpg")
WebBrowser1.Document.GetElementById("next").InvokeMember("click")
My.Computer.Network.DownloadFile(sourceURL, filedir)

Next

De nem várja meg, hogy letöltsön a kép, és már megy is tovább a for ciklus.

Dell G3 3779 || Samsung S23+ || Samsung Watch 5 Pro || Oculus Quest 2 || Creality Ender 3 V2

(#1520) martonx válasza Des1gnR (#1519) üzenetére


martonx
veterán

hááát az eléggé lehetetlen, de te tudod.

Én kérek elnézést!

(#1521) Des1gnR válasza martonx (#1520) üzenetére


Des1gnR
őstag

Fura de nekem ez jön le a program viselkedéséből.
Most ilyen:
WebBrowser1.Document.GetElementById("next").InvokeMember("click")
Delay(5)
My.Computer.Network.DownloadFile(sourceURL, filedir)

Így láthatólag probléma nélkül fut :U

Dell G3 3779 || Samsung S23+ || Samsung Watch 5 Pro || Oculus Quest 2 || Creality Ender 3 V2

(#1522) martonx válasza Des1gnR (#1521) üzenetére


martonx
veterán

A viselkedéséből, vagy a debug is ezt mutatja?
No mindegy, a lényeg hogy működik.

Én kérek elnézést!

(#1523) Des1gnR válasza martonx (#1522) üzenetére


Des1gnR
őstag

Lényeg, hogy működik.
Köszönöm a segítséget, sokat jelentett :R

Lenne még egy kérdésem.
A program rendesen működik, ha olyan tartalmat töltök le amihez nem kell bejelentkezni az oldalra. Ha olyan mappát nyitok meg amihez be kell jelentkezni, akkor ugye azt csak a bejelentkezés után tehetem meg. Ezzel nincs is semmi gond, teljesen ugyan olyan felületű oldalra visz, még a gombok inputjai sem változnak, viszont időtúllépéssel dob egy hibát.
Ha csak a webbrowser ablakba töltöm le akkor simán letölti, de ha ráengedném a "ciklust" akkor dobja a hibát. Valami ötlet erre?

Dell G3 3779 || Samsung S23+ || Samsung Watch 5 Pro || Oculus Quest 2 || Creality Ender 3 V2

(#1524) martonx válasza Des1gnR (#1523) üzenetére


martonx
veterán

Mivel te csak a webbrowser-ben hitelesítetted magad, ezért letöltéskor is meg kellene adni a user - pass párost?

Én kérek elnézést!

(#1525) bazsi0322


bazsi0322
tag

Hali!
Kérnék egy kis segítséget.
Ezt a programot kellene megírni: Írjunk egy programot, amely az adott évről eldönti, hogy szökőév-e! Egy év szökőév, ha néggyel osztható, azonban a százzal osztható évek közül csak a négyszázzal is osztható évek a szökőévek!!

VISUAL BASIC 2010 EXPRESS-ben kellene!!
PLS HELP

Megcsillan a fény az Emirates-en, átszáguld a labda a gólvonalon, együtt forog a labda és a lélek , Arsenal-os leszek, amíg élek!

(#1526) ArchElf válasza bazsi0322 (#1525) üzenetére


ArchElf
addikt

Hasból:
if (ev % 400 == 0) Then
szokoev = True
else if (ev % 100 == 0) Then
szokoev = False
else if (ev % 4 == 0) Then
szokoev = True
else
szokoev = False
end if

AE

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#1527) bazsi0322 válasza ArchElf (#1526) üzenetére


bazsi0322
tag

Más megoldás nincs? Mert nem tanultunk még ilyeneket amit írtál :D

Megcsillan a fény az Emirates-en, átszáguld a labda a gólvonalon, együtt forog a labda és a lélek , Arsenal-os leszek, amíg élek!

(#1528) ArchElf válasza bazsi0322 (#1527) üzenetére


ArchElf
addikt

Mit nem tanultál ebből???

AE

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#1529) ArchElf válasza ArchElf (#1528) üzenetére


ArchElf
addikt

Helyes VB szintaktikával (c# -al volt az előző kód keverve, sorry)
If (ev Mod 400 = 0) Then
szokoev = True
ElseIf (ev Mod 100 = 0) Then
szokoev = False
ElseIf (ev Mod 4 = 0) Then
szokoev = True
Else
szokoev = False
End If

AE

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#1530) bazsi0322 válasza ArchElf (#1528) üzenetére


bazsi0322
tag

% ez mi lenne?

Megcsillan a fény az Emirates-en, átszáguld a labda a gólvonalon, együtt forog a labda és a lélek , Arsenal-os leszek, amíg élek!

(#1531) ArchElf válasza ArchElf (#1529) üzenetére


ArchElf
addikt

Egészbe:
Sub Main()
Dim ev As Integer
Dim szokoev As String
ev = 0
szokoev = ""
If Integer.TryParse(Console.ReadLine(), ev) Then

If (ev Mod 400 = 0) Then
szokoev = ""
ElseIf (ev Mod 100 = 0) Then
szokoev = "nem "
ElseIf (ev Mod 4 = 0) Then
szokoev = ""
Else
szokoev = "nem "
End If
Console.WriteLine("A {0}. év {1}szökőév.", ev, szokoev)
Else
Console.WriteLine("A beadott érték nem szám.")
End If
Console.ReadKey()
End Sub

C#-ban a % a VB-s MOD (egész osztás maradéka).

AE

[ Szerkesztve ]

Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

(#1532) bazsi0322


bazsi0322
tag

Köszönöm szépen mindkettőtöknek, sikerült :D

Megcsillan a fény az Emirates-en, átszáguld a labda a gólvonalon, együtt forog a labda és a lélek , Arsenal-os leszek, amíg élek!

(#1533) Des1gnR válasza martonx (#1524) üzenetére


Des1gnR
őstag

Erre nem gondoltam, de sajnos így is ugyan azt a hibát dobja:
http://img259.imageshack.us/img259/1186/hibag.png

Dell G3 3779 || Samsung S23+ || Samsung Watch 5 Pro || Oculus Quest 2 || Creality Ender 3 V2

(#1534) martonx válasza ArchElf (#1528) üzenetére


martonx
veterán

10-ig számol, levegőt kifúj.

"Köszönöm szépen mindkettőtöknek" - ezen mondjuk megborultam :C

Én kérek elnézést!

(#1535) martonx válasza Des1gnR (#1533) üzenetére


martonx
veterán

Esetleg watin-nal végigszimulálni az egészet?

A becsatolt képet nem tudom innen megnyitni, de ez nem a te hibád...

Én kérek elnézést!

(#1536) Des1gnR válasza martonx (#1535) üzenetére


Des1gnR
őstag

A watin alapból 5 hibával indul és mikor elindul akkor hiányoznak a gombok ikonjai és egy oldalt sem tölt be. Próbáltam több verziót is, de ugyan az :S
Gondolom ez a progi olyasmi mint az enyém, csak nem oldalfüggő. Jól gondolom? Más hasonló progit nem ismersz?

Dell G3 3779 || Samsung S23+ || Samsung Watch 5 Pro || Oculus Quest 2 || Creality Ender 3 V2

(#1537) martonx válasza Des1gnR (#1536) üzenetére


martonx
veterán

Én a watin-t szoktam használni webes automatizálásokhoz.
Esetleg érdemes fiddler-rel megnézni, hogy az autentikálás, autentikált link letöltése közben mi játszódik le a háttérben.

Én kérek elnézést!

(#1538) Des1gnR válasza martonx (#1537) üzenetére


Des1gnR
őstag

Nézegettem, de nekem semmi nem derül ki belőle :W

Dell G3 3779 || Samsung S23+ || Samsung Watch 5 Pro || Oculus Quest 2 || Creality Ender 3 V2

(#1539) RexpecT


RexpecT
addikt

Lenne egy feladatom:
Készítsen olyan függvényt, ami a paraméterként egyetlen sztringet kap, ami egész számokat tartalmaz szóközzel elválasztva. A függvény adja vissza a két legnagyobb szám összegét. A sztring legalább két számot tartalmaz.

Function osszead(param As String)

Dim szoveg() As String
Dim szam1 As Integer
Dim szam2 As Integer
szoveg = Split(param)


First = LBound(szoveg)
Last = UBound(szoveg)
For i = First To Last - 1
For j = i + 1 To Last
If szoveg(i) > szoveg(j) Then
Temp = szoveg(j)
szoveg(j) = szoveg(i)
szoveg(i) = Temp
End If
Next j
Next i

szam1 = szoveg(i)
szam2 = szoveg(j)

osszead = szam1 + szam2

End Function

Sub main()
Dim szamok As String
szamok = "1 2 3 20 5 6 8 9 8"
MsgBox osszead(szamok)
End Sub

(#1540) RexpecT válasza RexpecT (#1539) üzenetére


RexpecT
addikt

Már tárgytalan :R .

(#1541) martonx válasza RexpecT (#1540) üzenetére


martonx
veterán

Amúgy se derült ki, hogy mit szeretnél.

Én kérek elnézést!

(#1542) RexpecT válasza martonx (#1541) üzenetére


RexpecT
addikt

Ott volt a leírásban, a függvény megkap egy sztringet amiben számok állnak vesszővel elválasztva ezek közül adja vissza a két legnagyobb szám összegét:

Function osszead(param As String)
Dim szoveg() As String, szam1 As Integer, szam2 As Integer, i As Integer
szoveg = Split(param)
For i = LBound(szoveg) To UBound(szoveg)
If szam1 < szoveg(i) Then
If szam2 < szoveg(i) Then
szam1 = szam2
szam2 = szoveg(i)
Else
szam1 = szoveg(i)
End If
End If
Next i
osszead = szam1 + szam2
End Function

Sub main()
Dim szamok As String
szamok = "1 2 3 20 5 6 8 9 8"
MsgBox osszead(szamok)
End Sub

(#1543) Homer


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! :)

(#1544) martonx válasza Homer (#1543) üzenetére


martonx
veterán

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?

Én kérek elnézést!

(#1545) Homer válasza martonx (#1544) üzenetére


Homer
tag

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?"

[ Szerkesztve ]

(#1546) martonx válasza Homer (#1545) üzenetére


martonx
veterán

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.

Én kérek elnézést!

(#1547) RexpecT válasza martonx (#1544) üzenetére


RexpecT
addikt

Ha Neked ennyi nem elég a feladat megértéséhez, az nem az én bajom :R . Prog.hu-n egyből kaptam választ pedig az itteni HSZ-emet írtam oda is be.

(#1548) Homer válasza martonx (#1546) üzenetére


Homer
tag

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.

(#1549) martonx válasza RexpecT (#1547) üzenetére


martonx
veterán

Akárhányszor olvasom vissza a HSZ-edet, azt látom, hogy lenne egy feladatod, illetve bemásoltál egy kódot.
De egy szót sem szóltál, hogy vajon miért tetted mindezt.

Én kérek elnézést!

(#1550) martonx válasza Homer (#1548) üzenetére


martonx
veterán

Mi sem álljon távolabb tőlem, mint bárki más helyett megoldani a feladatot. Azért szeretem tudni az alap feladatot, mert szeretek optimális megoldásokat adni. Általában azt tapasztalom, hogy sokan kérnek tanácsot, de már az alap koncepciójuk hibás. Ilyenkor szvsz sokkal nagyobb segítség a jó úton elindítani őket, mint a rossz úton továbblökni egy lépéssel.
De ha titok, hát titok :DDD

Én kérek elnézést!

Útvonal

Fórumok  »  Szoftverfejlesztés  »  Visual Basic
Copyright © 2000-2024 PROHARDVER Informatikai Kft.