17. august 2005 - 19:03Der er
14 kommentarer og 4 løsninger
Stop hvis en If kode bliver udført
Hej!
Jeg sidder af og til og programmere lidt i min fritid... Jeg er ved at lære det, men er langt fra rigtig god til det... Jeg finder dog af og til på nogle gode ideer, og lige nu er jeg i gang med mit hidtil største projekt.
Programmet lægger bla. tal sammen, og det er her problemet ligger... Hvis man ikke skriver noget i feltet, hvor det tal man ellers ville have lagt til, skulle stå, så kommer der en kritisk fejl, og prgrammet går ned... Derfor har jeg skrevet følgende stykke kode før den udfører komandoen der lægger tallet til.
If Edit1.Text = '' Then Fejl1.Show Else "Kør resten af koden"
Mit ptoblem er så, at selv om den finder ud af at der ikke står noget i feltet, så viser den bare den fejl boks jeg selv har lavet, og kører videre... Ideen var jo at den skulle vise min fejl, OG SÅ STOPPE!
Hvordan får jeg den til at stoppe, når den har udført det der står i min "If komando" ?
Og så en anden ting... Kan man få den til at gøre et eller andet (f.eks vise en boks, og så stoppe) hvis den finder ud af at det er bogstaver det står i feltet?
1) Du har en komando der hedder Exit. De exit'er ud af din prodedure. 2) I Delphi 6 og frem er der kommet funktioner til den slags du får lige implemteringen af dem her :
function StrToIntDef(const S: string; Default: Integer): Integer; var E: Integer; begin Val(S, Result, E); if E <> 0 then Result := Default; end;
function TryStrToInt(const S: string; var Value: Integer): Boolean; var E: Integer; begin Val(S, Value, E); Result := E = 0; end;
Altså kan du i dit program skrive noget alla det her :
var a, b : Integer; begin if TryStrToInt(Edit1.Text, a) then if TryStrToInt(Edit2.Text, b) then Edit3.Text := IntToStr(a+b); end;
Hvis jeg skal illustere Exit komandoen så kunne man gøre noget alla det her :
var a, b : Integer; begin if not TryStrToInt(Edit1.Text, a) then exit; if not TryStrToInt(Edit2.Text, b) then exit;
if StrToIntDef(Edit1.Text,MinInt) = MinInt then ShowMessageDlg('Skriv et tal',mtError,[mbOK],0) else begin .. end;
Alternativt kan du bruge den "kritiske fejl" du snakker om. De kaldes også exceptions. Det er måske ikke ligefrem begynderstof, men jeg viser lige eksemplet. Jeg sidder ikke ved en Delphi lige nu, men fejlmeddelelsen der kommer op siger noget om at en exception á lá EInvalidInput has been raised. Sådan en kan vi fange og håndtere:
begin try if Edit1.Text = '' then raise Exception.Create(Du indtastede intet i feltet. Jeg kunne godt bruge et tal');
i := StrToInt(Edit1.Text); ... except on E: EInvalidInput do ShowMessageDlg('Du indtastede ikke et tal'#13#10 + E:Message,mtError,[mbOK],0); on E: Exception do ShowMessageDlg(E:Message,mtError,[mbOK],0); end;
Eksemplet er interessant fordi den viser hvordan man bruger exceptions. I den første "IF" laver jeg selv en exception hvis feltet er tomt. Det betyder at alt indenfor try-except skippes og programmet går ned til on E: "et eller andet". Her er det en Exception, så det er den sidste "ON" der bruges - Exception er "mother of all exceptions" så den er placeret sidst.
Hvis jeg ikke kan konvertere Edit1.Text til en int, så raiser StrToInt selv en exception (og det er den jeg ikke kan huske hvad hedder). Det fanges i den første "ON".
I øvrigt. Exceptions er sløve - bruge den med omtanke
Doc404 -> Det var, som sagt, lige det der skulle til, for at den gjorde som jeg ville have den til... Mange tak, du løste det ene problem :) Hvis du lige lægger et svar, så får du også lidt point...
Borrisholt/Jens B -> Jeg kan ikke rigtig få "exit" komandoen til at virke... Når den støder på en "exit" i koden, så kommer den ikke længere, lige meget om den udfører den del eller ej (hvis det f.eks står inder "IF") Derfor bruger jeg Doc404's forslag istedet... Hvad angår mit andet spørgsmål, så synes jeg Hrc's forslag er nemmere... Dog skal det siges at dit også virker, så du skal også nok få nogle point :)
Hrc -> Jeg kan ikke få det med Exceptions til at virke, men du skrev jo også selv, at det ikke lige var begynderstof... Derimod var "StrToIntDef" komandoen faktisk endnu bedre end det jeg søgte! Det er bare skønt, så kan jeg komme videre med mit program... Menge tak, og en slat point til dig... ;)
Nu sidder jeg ved en Delphi og den rettede version af "exceptions" er her (mange fejl, beklager):
var i : integer; begin try if Edit1.Text = '' then raise Exception.Create('Du indtastede intet i feltet. Jeg kunne godt bruge et tal');
i := StrToInt(Edit1.Text); except on E: EConvertError do MessageDlg('Du indtastede ikke et tal'#13#10 + E.Message,mtError,[mbOK],0); on E: Exception do MessageDlg(E.Message,mtError,[mbOK],0); end; end;
Ovenstående eksempel er lidt besværligere idet der bliver "poppet" exceptions i Delphi. Vi fanger dem bare når vi kører videre. Prøv at køre exe-filen eller fjern "fluebenet" i "Stop on Delphi Exceptions" (Debugger Options, Language Exceptions).
(Jeg kan i øvrigt anbefale dig at hente GExperts og lære det at kende. Den udvider dit udviklingsmiljø med en masse smarte ting)
Borrisholt/Jens B -> Nu har jeg fået "Exit" komandoen til at virke... Fandt ud af, at det var fordi jeg ikke gjorde som du skrev... Jeg havde nogle "Else" imellem... Ville ellers gerne give dig nogle point, men hvis du mener Doc404 har mere brug fo dem, ja så for han dem da... Hehe...
Hrc -> Ok... Takker... Tror dog ikke lige jeg vil bruge "exceptions" nu, men jeg vil da huske det til senere brug... Vil da også lige se på det der GExperts... Hehe...
Hvorfor nægter den mig bare at give andre point? Det gjorde den også sidste gang jeg stillede et spørgsmål... Hmm... Måske fordi jeg bruger FireFox? Vil da så lige prøve med Internet Explorer...
Nu gik det... I var så bare nød til at have lige mange points allesammen... Nå... Jeg havde det nu også lidt skidt med ikke at give så mange point til nogle af jer, når i nu har julpet mig så meget videre... Endnu en gang tak...
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.