Nieuwe Functie maken?

Status
Niet open voor verdere reacties.

jhdw

Gebruiker
Lid geworden
15 dec 2012
Berichten
166
Goedemorgen,

Ik zou graag een functie willen hebben om de code in mijn formulier te vereenvoudigen. In het voorbeeld heb ik een kaal formulier (zonder data) uit mijn productie dB gezet. Ik heb 2 velden een kleur gegeven omdat er 2 verschillende mogelijkheden zijn. Het gele veld wordt na de actie Dubbelklikken leeg gemaakt, het blauwe veld krijgt een *.

Mijn vraag is of iemand voor mij een functie kan maken. Ik heb alleen nog maar een naam: Mod_SoortClaims
Alvast bedankt voor de hulp.

Gr. Jan
 

Bijlagen

  • Test_HM.zip
    105,3 KB · Weergaven: 19
Waarom wil je daar een functie voor hebben? Als ik het zo lees hoeft er per dubbelklik maar één actie regel te worden uitgevoerd. Dat is dus net zoveel tekst als een functie aanroepen die dat doet. En dan reken ik de regels die je moet typen voor het máken van die functie niet eens mee :).
Daarnaast heb je voor twee tekstvakken twee aparte functies, dus waarom je die in één functie zou zetten, is mij ook een raadsel.

Functie maken/gebruiken heeft alleen zin als die functie multifunctioneel bruikbaar is. Dan heb je dus een functie die input krijgt uit een willekeurig object, en dan wat actie(s) uitvoert die generiek zijn. Bijvoorbeeld een postcode check op meerdere adres velden.
 
Hallo Michel,

Bedankt voor de snelle reactie.

In het voorbeeld heb ik 2 soorten velden aangemerkt omdat deze 2 verschillende uitkomsten krijgen.
Het gaat in dit formulier echter om alle “txtFilter” velden en dan heb ik in de dB nog meer formulieren waar het principe van filteren exact hetzelfde is.
Het filteren met jouw functie "CheckFilter" gebruik ik heel veel.:thumb:

Vandaar dat ik dacht dat 1 of 2 functies een nette oplossing zou zijn.

Gr. Jan
 
Ik zie nog steeds niet waarom je een functieaanroep die één regel kost wilt gebruiken om een opdracht die óók één regel kost te vervangen. Daar win je dus helemaal niks mee. Als je ruimte wilt besparen, haal dan de regels met .SetFocus weg, want die doen niks :). Als je namelijk op een knop of tekstvak (dubbel)klikt, dan is het onmogelijk dat een ánder object de focus heeft bij het uitvoeren van de code. Tenzij je middels de .SetFocus natuurlijk de focus in de procedure hebt verplaatst, maar dat doe je dus niet.

Daarnaast vind ik het gebruik van het * erg ongelukkig (druk ik me zacht uit) om aan te geven dat je wilt filteren op niet-lege tekstvakken. Om te beginnen is de asterisk een beschermd teken (moet je dus daarom al niet gebruiken) en daarnaast geef je met dat teken aan dat je alles wilt zien. En dat is dus precies niet wat jij wilt zien.
 
Het * teken gebruik ik meestal alleen in bepaalde datum selecties (in het voorbeeld de 6 rechter velden). De gebruiker kan dan heel snel zien bij welke records bijv de defecte onderdelen zijn ontvangen of om nog een voorbeeld te geven, welke claims zijn afgewezen door de leverancier.

Bij het serienummer gebruik ik de * trouwens ook. Zonder * en alleen maar cijfers werkt het filter namelijk niet. De opbouw van het serienummer is bij alle merken verschillend, het varieert van 3 tot 17 tekens (met of zonder letters).

De focus wordt in de productie dB wel verplaatst (ik heb net nog even getest bij dealer). Die regel kan dus niet weg, de gebruiker kan gelijk weer beginnen met typen.

Omdat er zo vaak dezelfde code in de dB voorkomt, dacht ik het met 1 of 2 functies beter af te zijn.
 
Ik kan alleen afgaan op jouw voorbeeld, en daar is het gebruik van .SetFocus dus onzinnig. :). Je kunt, als je geen zin hebt om de naam van het actieve element te typen, wel een code gebruiken zodat je dezelfde regel kunt hergebruiken bij de andere tekstvakken. Iets dat je tóch al moet doen als je een aparte functie maakt. Twee functies, in jouw geval :D
 
Wat voor voorbeeld? De benodigde code heb je immers al?
 
Goedenavond,

Ik kom nog even terug met mijn probleem. Zou het met een sub routine makkelijker / eenvoudiger kunnen.

Alleen ik weet niet hoe de veldnaam mee te sturen vanuit in dit geval txtFilter1:(

Code:
Private Sub txtFilter1_DblClick(Cancel As Integer)
    ClearTxtField
End Sub

Als voorbeeld de volgende sub routine gemaakt:

Code:
Private Sub ClearTxtField()
    With Me
        .txtKeuze.Caption = ""
        .txtFilter1 = ""
        .txtFilter1.SetFocus
    End With
End Sub

Het gaat mij er om dat txtFilter1 vervangen wordt door de naam van het veld waarin dubbel geklikt wordt. Het gaat om een groot aantal velden!

Alvast bedankt voor de help.

Gr. Jan
 
Je kan dat doen via de controls verzameling van een formulier/rapport

Me.Controls(Index)
De index is ofwel de ordinaal positie in de verzameling of de naam van de control, bv:

Me.Controls("txtFilter1").value = ""

waarin "txtFilter1" kan vervangen worden door een string variabele
 
Goedenavond Noella,

Door omstandigheden kon ik niet eerder naar uw antwoord kijken.
Helaas weet ik niet waar ik de codes moet plaatsen.
Zou u voor mij de code in het programma kunnen plaatsen. Misschien dat ik dan begrijp hoe het werkt.
Alvast bedankt voor de hulp.

Gr. Jan
 
Hallo Michel,
Omdat Noella een antwoord had gegeven waar ik geen raad mee wist had ik Noella geschreven. Uiteraard mag iedereen de oplossing aandragen.
Alvast bedankt
Gr. Jan
 
Ik zou nooit een sub gebruiken voor dit soort zaken, maar een Functie. Dat ziet er bij mij (ik ben uiteraard noella niet) zo uit:

Code:
Private Sub txtFilter1_DblClick(Cancel As Integer)
    ClearTxtField (Screen.ActiveControl.Name)
End Sub
Code:
Private Sub txtFilter10_DblClick(Cancel As Integer)
    ClearTxtField (Screen.ActiveControl.Name)
End Sub
Code:
Function ClearTxtField(ctl As String) As Boolean
    On Error GoTo Hell
    Me.txtKeuze.Caption = ""
    Me(ctl).Value = ""
    Me(ctl).SetFocus
    ClearTxtField = True
    Exit Function
    
Hell:
ClearTxtField = False
End Function
 
Kleine toelichting: door de functie een Boolean te geven, kun je de output (TRUE/FALSE) gebruiken om je flow te reguleren. Als het instellen bijvoorbeeld niet lukt, dan is de functie False en kun je wat anders doen, of een Msgbox gebruiken om de gebruiker iets te laten doen.
 
Goedemorgen Michel,

Ik heb jouw codes in een andere dB gezet en het werkt perfect!:thumb:

De code heb ik nu bij 2 gebeurtenissen staan Dubbelklikken en bij wijzigen.

Nu heb ik nog een gebeurtenis die niet in mijn oorspronkelijke vraag staat.

Code:
Private Sub Merk_DblClick(Cancel As Integer)
    DblClickField (Screen.ActiveControl.Name)
End Sub

Hieronder heb ik alvast de functie gezet met de code zoals ik hem nu heb en goed werkt. Ook hier zijn er veel velden waar op dubbelgeklikt kan worden.
Bij extra info heb ik bijv. bij merk txtfilter1 gezet, indien van toepassing bij de andere velden ook het desbetreffende txtfilter.

Code:
Function DblClickField(ctl As String) As Boolean
    On Error GoTo Hell

        If Me.Merk <> vbNullString Then
            Me.txtFilter1.Value = Me.Merk.Value
            Me.txtFilter1.SetFocus
'            CheckFilter Me                      'uitgeschakeld in dit voorbeeld
            Me.txtFilter1.SetFocus
            Me.txtFilter1.SelStart = Me.txtFilter1.SelLength
        End If
        
Hell:
DblClickField = False
End Function

Zou je hier ook nog een oplossing voor kunnen maken?

Alvast bedankt.
Gr. Jan
 
Wat is de bedoeling precies? Ik snap 'm niet helemaal. Blijkbaar heb je bij de dubbelklik op Merk iets van doen met txtFilter1. Op het eerste gezicht zou ik zeggen dat je dit bedoelt:
Code:
Private Sub Merk_DblClick(Cancel As Integer)
    DblClickField Screen.ActiveControl.Name, Me(Screen.ActiveControl.Name).tag
End Sub

Code:
Function DblClickField(ctl As String, Optional tag As String) As Boolean
    On Error GoTo Hell
    If tag <> vbNullString Then
        Me(tag).Value = Me(ctl).Value
        Me(tag).SetFocus
        Me(tag).SelStart = Me(tag).SelLength
    End If
        
Hell:
    DblClickField = False
End Function
Correct me if I'm wrong :)
 
Hallo Michel,

Dit is precies wat ik zocht:thumb:

Er kunnen nu heel regels code verwijderd worden!

Heel vriendelijk bedankt voor de hulp.

Gr. Jan
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan