Avatar billede sjensen Nybegynder
12. november 1999 - 09:43 Der er 7 kommentarer og
1 løsning

Runtime - OnExit - ActiveControl

Jeg har et stort problem i mine applikationer:

Jeg bruger meget OnExit til at kontrollere indtastningen i et felt, men afhængig af hvilket komponent brugeren trykker på er jeg / er jeg ikke interesseret i at validere indholdet.

Eks. Når brugeren trykker på Cancel er jeg ligeglad med hvad der blev indtastet i et felt fordi funktionen jo netop afbrydes, men hvis brugeren trykker på OK, eller blot "tabber" sig ud af feltet, er jeg MEGET interesseret i at validere indholdet.

Da jeg samtidig bruger ikke at have bestemte knapper aktive, som f.eks. OK, før indholdet af et eller flere felter er ok, er det ofte sådan at næste logiske komponent i rækken netop er cancelknappen. Hvis jeg i OnExit derfor tester på "activecontrol" og der konstaterer at dette er Cancel vil jeg ikke validere indholdet. Men fordi det var en "Tab" ud af feltet vil jeg naturligvis validere indholdet alligevel.

Dette er er paradox jeg ofte bruger meget kode på at komme uden om og afte må jeg gå på kompromis og forlange at brugeren indtaster noget korrekt i et felt selvom hav ønsker at forlade funktionen, før han kommer ud af feltet.

Det der mangler (og som jeg har brug for) er en indikation af følgende:

I OnExit vil jeg gerne vide hvordan et felt forlades: Er der med TAB eller er det ved at brugeren med musen (eller en hotkey) har trykket på et andet komponent.

Er der noget der har ideer til løsning af dette ?
Avatar billede dj Nybegynder
12. november 1999 - 18:16 #1
jeg tvivler på at du får nogen til at finde ud af det for dig for 30 point ...
Avatar billede michaelras Nybegynder
15. november 1999 - 16:03 #2
Hvad med bare:

procedure TForm1.Edit1Exit(Sender: TObject);
begin
    if Form1.ActiveControl = btnCancel then
        ShowMessage('Valgt Cancel')
    else if Form1.ActiveControl = btnOK then
        ShowMessage('Valgt OK')
    else ShowMessage('Valgt noget andet');
end;

Eller var det lige netop det du ville undgå???

Michael

Avatar billede sjensen Nybegynder
18. november 1999 - 09:49 #3
Kommentar til michaelras svar:

Jep, det er lige nøjagtigt det jeg vil undgå.

Når man i en onexit event tester på activecontrol er det selvfølgelig værdien af det komponent der får focus efter exit, og når dette er cancel vil jeg gerne afbryde. MEN.. når næste logiske komponent i rækkefølgen er Cancel (fordi OK ikke er aktivt før indholdet af den komponent man er ved at exitte) så vil jeg selvfølgelig ikke afbryde men derimod validere indholdet.

Så jeg erkender at jeg vil blæse og have mel i munden samtidig.

Så spørgsmålet er stadig: Hvordan finder jeg ud af i en OnExit hvordan jeg forlader komponenten: Med tab eller ved et musetryk/hotkey på en anden komponent.

Hilsen
sjensen
Avatar billede gusse Nybegynder
28. november 1999 - 00:12 #4
Hvorfor ikke validere når brugere
trykker OK. Det syntes jeg er den bedste måde at gøre det på.

Du ved selv som bruger, at hvis man validere med det samme, så skal man slette alt i feltet bare for at komme ud, eller gå videre til det næste felt.

Så løb felterne igennem ved ok. hvis en validering fejler..oplys dette til brugere..
Avatar billede sjensen Nybegynder
02. december 1999 - 13:36 #5
Gusse> Undskyld den lange svartid. Jeg har været optaget af andre gøremål, men nu kan jeg lige kommentere din kommentar.

Ideen er umiddelbar god nok, men set med mine øjne kun når man laver data-entry rutiner. I et interaktivt miljø skal brugeren umiddelbart når han har indtastes noget, have at vide om det er ok. F.eks. hvis det er et kundenr, så undersøger appl. om kunden findes og viser f.eks. navn/adr eller saldo o.lign., INDEN brugeren begynder at udfylde evt. andre felter. Hvis kunden ikke findes skal brugeren have det at vide med en fejlmeddelelse.

Hvis man venter med det til alle felterne er udfyldt, og f.eks. kunden ikke findes, eller visse betingelser på kunden ikke er opfyldt og man derfor ikke kan udføre det man vil, vil man med dit forslag have udfyldt alle relevante felter til ingen nytte. Det er ikke brugervenligt nok til mig.

Jeg vil give brugeren besked så snart som muligt.

"Det kan du da stadig. Du validerer da bare igen når brugeren trykker på OM" kunne du så sige og det har du ret i, men at udføre de samme kald/valideringer igen er ikke en holdbar løsning. Mange af brugerne er forbundet via sløve linier (frame relay) og det tar tid nok i forvejen.

Så ideen er holdbar på nogle områder, men langt fra alle de områder jeg har behov for.

sjensen
Avatar billede gartner76 Nybegynder
07. december 1999 - 03:26 #6
Det er bare et hurtigt forslag, men kunnne man ikke bare lave en klasse med en attribut som blev sat på komponentens onactivate event ?
så ville der altid stå hvad der var aktiv sidst.
man kunne også lave en tstringlist i klassen i stedet for en string så kunne man følge hele forløbet af tryk. Dette ville også virke hvis man tabber sig væk og der er noget andet der kommer i fokus, så kan man blot læse i stringlisten hvad der var aktivt før der blev tabbet væk.

Håber det kan give dig en ide
Avatar billede sjensen Nybegynder
10. december 1999 - 13:54 #7
Gartner76> ideen er ikke helt ringe, men dels betyder det vel at der skal oprettes nye klasser for alle de typer komponenter der kan forekomme formen (og som kan have fokus) og dels er det ikke lige behovet for at vide hvilket felt der sidst var aktivt, der er problemet. (det har jeg faktisk et andet spørgsmål om men det er allerede besvaret). Det er behovet for at vide hvordan et felt forlades (tilrådighed i feltets onexit event) jeg har behov for.

sjensen
Avatar billede sjensen Nybegynder
26. december 1999 - 07:55 #8
Jeg lukker spm.

Tak for deltagelsen og kommentarene, men desværre var der ikke noget brug- og/eller holdbart
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
Kurser inden for grundlæggende programmering

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