Avatar billede whynot Nybegynder
25. december 2003 - 22:19 Der er 9 kommentarer og
1 løsning

et banalt spørgsmål om if statements og procedures

Jeg har et lille hurtigt spørgsmål... og jeg ved det i grunden godt - men jeg vil blot være 100% sikker på at min antagelse er rigtig.

Jeg har kodet meget i php...og der kan man gøre det at man tjekker om en procedure går godt ved blot at lade proceduren ligge i en if then statement... med den antagelse at den er lig true hvis det er gået godt ..og false hvis et eller andet gik galt.

jeg har en LAAAAAANNNNNNGGGGG procedure i delphi 7.. som connecter til en database flere gange og laver en lang række sql-statements.. jeg vil gerne vide om den gik godt eller ej.


kan man kort sagt gøre følgende: "if tjeckbruger then" ... else ... ?
Avatar billede nca Juniormester
25. december 2003 - 22:27 #1
Enten skal du lave en global variabel, som du selv styrer værdien af inde fra proceduren. Ellers skal du lave proceduren om til en funktion, hvor du returnerer en boolean vha. af variablen Result.
Hver gang der er mulighed for en fejlsituation bør du sætte sætningen ind i en Try .. Except struktur.
Avatar billede doc404 Novice
25. december 2003 - 22:32 #2
Ja, men du skal bruge en function i stedet for procedure.

F.eks.

function CheckBruger : boolean;
begin
  ...
  if all_is_ok then
    Result := True
  else
    Result := False;
end;

...

if CheckBruger then
  bla bla ok...
Avatar billede doc404 Novice
25. december 2003 - 22:33 #3
jep..skal lære at læse videre end 'global variable' i andres kommentare... ;-)
Avatar billede whynot Nybegynder
25. december 2003 - 22:40 #4
det lyder rigtigt.. men.. hvordan afgører jeg så i funktionen om de 200 linier går godt?.. jeg kan vel ikke sætte alle linierne ind i en if then statement.. eller?
Avatar billede hrc Mester
25. december 2003 - 22:42 #5
Du bør helt klart benytte exceptions... Nedenstående er ikke den bedste løsning idet du

Det du vist spørger om er følgende konstruktion:

function DoALotOfThings : boolean;
begin
  screen.cursor := crHourglass;
  try
    try
      if not DoThis then
        raise exception.create('DoThis');

      if not DoThat then
        raise exception.create('DoThat');

      result := true; // Coming here it all went well
    except
      result := false;  // Should correctly be placed before the try's

// You might wanna thow this in instead....

//      on e: exception do
//        raise exception.CreateFmt('Error in DoALotOfThings'#13#10+
//                                  'Operation: %s',[e.message]);

    end; // try
  finally
    screen.cursor := crDefault;
  end; // try
end;
Avatar billede hrc Mester
25. december 2003 - 22:43 #6
Fik ikke lige slettet det første i mit indlæg (man skal godt nok være hurtig for der var ingen indslag da jeg startede med at skrive...)
Avatar billede whynot Nybegynder
25. december 2003 - 23:16 #7
hmmm.... hvis jeg forstår dig korrekt hrc.. så skal jeg:

1. lave min procedure om til en function.
2. lave en try før al kode.. og fyre én on e: exception do... i exception-delen.
3. siger du at jeg skal initialisere result??!?!.. det lyder lidt underligt.
4. er det virkelig nødvændigt at jeg fyrer en "if not DoThis then
        raise exception.create('DoThis');" af før enhver delstatement?.. det er vel kun nødvændigt såfremt jeg ønsker at vide hvilken del som gik galt - ikke sandt? Fordi det jeg søger er blot om hele koden gik godt eller ej.

...ps.. jeg forhøjer points for dette spørgsmål til 30.. jeg anede ikke at det var så omfattende :)

try før al kode i
Avatar billede hrc Mester
25. december 2003 - 23:58 #8
ad. 1: Det er korrekt. Hvis du vil sætte noget ind i en if-sætning så er det funktioner.

ad. 2: Konstruktionen:

try
  try
    if not KrimseKrams1 then // Hvis det mislykkes...
      raise exception.create('KrimseKrams1');

    if not KrimseKrams2 then
      raise exception.create('KrimseKrams2');
  except
    on e: exception do
      raise exception.createfmt('thisfunc'#13#10'%s',[e.message]);
  end;
finally
end;

kan jeg godt lide. Her er det en procedure hvori fejlsituationer returneres som exceptions.

I det første eksempel blander jeg det lidt sammen idet jeg bruger exceptions til at skippe intern kode, hvis der sker en fejl undervejs. De udkommenterede linier var for at illustrere, at der var andre løsninger.

3. Det er korrekt at result altid initialiseres, men en god regel er at gøre det først alligevel. Bare vent til du pludselig sidder med C/C++.

Der var to måder at gøre tingene på

result := false
try
  DoSomething;
  result := true;
except
end;

eller:

try
  DoSomething;
  result := true;
except
  result := false
end;

ad. 4: Det er korrekt - i eksemplet var det for at illustrere hvordan man skippede intern kode i tilfælde af fejl. Der er ingen fornuft i at kalde KrimseKrams2 hvis 1'eren fejler.
Avatar billede whynot Nybegynder
26. december 2003 - 10:59 #9
jamen fino - og tak for den uddybende hjælp - dejligt :)

God jul og godt nytår til alle.
Avatar billede whynot Nybegynder
26. december 2003 - 11:00 #10
øhmm... hvordan giver jeg extra points?... jeg kan ikke forhøje til 30points?!?!
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