Bersturingselementbron / Controlesource in functie toepassen

  • Onderwerp starter Onderwerp starter fmeca
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

fmeca

Gebruiker
Lid geworden
7 sep 2009
Berichten
95
Hoi,

Ik heb een formulier met verschillende Memo-velden die gevuld moeten worden.
Deze memo velden zijn op het formulier erg klein.
Nu heb ik het idee om een 'ZOOM'formulier te openen door in het betreffende memo-veld te dubbelklikken en de betreffende recordsource en controle source over te nemen.

De recordsource is de recordsource van het geopende formulier. no problem.
Het probleem is hoe ik de 'controlesource' in de functie kan opnemen.

Bij dubbelklik op het memo-veld:
Code:
fZoomBox (ControlSource)

De functie (so far):
Code:
Function fZoomBox(stSource As String)
On Error GoTo Err_fZoombox

Dim stDocName, stLinkCriteria As String

    stLinkCriteria = "Project_ID =" & Project_ID
    stDocName = "Form_ZoomBox"
    
    'Initialiseren formulier en data
    DoCmd.SetWarnings False
    DoCmd.OpenForm stDocName, acViewDesign, , , acHidden
        Forms(stDocName).Caption = stSource 
        Forms(stDocName).RecordSource = RecordSource
        Forms(stDocName).ZoomBox.ControlSource = stSource 
    DoCmd.Close acForm, stDocName, acSaveYes
    DoCmd.SetWarnings True

    'Open formulier
    DoCmd.OpenForm stDocName, , , stLinkCriteria
    
Exit_fZoombox:
    Exit Function

Err_fZoombox:
    MsgBox "Zoom fout: " & stDocName & ", " & RecordSource & ", " & stSource & vbNewLine _
        & Err.Description
    Resume Exit_fZoombox
End Function

Dus hoe krijg ik de controlsource in de funtie of toonbaar met een msgbox?

BVD
 
Laatst bewerkt:
Ik snap je niet; je hebt een tekstvak op je formulier dat te klein is, dus je wilt dat tekstvak openen in een apart formulier waar een groter tekstvak op staat, zodat je beter kun werken? Dan gebruik ik toch meestal een niet-gebonden formulier zonder Recordsource; je hebt alleen de waarde van het tekstvak nodig, verder niks. Dat kun je meenemen met de OpenArgs variabele. Het formulier open je in acDialog modus, en bij het sluiten werk je de waarde in je bronformulier bij. Meer hoef je niet te doen. Dus een extra functie? Ik zie de noodzaak niet.
 
THX voor je antwoord.

De achterliggende gedachte is als volgt:

Op mijn formulier heb ik meerdere Memo velden. Deze tonen ± 4 regels die hier zijn ingevuld. Om een totaal beeld van de tekst te zien en te lezen wil ik een apart formulier openen met aleen dit Memo veld schermvullend weergegeven. De bedoeling van de functie is om dit vervolgens in een module te stoppen en dit voor alle Memo velden ect. waar nodig te gebruiken.

Ik heb de OpenArg methodiek nog nooit toegepast.
Diverse voorbeelden op het www. helpen me niet echt.
Welke voorwaarden zet ik bijv. in het argument? (Record ID, ControlSource)
Heb jij misschien een duidelijk(er) voorbeeld?
 
De werking is bedroevend simpel; bij het openen van het memo formulier geef je als OpenArgs parameter de tekst mee van het memoveld.
Code:
    DoCmd.OpenForm "frmOpmerking", , , , , acDialog, Me.Opmerkingen.Text
Die tekst moet op het formulier frmOpmerking weer worden uitgelezen. Daar gebruik ik een TempVar voor.
Code:
Private Sub Form_Load()
    If Not Me.OpenArgs & "" = "" Then
        TempVars.Remove ("Memo")
        TempVars.Add "Memo", Me.OpenArgs
        Me.txtMemo = TempVars("Memo")
    End If
End Sub
Deze code maakt de TempVar aan en vult hem met de OpenArgs waarde die is meegekregen bij het openen. Die waarde wordt ook in het formulier gezet, zodat je de tekst kunt bewerken.
Bij het sluiten vul je de TempVar met de aangepaste waarde.
Code:
Private Sub Form_Close()
    TempVars("Memo") = Me.txtMemo.Value
End Sub
En op je oorspronkelijke formulier moet je de nieuwe waarde in het memoveld zetten.
Code:
    If TempVars("Memo") <> Me.Opmerkingen Then Me.Opmerkingen = TempVars("Memo")
De volledige code voor het memoveld ziet er derhalve zo uit:
Code:
Private Sub Opmerkingen_DblClick(Cancel As Integer)
    DoCmd.OpenForm "frmOpmerking", , , , , acDialog, Me.Opmerkingen.Text
    If TempVars("Memo") <> Me.Opmerkingen Then Me.Opmerkingen = TempVars("Memo")
End Sub
Komt dus geen functie aan te pas. Er zijn meer oplossingen uiteraard, maar deze is wel simpel. En héél universeel te gebruiken, want je geeft alleen de inhoud van het tekstveld mee. Dus ook vanuit andere formulieren en velden aan te roepen.
 
Laatst bewerkt:
THX

Ik ga hier eens mee stoeien.

Dus:
- Me.Opmerkingen.Text = de inhoud van mijn in te vullen veld of al ingevulde veld in OpenArgs zetten (waar ik op dubbelklik)
- Het 'sub'formulier opent en controleert of er een OpenArg is mee gestuurd,
- Indien Ja: Verwijder "Memo" en vervolgens maak een nieuw "Memo" en voeg hier de waarde van 'OpenArg' aan toe.
- Maak txtMemo gelijk aan Tempvars ("Memo")
- Nu is het geopende formulier/veld gevuld met de oorspronkelijke inhoud van het 'dubbelgeklikte veld' ???
Dit kan ik nu eventueel wijzigen of aanvullen.
- Bij het sluiten van het formulier wordt de inhoud van txtMemo weer in Tempvars ("Memo") geschreven??
- Terug in het hoofdformulier wordt de oude met de nieuwe waarde van het 'dubbelklik veld' vergeleken en eventueel aangepast.

Zo zou het volgens mij moeten werken. Ik heb alleen nog moeite met de invulling van de termen "Memo" en txtMemo.
Wat bedoel je hiermee?
- Is "Memo" het unbound veld of txtMemo?

m.vr.gr.
Eric
 
Je hebt het helemaal correct gesnapt. TxtMemo is de naam van het tekstveld dat ik op mijn formulier gebruik, en Memo is de naam van de TempVar variabele. Beiden kan je uiteraard probleemloos veranderen.
 
Tempvars werken bij mij niet i.v.m. Access 2003.

Is er een ander mogelijkheid?

PS Ik probeer te upgraden naar 2010.
 
Dat je geen Tempvars hebt hoeft geen probleem te zijn, je kunt ook een Public variabele maken. Die definiëer je dan in een algemene module. Die wordt dan natuurlijk niet aangemaakt/verwijderd, maar zou ik wel leegmaken voor het vullen. De code blijft dus ongeveer gelijk.
 
Michel THX.

M.b.v. de Public variabele lukt het.

Mijn probleem heb ik als volgt opgelost:

Module aangemaakt met de public variabele en een functie 'fZoombox'

Code:
Option Compare Database

Public stTemp As String

Function fZoomBox(stCtrlSource As String)
'Bij aanroepen functie bevat stCtrlSource,  fZoomBox(Screen.ActiveControl & "/" & Project_ID)

On Error GoTo Err_fZoomBox

Dim ctlCurrentControl As Control
Dim Project_ID As Integer

        'Project_ID uit stCrlSource filteren
    Project_ID = Right(stCtrlSource, Len(stCtrlSource) - InStr(1, stCtrlSource, "/"))
        'Bepaal vanuit welk veld de functie wordt aangeroepen.
    Set ctlCurrentControl = Screen.ActiveControl                    'Veldnaam
    stTemp = Left(stCtrlSource, InStr(1, stCtrlSource, "/") - 1)    'Inhoud v/h veld
        'Openen formulier en veldinhoud overnemen (OpenArgs)
    DoCmd.OpenForm "Form_ZoomBox", , , "Project_ID =" & Project_ID, , acDialog, stTemp
        
        'Waarde op formulier aanpassen indien verschillend met beginsituatie
    If stTemp <> stCtrlSource Then
        ctlCurrentControl = stTemp
    End If
    stTemp = ""
    
Exit_fZoomBox:
    Exit Function

Err_fZoomBox:
    MsgBox "Zoom fout: " & stDocname & ", " & RecordSource & ", " & ctlCurrentControl & vbNewLine _
        & Err.Description
    Resume Exit_fZoomBox
End Function

Het aanroepen van de functie kan door een willekeurig veld in een willekeurig formulier te kiezen en een 'On Click' Of ' Double-Click' de functie te starten.

Code:
fZoomBox (Screen.ActiveControl & "/" & Project_ID)
Waarbij 'Screen.ActiveControl' de ControlSource van het veld bevat en 'Project_ID' het ID van de geselecteerde record.
Deze worden in de functie weer gespiltst.

THX voor jullie input.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan