Hirdetés

Keresés

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

  • 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

    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

  • martonx
    veterán

    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

    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.

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