28. maj 2000 - 12:33Der er
11 kommentarer og 1 løsning
spinedit
hvordan undgår jeg at programmet hængert hvis der ikke står noget tal i spinedit. problemet opstår når man sletter f.eks. o og trykker 1 på spinedit. jeg får en meddelse"is not a valid integer value" det forstår jeg godt.
spørgsmål: men hvordan får jeg den til at accepterer en tomt felt i spinedit,indtil der sker en indtastning.
Brug onExit eventen til at checke indholdet, og evt. OnChange til at forhindre at feltet er blankt. Du kan også vælge at sætte det til at man kun kan vælge en værdi med pilop/-ned og ikke kan indtaste.
Jeg vil anbefale dig en mere generel teknik. Fordi n;stegang du har brugr for validering, er det måske fra et edit felt som din streng kommer, og det er ikke nødvendigvis tal værdier hver gang.
Derfor anbefaler jeg det følgende :
Procedure ValidateString(var s : String; LegalChars : String = '1234567890'); var i : Integer; begin if s = '' then exit; for i:= 1 to length(s) do if pos(s[i],LegalChars) = -1 then Delete(s,i,1); end;
procedure TForm1.SpinEdit1Change(Sender: TObject); var s : String; begin s:= SpinEdit1.Text; ValidateString(s); SpinEdit1.Text := s; if SpinEdit1.Text = '' then SpinEdit1.Text := '0'; end;
borritholt: spinedit1 skal kun have 2 tal værdier, men kun 1-23 accepteres. med dit eksempel kan man nu indtaste 3 tal værdier i spinedit1. Det giver en fejlmeddelse om at"120 timer ikke er en value time" jeg har 3 spinedit som skal sætte en alarm igang eller en meddelse. en til timer,en til minutter, en til sekunder.
I RxLib komponent-pakken er der også en spin-edit. Der er det fixet, så der ikke kommer en fejl hvis feltet er tomt. Du kan hente RxLib fra www.torry.ru.
Jammen så lave en regl for det i din valisering af din streng
fx.
Procedure ValidateString(var s : String; LegalChars : String = '1234567890'); var i : Integer; begin if (Length(s) <1) then exit; if (Length(s) >2) then Delete(s,Length(s),1); for i:= 1 to length(s) do if pos(s[i],LegalChars) = -1 then Delete(s,i,1); end;
Så kan du ihvertfald kun have 1 eller 2 karekterer i din spin kontrol
Det kan jeg nu ikke lige forstå det skulle der gerne være lavet om på i det kode der står i SpinEdit1Change() proceduren. Ellers E-mail mig lige koden så jeg kan se hvad du laver ... Jeg sidder her på min pind resten af eftermiddagen ....
hvis du helst vil kunne indtaste og ikke har brug for at kunne vælge op og ned, så brug et editfelt med en OnXeit event, og maxlength sat til 2:
i onexiteventen skriver du:
procedure tform1.edit1exit(... var tal : integer; begin edit1.text := trim(edit1.text); // fjern evt. blanke if length(edit1.text) = 0 then begin edit1.setfocus; // tal ikke accepteret. Gå tilbae til feltet igen end; try tal := strtoint(edit1.text); if (tal < 1) or (tal > 23) then edit1.setfocus; // igen fejl. gå tilbage except // edit1 indeholder ikke et tal. fejl = gå tilbage on exception do begin edit1.setfocus; end; end; end;
Men så kan du ikke vælge op og ned.
Hvis du vil kunne vælge et timetal, et minuttal og et sekundtal, uden at kunne indtaste det, så brug 3 comboboxe. I den første (i stringspropertyen) skriver du alle tal fra 0 til 23 (med et på hver linie, og i de 2 andre alle tal fra 0 til 59 (minutter og sekunder). Sæt comboboxens type til DorpDownList. Så kan du ikke skrive men kun vælge, og efter valget vil
combobox1.text = timer combobox2.text = minutter og combobox3.text = sekunder.
Og da du er sikker på at text-felterne indeholder et validt tal kan du uden videre dikkedarer konvertere dem:
timetal = strtoint(combobox1.text); minuttal = strtoint(combobox2.text; og sekundtal = strtoint(combobox3.text);
mht. ikke at installere et komponent: Der er ingen grund til ikke at installere RxLib, det er måske den bedste komponent-pakke overhovedet - og så er den gratis.
Synes godt om
Ny brugerNybegynder
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.