Avatar billede weinreich Nybegynder
09. april 2002 - 17:13 Der er 30 kommentarer og
1 løsning

Begrænset adgang til controls

Jeg vil gerne i min database forhindre folk i at indtaste oplysninger i diverse controler uden først at tage stilling til om de vil ændre det de er i gang med at ændre.
Jeg havde forestillet mig at man når man trykker en tast vil man få en dialogbox der spørger om man vil ændre værdien. Hvis man så vælger ja skal den bestemte control så blive unlocked. Jeg er ikke helt sikker på det men kan man locke en hel form. Jeg kunne forestille mig at når man trykkede en tast og siger ja låser hele formen op og når man exiter den enkelte control låser hele formen, men jeg er ikke klar over hvordan det vil foregå.
Man skal også huske at det som der evt er blevet rettet ved nedtastningen ikke skal gemmes men at den gamle værdi genindsættes hvis man siger nej (eller sker der ikke nogen ændring i en celle ved eventet on key down?)
Nå men jeg vil blive rigtig glad for nogle råd med et spørgsmål jeg mener må være til at klare.

Point gives gerne til alternative svar.
Avatar billede weinreich Nybegynder
09. april 2002 - 17:13 #1
Det skal desuden lige nævnes at jeg arbejder i '97
Avatar billede mugs Novice
09. april 2002 - 17:31 #2
Det at locke en hel form tror jeg ikke kan gøres som ved et felt. Men i formens Ved Aktuel hændelse kan man indsætte

Me.Alloweditions = True eller False

samt et par beslægtede koder. Hvis man før denne kode indsætter en MsgBox med vbYesNo og ved valg af Yes vælger:

Then Me.Alowweditions True
Else
Me.Undo
Me.Alloweditions = False
End If

Ovennævnte er kun en strøtanke og ikke afprøvet.
Avatar billede weinreich Nybegynder
09. april 2002 - 17:36 #3
Var det så meningen at for at "låse" formen igen skulle man lave en Me.Alloweditions = false på exit control eventet?
Og på et andet punkt...hvordan laver man en messagebox :-? hehe
09. april 2002 - 17:41 #4
Hej Weinreich,

Følgende procedure låser/låserop kontroller på formularen. Proceduren låser kun de felter, som har egenskaben "Mærke" (Tag) sat til "Lock":

Public Sub LåsKontroller(Lås as boolean)
        Dim n as integer
        Dim frm as Form
        Set frm = Screen.Activeform
        For n = 0 To frm.Count - 1
            If frm(n).Tag = "Lock" Then
                frm(n).Locked = Lås
                frm(n).BackColor = QBColor(7)*Lås
            End If
        Next n
end sub

Dernæst kan du blot skrive:
LåsKontroller True

så låses de valgte kontroller. Eller:
LåsKontroller False
så åbnes de igen.

Jeg plejer at gøre det således at felterne er låst fra starten, men at brugeren så kan klikke på en knap, som kalder ovenstående funktion. Derefter kan brugeren rette.

/Thomas
09. april 2002 - 17:43 #5
En lille fejl sneg sig ind: Hvis man ønsker at kontrollen skal skifte farve til grå, når den er låst, skal sætningen se sådan ud:
frm(n).BackColor = -QBColor(7)*Lås
Avatar billede weinreich Nybegynder
09. april 2002 - 17:46 #6
men det vil sige at jeg kan lave en knap der låser op for alle med Lock i tagen, og derefter sige LåsKontroller True ved et evt. exitcontrol event, hvis jeg gerne vil have at man kun kan rette en ad gangen?
Og hvad er det med BackColor?
Avatar billede weinreich Nybegynder
09. april 2002 - 17:46 #7
hehe ok
Avatar billede weinreich Nybegynder
09. april 2002 - 17:47 #8
jeg vil lige se om jeg kan få det til at virke
Avatar billede mugs Novice
09. april 2002 - 17:49 #9
weinreich > Der kom lige en haj forbi :o)
Jeg trækker mig ydmygt tilbage og lytter. Jeg har dog en lille testdb i Access97 der omhandler MsgBox i.f.m. betingelser.
Jeg sender den gerne, hvis du lægger din e-mail
09. april 2002 - 17:49 #10
typisk vil man låse kontrollerne igen ved Form_AfterUpdate
Avatar billede weinreich Nybegynder
09. april 2002 - 17:51 #11
Mugs jeg vil meget gerne lige se hvad det er så...

lweinrei@ford.com
Avatar billede weinreich Nybegynder
09. april 2002 - 17:52 #12
Kan jeg ikke lægge LåsKontroller ind under form_activate eventet?
Avatar billede mugs Novice
09. april 2002 - 17:54 #13
Sendt.
Avatar billede weinreich Nybegynder
09. april 2002 - 17:59 #14
takker
09. april 2002 - 18:03 #15
jo, men Form_Load vil nok være mere praktisk...
Avatar billede weinreich Nybegynder
09. april 2002 - 18:05 #16
Ok det virker rent faktisk men der er altså et eller andet galt. Når jeg starter er alle dem som jeg har sat til at være låste grå så det er som det skal være, men.... når jeg låser dem op bliver de sorte????? Det fatter jeg slet ikke.
Hvordan undgår jeg at de bliver sorte men hvide istedet? Ellers er det helt vildt fedt og der er point hjemme men lige den her mangler jeg
Avatar billede weinreich Nybegynder
09. april 2002 - 18:15 #17
ok jeg smutter lige fra arbejde nu, men jeg kigger på det i aften eller i morgen og så skal jeg nok distribuere lidt point :-)
Avatar billede terry Ekspert
09. april 2002 - 18:18 #18
just read the question so havent read all th eother comments and answers.
WHY not do it another way! Let the user alter the data and before it gets accepted ask the user if they REALLY DO want to update?
Avatar billede terry Ekspert
09. april 2002 - 18:21 #19
In the forms BEFORE UPDATE event
If MsgBox("Accept changes?", vbYesNo) = vbNo Then
  Cancel = True
End If
Avatar billede terry Ekspert
09. april 2002 - 18:24 #20
Why lock a form if the user can still alter data?
09. april 2002 - 19:34 #21
Terry, I think we are past that...

Weinreich-> Det med den sorte var en tanketorsk fra min side (troede at hvid=0, tsk tsk tsk)

I stedet skal den se således ud:
Public Sub LåsKontroller(Lås as boolean)
        Dim n as integer
        Dim frm as Form
        Set frm = Screen.Activeform
        For n = 0 To frm.Count - 1
            If frm(n).Tag = "Lock" Then
                frm(n).Locked = Lås
                if Lås then
                    frm(n).BackColor = QBColor(7)
                else
                    frm(n).BackColor = QBColor(15)
                endif
            End If
        Next n
end sub
09. april 2002 - 20:00 #22
Sådan går det, når man forsøger at improvisere undervejs ;o)
Avatar billede nih Novice
09. april 2002 - 20:06 #23
Private Sub Tekst14_KeyDown(KeyCode As Integer, Shift As Integer)
  If KeyCode = 13 Then
    Me.Tekst14 = InputBox("Vil du ændre værddien", , Me.Tekst14)
  End If
End Sub
Avatar billede nih Novice
09. april 2002 - 20:09 #24
Unskyld jeg blander mig her til sidst, men denne kode anvender jeg.

tekst14 er navnet på tekstboxen, der er låst.
Når brugeren står i tekstboxen, kan han IKKE ændre værdien på anden måde end taste 'enter' og svare på inputboxen, der dukker op

Niels
09. april 2002 - 20:12 #25
hej Niels,

Ideen er god - jeg har selv bruge samme ide somme tider.
ENTER er måske ikke så god, da man ofte bruger den til at drøne gennem alle felter.
Endvidere sker der noget uhensigtsmæssigt, hvis brugeren klikker Annullér på inputboksen (guess what)
Avatar billede terry Ekspert
09. april 2002 - 20:12 #26
Thomas> Why are we past that? weinreich may not be aware of this possibility!
Avatar billede nih Novice
09. april 2002 - 20:15 #27
Jeg har tit prøvet at få parrametrene ('OK' og 'anuller') fra inputboxen med i koden, men uden held :(

Ved i hvordan man fanger dem ??

Niels
Avatar billede nih Novice
09. april 2002 - 20:26 #28
Private Sub Tekst14_KeyDown(KeyCode As Integer, Shift As Integer)
Dim temp
  If KeyCode = 13 Then
    temp = InputBox("Vil du ændre værddien", , Me.Tekst14)
    Me.Tekst14 = IIf(temp = "", Me.Tekst14, temp)
End If
End Sub

Så burde også Thomas være tilfreds ;o)

Niels
09. april 2002 - 23:09 #29
Niels->Jep, så er jeg tilfreds ;o)

Og du har lært at Cancel = "", når vi snakker om inputboks'e!!

Terry->Sorry, jeg misforstod dit indlæg :o(
Men du har helt ret; Det er også en måde at gøre det på.
Det hele afhænger af hvad det er man ønsker at beskytte sig mod.
Hvis man ønsker at sikre sig at brugeren rent faktisk ønsker at gemme ændringerne (og ikke blot har tabt telefonen ned oven på tastaturet) så er din løsning rigtig god.

Niels' løsning er god, hvis man kun ønsker at låse få felter ad gangen (ellers bør man i hvert fald lave koden som en generel funktion så man ikke har den samme stump kode liggende på 30 tekstbokse)

Mit forslag er godt, hvis folk er mere fortrolige med den gammeldags måde at 'åbne' posten for redigering. Jeg bruger faktisk oftest Terry's løsning, men har adskillige gange brugt min egen, hvis det var det, kunden ville have - i bund og grund er det nok en smagssag.

Endelig har jeg også lavet løsninger hvor man skulle taste et password, hvis man skulle have lov at ændre indholdet af en tekstboks.

/Thomas
Avatar billede terry Ekspert
10. april 2002 - 08:17 #30
As far as I see it ALL persons are allowed to alter data IF they want to. So way all the bother trying to STOP them from doing so? If the user enters data legitimately, OR by throwing the keyboard at the boss, then what is more easier than just asking them if the changes made are to be saved?
Avatar billede weinreich Nybegynder
10. april 2002 - 11:00 #31
Thx for all the answers, I have somethings to think about now. And yes Terry maybe you have the best solution, I just never thought about the problem that way.
Takker til alle.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester