Avatar billede stone Forsker
28. maj 2000 - 12:33 Der 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.
Avatar billede sjensen Nybegynder
28. maj 2000 - 14:03 #1
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.
Avatar billede stone Forsker
28. maj 2000 - 15:15 #2
hvordan kan man sætte den til,og kun kan vælge en værdi med pilop/pilned og ikke indtaste?
Avatar billede borrisholt Novice
28. maj 2000 - 15:35 #3
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;


Jens B
Avatar billede stone Forsker
28. maj 2000 - 16:20 #4
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.


Avatar billede niller Nybegynder
28. maj 2000 - 16:55 #5
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.
Avatar billede borrisholt Novice
28. maj 2000 - 17:46 #6
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

Jens B
Avatar billede stone Forsker
28. maj 2000 - 18:23 #7
niller:
jeg vil ikke installerer et component,
så har man problemer hvis man skal arbejde på en anden computer.
Avatar billede stone Forsker
28. maj 2000 - 18:28 #8
hmm synes stadig det ikke hjælper,man kan slette værdierne,så feltet er tomt,
så man får en fejlmelding.
Avatar billede borrisholt Novice
28. maj 2000 - 19:23 #9
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 ....

Jens B
Avatar billede sjensen Nybegynder
29. maj 2000 - 11:09 #10
stone,

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);

Sådan kan du også klare den.
Avatar billede sjensen Nybegynder
29. maj 2000 - 17:19 #11
jeg skulle måske have lavet min kommentar som et svar, hvilket jeg hermed gør.
Avatar billede niller Nybegynder
29. maj 2000 - 21:21 #12
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.
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