OeO Skrevet 4. mars 2005 Del Skrevet 4. mars 2005 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
kaffenils Skrevet 4. mars 2005 Del Skrevet 4. mars 2005 Du kan kan lagre tekstfeltverdiene i globale variabler og hente disse inn nå du åpner skjemaet. Lenke til kommentar
OeO Skrevet 4. mars 2005 Forfatter Del Skrevet 4. mars 2005 (endret) 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 4. mars 2005 av boy2star Lenke til kommentar
aadnk Skrevet 4. mars 2005 Del Skrevet 4. mars 2005 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
OeO Skrevet 4. mars 2005 Forfatter Del Skrevet 4. mars 2005 Dette funker kjempefint, intill databasen blir lukket og åpnet igjen. Da forsvinner all dataen... Hvordan løse dette? Lenke til kommentar
kaffenils Skrevet 4. mars 2005 Del Skrevet 4. mars 2005 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" 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
OeO Skrevet 5. mars 2005 Forfatter Del Skrevet 5. mars 2005 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
aadnk Skrevet 5. mars 2005 Del Skrevet 5. mars 2005 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
OeO Skrevet 5. mars 2005 Forfatter Del Skrevet 5. mars 2005 (endret) 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 5. mars 2005 av boy2star Lenke til kommentar
OeO Skrevet 6. mars 2005 Forfatter Del Skrevet 6. mars 2005 Ingen som vet hvordan jeg anvender de siste kodene jeg fikk av aadnk? Trenger bare et eksempel på lagring. med tekstboksen pris_1. Lenke til kommentar
aadnk Skrevet 7. mars 2005 Del Skrevet 7. mars 2005 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
OeO Skrevet 10. mars 2005 Forfatter Del Skrevet 10. mars 2005 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
aadnk Skrevet 10. mars 2005 Del Skrevet 10. mars 2005 Besynderlig, besynderlig. 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
OeO Skrevet 10. mars 2005 Forfatter Del Skrevet 10. mars 2005 Kan prøve det hvis navnet kommer tilbake igjen. Bare forsvant nå, men da dukket nye opp. Kommer tilbake hvis jeg ikke klarer å fikse det jeg. Takk for hjelpen hittil. Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå