Hirdetés

Keresés

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

  • ArchElf
    addikt

    Á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

    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

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