Avatar billede slowaterz Nybegynder
05. januar 2005 - 15:55 Der er 4 kommentarer og
1 løsning

Runtime error på vej ud af programmet

Mojn,

Jeg er rendt ind i et mærkeligt problem.

Mit program modtager et brugernavn og fosøger at logge på en Oracle database :

  try
    ADOConnection.Open(..);
  except

  end;

For at brugeren ikke skulle kunne angive et tomt brugernavn, kører programmet den her :

  if Uppercase(Trim(s_usrName)) = '' then

og spørger brugeren, om han vil forsøge at indtaste brugernavnet igen eller vil fortryde.

Hvis brugeren vælger det sidste, skal programmet bare afslutte. Problemet er, at der kommer en "Runtime error 216" - access violation under de afsluttende manøvrer.

Jeg har forsøgt at steppe mig igennem koden, men fejlen opstår et sted efter den følgende kodeblok :

  ...
    if FormMain.ADOConnection.Connected then
      Application.Run
    else
      Application.Terminate
  end.

Siden brugeren ikke har angivet noget brugernavn, er der ikke blevet oprettet nogen forbindelse til databasen, så programmet hopper ned til Terminate, som er den allersidste linie i '.dpr' filen.

Mit umiddelbare bud er, at programmet forsøger at frigive noget allerede frigivne hukommelse, men hvordan kontrollerer jeg det ?
Avatar billede slowaterz Nybegynder
05. januar 2005 - 16:07 #1
Jeg fandt noget mere :

koden, hvor brugeren skal angive brugernavnet kører i en løkke, indtil der kommer et gyldgt eet, eller brugeren fortryder.

Hvis brugeren angiver et ugyldigt brugernavn og programmet forsøger at logge på databasen, vil det ikke lykkes. Programmet vi så vende tilbage til "Angiv brugernavn". Hvis brugeren i andet forsøg angiver et "tomt" eet og derefter fortryder efter at have fået at vide, at brugernavnet skal angives, så afslutter programmet, som det skal.

???
Avatar billede nca Juniormester
05. januar 2005 - 16:22 #2
Prøv med en Try.. except
if FormMain.ADOConnection.Connected then
      Application.Run
    else
      Application.Terminate
  end;

skal se således ud:
if FormMain.ADOConnection.Connected then
  try     
    Application.Run
  except
    Application.Terminate
  end;
Avatar billede doc404 Novice
05. januar 2005 - 16:27 #3
Du må ikke kalde Application.Terminate uden at have kaldt Application.Run.
Avatar billede slowaterz Nybegynder
06. januar 2005 - 08:01 #4
Kaldet til  Application.Terminate  satte jeg ind som et forsøg - fejlen kommer uanset, om den linie er der eller ej.

Jeg har prøvet med

  begin
    Application.Initialize;
    Application.CreateForm(TFormMain, FormMain);
    if FormMain.ADOConnection.Connected then
    try
      Application.CreateForm(..);
      Application.CreateForm(..);
      Application.CreateForm(..);
      Application.CreateForm(..);
      Application.Run;
    except
      ShowMessage('Error in "try..except" block');
    end
    else
      ShowMessage('Error in "else" block');
  end.

Samme resultat. Programmet når ned til min egen fejlmelding 'Error in "else" block'. Det er først derefter toget kører af skinnerne.

Jeg har også prøvet at flytte oprettelsen af alle forme på nær Main ind i 'if' blokken. Så det må være noget på FormMain. Jeg vil skyde på 'ADOConnection' eller noget, der er knyttet til den. Hvis man indtaster et forkert brugernavn og derefter fortryder, kommer der ingen fejl.
Avatar billede slowaterz Nybegynder
25. august 2010 - 15:37 #5
Spørgsmålet er forældet og bliver hermned lukket.
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