Vervolg afbeeldingen in access

Status
Niet open voor verdere reacties.

remmie63

Gebruiker
Lid geworden
4 jan 2011
Berichten
396
Als vervolg op mijn vorige vraag: "Afbeelding in Access" een klein probleempje wat ik ben tegen gekomen.
De koppeling tussen de db en de images werkt en ook het verversen van de afbeelding wanneer deze wordt gewijzigd. Als ik nu het formulier open en de eerste plantnaam (Bacopa) staat beschreven merk ik dat bij het volgende record in het tekstvak (Afb WATER bijv) de tekst wel goed staat (behorende bij deze plant) maar hij laat de afbeeldingen zien van het eerste record. Hij pakt dus de afbeeldingen van Bacopa en de tekst van het record Calathea welke geopend is.

prt scr.jpg

In het voorbeeldje zie je bijv. hoogte ingesteld op 150cm (Calathea) maar de afbeelding is 15 cm (Bacopa). Ik moet dat dan weer opnieuw selecteren om naar de juiste afbeelding te komen.
 
Laatst bewerkt:
Dan klopt de Refresh of Requery van het formulier niet; op het moment dat je iets wijzigt in je formulier, moeten alle objecten opnieuw worden ingelezen en gekoppeld; je zou dus de code die alle objecten koppelt in een functie kunnen stoppen, en die functie aanroepen op alle gebeurtenissen waar een refresh nodig is.
 
Aanvulling:
Je hebt bij je Form_Current een hele waslijst aan plaatjes die worden ingelezen. Bij het openen van een record staat het eerste record daarmee goed op het scherm. Bij het veranderen van één keuzelijst, moet je al die objecten misschien opnieuw inlezen (andere plant bijvoorbeeld). Knip dus die code weg bij de Form_Current, en plak die in een Function. Ik noem 'm voor het gemak even <PlaatjesRefresh>. En roep de functie dan zo aan:

Code:
Private Sub Form_Current()
    PlaatjesRefresh
End Sub
Om te voorkomen dat hij bij elke wijziging alle plaatjes opnieuw gaat inlezen, zou je de oude waarden en de nieuwe waarden nog in een variabele kunnen inlezen, en alleen verversen als die twee verschillen. Je voorkomt daarmee het opnieuw inlezen van hetzelfde plaatje, wat het scherm nogal onrustig maakt.
 
Ik snap je verhaal gedeeltelijk! De Form_Current heeft maar betrekking op één plaatje in het record. En die doet het eigenlijk zoals het hoort. Het zijn de tekstvakken en de img objecten waar het mis gaat!

Code:
Private Sub Afb_VOCHTIG_Click()
    If Not Dir(CurrentProject.Path & "\Iconen\Vochtig\" & Me.Afb_VOCHTIG) = "" Then
        Me.Afbeelding127.Picture = CurrentProject.Path & "\Iconen\Vochtig\" & Me.Afb_VOCHTIG
    Else
        Me.Afbeelding127.Picture = ""
    End If
    If Me.Dirty Then Me.Dirty = False
    Me.Repaint
End Sub
 
Je draait de redenering om: Form_Current voert de code uit voor alle plaatjes, Sub Afb_VOCHTIG_Click() werkt maar één plaatje bij. Wat correct zou kunnen zijn, als het om dezelfde afbeelding gaat, maar als je een andere plant kiest, dan moeten daar ook andere eigenschappen bij. Dus vandaar mijn idee om het bijwerken in een functie te doen, en bij elke mutatie die functie aan te roepen.
 
Ik snap het nog steeds maar gedeeltelijk! Je schrijft:
Bij het veranderen van één keuzelijst, moet je al die objecten misschien opnieuw inlezen (andere plant bijvoorbeeld).
maar het gaat niet zozeer over de keuzelijst maar het veranderen van record (dus naar een andere plant). De keuzelijsten en bijhorende imgs blijven staan op de eerste plant waarop geopend wordt.
Ik snap ook niet goed hoe en waar ik dan die Function moet maken.
Dit is de code van de Form_Current:

Code:
Private Sub Form_Current()
    
    If Not Me.Plant_afbeelding & "" = "" Then
    On Error Resume Next
        Me.Afbeelding69.Picture = CurrentProject.Path & "\Plantimages\" & Me.Plant_afbeelding
    Else
        Me.Afbeelding69.Picture = ""
    End If
    
    If Not Me.Detailafbeelding & "" = "" Then
    On Error Resume Next
        Me.Afbeelding124.Picture = CurrentProject.Path & "\Plantimages\" & Me.Detailafbeelding
    Else
        Me.Afbeelding124.Picture = ""
    End If
    
End Sub
 
De functie is simpel: knip alle huidige code, en plak die in een functie:

Code:
Private Function PlaatjesLezen()
    
    If Not Me.Plant_afbeelding & "" = "" Then
    On Error Resume Next
        Me.Afbeelding69.Picture = CurrentProject.Path & "\Plantimages\" & Me.Plant_afbeelding
    Else
        Me.Afbeelding69.Picture = ""
    End If
    
    If Not Me.Detailafbeelding & "" = "" Then
    On Error Resume Next
        Me.Afbeelding124.Picture = CurrentProject.Path & "\Plantimages\" & Me.Detailafbeelding
    Else
        Me.Afbeelding124.Picture = ""
    End If
    
End Function

En gebruik in het vervolg dit:

Code:
Private Sub Form_Current()
    Call PlaatjesLezen
End Sub

Als je nu een andere plant of iets wijzigt, roep je steeds PlaatjesLezen aan, en je formulier is bijgewerkt.
 
Goedemorgen,
ik ben weer aan het puzzelen geweest maar loop toch tegen hetzelfde probleem aan! Onderstaande heb ik aangepast maar hier zat het probleem niet. Deze images werkten goed.
Code:
Private Sub Form_Current()
    Call Plaatjeslezen
End Sub
Private Function Plaatjeslezen()
    
    If Not Me.Plant_afbeelding & "" = "" Then
    On Error Resume Next
        Me.Afbeelding69.Picture = CurrentProject.Path & "\Plantimages\" & Me.Plant_afbeelding
    Else
        Me.Afbeelding69.Picture = ""
    End If
    
    If Not Me.Detailafbeelding & "" = "" Then
    On Error Resume Next
        Me.Afbeelding124.Picture = CurrentProject.Path & "\Plantimages\" & Me.Detailafbeelding
    Else
        Me.Afbeelding124.Picture = ""
    End If
End Function

Het probleem doet zich in onderstaande code voor. Het gaat om de tekstvakken in relatie tot de icoon afbeeldingen. Dit is overigens maar een klein deel van alle plaatjes die geladen worden.

Code:
Private Sub Afb_ZON_Click()
    If Not Dir(CurrentProject.Path & "\Iconen\Licht\" & Me.Afb_ZON) = "" Then
        Me.Afbeelding91.Picture = CurrentProject.Path & "\Iconen\Licht\" & Me.Afb_ZON
    Else
        Me.Afbeelding91.Picture = ""
    End If
    If Me.Dirty Then Me.Dirty = False
    Me.Repaint
End Sub
Private Sub Afb_WATER_Click()
    If Not Dir(CurrentProject.Path & "\Iconen\Water\" & Me.Afb_WATER) = "" Then
        Me.Afbeelding90.Picture = CurrentProject.Path & "\Iconen\Water\" & Me.Afb_WATER
    Else
        Me.Afbeelding90.Picture = ""
    End If
    If Me.Dirty Then Me.Dirty = False
    Me.Repaint
End Sub

Kan ik die Private Function hier ook op ieder individueel plaatje toepassen? Of moet ik dan per plaatje de code aanpassen met volgnummer bijv? Dus:
Code:
Private Sub Form_Current()
    Call Plaatjeslezen_1 [I]"(en oplopend)"[/I]End Sub
 
Laatst bewerkt:
Het prinicipe van het inlezen is in elke code gelijk, dus als het de ene keer wel werkt, en de andere keer niet, dan licht het niet aan de procedure. Zelf zou ik een functie maken die niet afhankelijk is van de hoeveelheid tekstvakken en image vakken op je formulier, maar ik zou de functie dus generiek maken. Dat vereist dan wel een andere aanpak, want je moet de naamgeving van de tekstvakken en afbeeldingsvakken dan ook een bepaalde logica meegeven. Voordeel ervan is, dat de functiecode een stuk korter kan, en de functie op verschillende manieren kan worden gebruikt. Maar dat lost nog steeds jouw probleem niet op.

Dat kan eigenlijk alleen opgelost worden als je een complete versie (dus met de juiste plaatjes en submappen) kan posten. Zoals ik al zei: aan de functie ligt het niet. En zonder de db is er verder dus geen zinnig woord van te zeggen.
 
Oke, betekent dat ook dat er later geen plaatjes aan toegevoegd kunnen worden? Dus zoals ik het nu aanlever blijft het dan!
 
Laatst bewerkt:
Ik snap niet wat je probleem nu is; ik kan mij hooguit voorstellen dat de waarde die je uit je keuzelijsten haalt niet overeenkomt met de naam van het plaatje. Bovendien doe je twee verschillende checks:
Code:
    If Not Me.Plant_afbeelding & "" = "" Then
kijkt of het tekstveld op je formulier leeg is of niet. In het eerste geval wordt het plaatje opgehaald.
Code:
    If Not Dir(CurrentProject.Path & "\Iconen\Licht\" & Me.Afb_ZON) = "" Then
Deze code checkt of je plaatje bestaat in de aangegeven map. Als dat plaatje bestaat, wordt de code uitgevoerd. Er wordt verder niet gekeken of het plaatje ook gekozen wordt of niet. Als je een tabel als basis gebruikt voor de plaatjes, met een ID veld en een Naam, en de keuzelijst leest het ID veld uit, dan zal er wel nooit een plaatje gevonden worden. Bij een tekstveld bestaat dat probleem niet: wysiwyg!

Overigens zou ik zelf de plaatjes niet in zoveel verschillende mappen gooien; mij lijkt één map Iconen meer dan genoeg. Hoeveel verschillende gieterplaatjes heb je nu helemaal? En zonlicht?
 
Maar samen zijn het er toch behoorlijk veel en dat maakt het voor mij ook een stuk overzichtelijker! ik krijg het er op de een of andere manier niet ingebouwd. Ik ga de db doorsturen!
 
En nog 5!
 

Bijlagen

Als je alle aanwijzingen die ik heb gegeven had uitgevoerd, had je dit resultaat gehad ;)
 

Bijlagen

Hartelijk bedankt, het werkt prima!

Maar ik zat wel in de goede richting (voor een leek)!
Kan ik die Private Function hier ook op ieder individueel plaatje toepassen? Of moet ik dan per plaatje de code aanpassen met volgnummer bijv?

Ik zal hem op opgelost zetten.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan