Gå til innhold

Access/VB - lagre verdier for kontroller


Anbefalte innlegg

Hei

 

Jeg har noen tekstfelt i et skjema som ikke er koblet til en database.

Når de endres blir de ikke lagret, dvs Value resettes til DeafultValue hver gang jeg åpner skjemaet på nytt.

 

Dette har jeg hittil prøvd å løse på 2 måter.

Tekstboksen heter pris_1

 

Private Sub pris_1_AfterUpdate()
pris_1.DefaultValue = pris_1.Value
End Sub

Denne lagde jeg for at hver gang jeg skriver inn en verdi, blir denne lagret som standardverdi. Problemet viste seg likevell å være at hvis verdier for en tekstboks endres når jeg ikke er i utformingsvisning, blir de ikke lagret.

Jeg lagde derfor en lignende kode som skulle lagre det jeg skrev inn i et tekstfelt.

Koden fungerte fint, men når jeg åpnet skjemaet var tekstboksen resatt til det siste jeg satt den til i utformingsvisning.

pris_1_save er tekstfeltet

Private Sub pris_1_AfterUpdate()
pris_1_save.Caption = pris_1.Value
End Sub

 

For meg virker problemet som at verdier satt for kontroller i skjemaer ikke blir lagret hvis jeg ikke er i utformingsvisning. Hvordan kan jeg løse dette?

Lenke til kommentar
Videoannonse
Annonse

den koden du ser over er vel det eneste jeg kan, kunne noen være så snille og forklart dette litt nærmere, og evt en kode?

 

takk for hjelpen

 

EDIT:

Hvordan lagre i variabel? og må variablene opprettes et sted først?

Endret av boy2star
Lenke til kommentar

Vel, de trenger ikke nødvendigvis opprettes et annet sted utenom formene, men det vil kreve ekstra arbeid. I bunn og grunn er det lettest og mest oversiktelig å plassere alle deklarasjonene i en global modul. Dette gjør du ved å trykke på menyelementet "Insert" og velge "Module". I kodevinduet som nå skulle ha gjort seg synlig, skal du skrive inn følgende kode:

Public sValue As String

 

Nå kan variabelen sValue benyttes overalt i prosjektet. Du kan eksempelvis da lagre verdien av en tekstboks således:

 

¨
Private Sub pris_1_AfterUpdate()

   sValue = pris_1.Value 

End Sub

 

Og hente verdien tilbake når formen aktiveres:

 

Private Sub UserForm_Activate()

   pris_1.Value = sValue

End Sub

Lenke til kommentar
Dette funker kjempefint, intill databasen blir lukket og åpnet igjen. Da forsvinner all dataen...

 

Hvordan løse dette?

Jeg hadde egentlig tenkt å svare selv, men så har jeg gått på en fylle"smell" :tease:

 

Aadnk er jo en guru her inne, og jeg ser han har hjulpet deg med å "lagre"verdiene men applikasjonen kjører. Hvis du vil lagre verdiene til neste kjøring av programmet må du i såfall skrive dem til disk eller registry. Men det jeg derimot ikke skjønner er hvorfor du ikke lagrer dem i databasen. Det er tross alt en Access database du holder på med.

 

Regner med at aadnk svarer deg før jeg får sjansen. Er langt ned i den x'te gin tonicen.

Lenke til kommentar

Det er ingen grunn til å putte disse verdiene inn i en database.

Hva med å lagre de i en tekstfil?

Registret blir dumt når jeg flytter databasen mellom maskiner.

 

Finnes det ingen måte å endre egenskapene til en kontroller permanent ved hjelp av kode/makro?

Er Access et så dumt program? (Ingen morsomheter, ikke jeg som valgte å lære det)

Lenke til kommentar

Nei, du må nok lagre informasjonen i en tekstfil. Men det burde ikke by på så altfor store problemer, især ikke hvis du benytter følgende class-modul:

 

Option Explicit

Private Type tProperty
   sName As String
   sValue As String
End Type

Private Type FileHeader
   PropCount As Long
   Properties() As tProperty
End Type

Private FileData As FileHeader

Public FileName As String
Public AutoSave As Boolean

Public Sub SaveData()

   Dim Free As Long, sFile As String
   
   Free = FreeFile
   sFile = ValidPath(CurrentProject.Path) & FileName
   
   If Dir(sFile) <> "" Then
       Kill sFile
   End If
   
   Open sFile For Binary As #Free
       Put #Free, , FileData
   Close #Free

End Sub

Public Sub LoadData()

   Dim Free As Long, sFile As String
   
   Free = FreeFile
   sFile = ValidPath(CurrentProject.Path) & FileName
   
   If Dir(sFile) <> "" Then
       Open sFile For Binary As #Free
           Get #Free, , FileData
       Close #Free
   End If

End Sub

Public Function AddProperty(sName As String, Optional sValue As String)

   ' Realloker variabel
   ReDim Preserve FileData.Properties(FileData.PropCount)
   
   ' Sett verdiene
   FileData.Properties(FileData.PropCount).sName = sName
   FileData.Properties(FileData.PropCount).sValue = sValue
   
   ' Vi har lagt til et elemet
   FileData.PropCount = FileData.PropCount + 1
   
End Function

Public Function RemoveProperty(ByVal Index As Variant)

   Dim Tell As Long
   
   Index = GetIndex(Index)
   
   If IsProperty(Index) Then
       
       ' Vi skal til å fjerne et element, subtraher for dette
       FileData.PropCount = FileData.PropCount - 1
       
       ' Flytt alle elementer over denne oppover, untatt det siste
       For Tell = Index To FileData.PropCount - 1
           LSet FileData.Properties(Tell) = FileData.Properties(Tell + 1)
       Next
   
       ' Realloker variabel
       ReDim Preserve FileData.Properties(FileData.PropCount - 1)
   
   End If
   
End Function

Public Property Get PropertyValue(ByVal Index As Variant) As String
   
   Index = GetIndex(Index)
   
   If IsProperty(Index) Then
       PropertyValue = FileData.Properties(Index).sValue
   End If

End Property

Public Property Let PropertyValue(ByVal Index As Variant, ByVal sNewValue As String)
   
   Dim lngIndex As Long
   
   lngIndex = GetIndex(Index)
   
   If IsProperty(lngIndex) Then
       FileData.Properties(lngIndex).sValue = sNewValue
   Else
       AddProperty CStr(Index), sNewValue
   End If

End Property

Public Property Get PropertyName(ByVal Index As Variant) As String
   
   Index = GetIndex(Index)
   
   If IsProperty(Index) Then
       PropertyName = FileData.Properties(Index).sName
   End If

End Property

Public Property Let PropertyName(ByVal Index As Variant, ByVal sNewValue As String)
   
   Dim lngIndex As Long
   
   lngIndex = GetIndex(Index)
   
   If IsProperty(lngIndex) Then
       FileData.Properties(lngIndex).sName = sNewValue
   Else
       AddProperty CStr(Index)
   End If

End Property

Public Function PropertyIndex(ByVal sName As String) As Long

   Dim Tell As Long
   
   For Tell = 0 To FileData.PropCount - 1
       If LCase(FileData.Properties(Tell).sName) = LCase(sName) Then
           PropertyIndex = Tell
           Exit Function
       End If
   Next
   
   ' Ingen resultater
   PropertyIndex = -1

End Function

Public Function IsProperty(ByVal Index As Long) As Boolean

   IsProperty = CBool(Index >= 0 And Index < FileData.PropCount)

End Function

Private Function ValidPath(sPath As String) As String
   
   ValidPath = sPath & IIf(Right(sPath, 1) = "\", "", "\")

End Function

Private Function GetIndex(ByVal Index As Variant) As Long

   If IsNumeric(Index) Then
       GetIndex = Fix(Index)
   Else
       GetIndex = PropertyIndex(Index)
   End If

End Function

Private Sub Class_Initialize()

   ' Standard fil å lagre til
   FileName = "Data.dat"
   AutoSave = True
   
   ' Last inn data automatisk
   LoadData

End Sub

Private Sub Class_Terminate()

   ' Lagre data automatisk, såfremt ikke annet er spesifisert
   If AutoSave Then
       SaveData
   End If

End Sub

 

Legg den inn i prosjektet ditt og kall den for clsProperties. Deretter deklarerer du klassen eksempelvis i modulen din, omtrent som så:

 

Public Properties As New clsProperties

 

Deretter kan du lagre egenskaper og variabler således:

 

Properties.PropertyValue("Something") = "hallo"

 

Du henter ut informasjonen som følger:

 

MsgBox Properties.PropertyValue("Something")

 

Alle variabler blir lagret (som standard) i filen "Data.dat" i samme mappe som databasen.

Lenke til kommentar

Hvis jeg vil lagre strengen pris_1s med koden

Properties.PropertyValue("Something") = "hallo"

Hvordan gjør jeg det?

Og hvis jeg vil lagre verdien til pris_1.Value med samme koden, hvordan gjøres det...

 

Er litt grønn, så beklager for dumme spørsmål.

 

Tusen takk for hjelpen hittil!

Endret av boy2star
Lenke til kommentar

Det er ikke verre enn som så:

 

Dim Properties As New clsProperties

Private Sub pris_1_AfterUpdate()

   Properties.PropertyValue("pris_1") = pris_1.Text

End Sub

Private Sub UserForm_Activate()

   pris_1.Text = Properties.PropertyValue("pris_1")

End Sub

 

Husk at du, som jeg også påpekte i min siste post, må legge til koden inn i prosjektet i form av en såkalt Class Module.

Lenke til kommentar

Når jeg legger inn all koden, og skal lagre for første gang fungerer det fint. Hvis jeg derimot lukker databasen og åpner den igjen får jeg denne feilmeldingen hver gang jeg prøver å lagre.

 

"Uttrykket ved aktivering som du har angitt som instilling for Hendelsesegenskapen, forårsaket feilen Member allready exists in an object module from which this object module derives."

Lenke til kommentar

Besynderlig, besynderlig. :hmm:

 

Kanskje forårsakes problemet av det faktum at "Properties"-klassens navn kolliderer med et annet objektnavn? I så fall kan det muligens bedre situasjonen om du endrer navnet på denne:

 

Dim objProperties As New clsProperties

Private Sub pris_1_AfterUpdate()

  objProperties.PropertyValue("pris_1") = pris_1.Text

End Sub

Private Sub UserForm_Activate()

  pris_1.Text = objProperties.PropertyValue("pris_1")

End Sub

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...