Avatar billede kennethv Nybegynder
14. januar 2009 - 11:24 Der er 10 kommentarer og
1 løsning

Access Violation på showmodal

Jeg skal åbne et ny form. Der ligger intet på formen og det har gjort på denne måde:

procedure TFrmMain.BitBtn3Click(Sender: TObject);
begin
  with frmLDAP.Create(nil) do
  try
    showmodal;
  finally
    free;
  end;
end;

Det fungere fint, men i det øjeblik jeg putter en TBitBtn på får jeg en fejl som siger at der allerede findes en.

Øhhh, nå. Det kan jeg ikke forstå, for der var intet på formen før den blev lagt på. Jeg fjernede så knappen, men nu får jeg heletiden en "access violation" fejl når jeg forsøger at åbne formen.

Nogen der kan fortælle mig hvad jeg gør galt?
Avatar billede kennethv Nybegynder
14. januar 2009 - 12:51 #1
Jeg skal måske lige for en god orden skyld lige sige at den:

procedure TFrmMain.BitBtn3Click(Sender: TObject);
begin
  with frmLDAP.Create(nil) do
  try
    showmodal;
  finally
    free;
  end;
end;

er fra min mainform, hvor der er 2 TBitBtn (TBitBtn1 og TBitBtn2) på. Men jeg anser ikke at de skulle give problemer, da de ligger på en anden form end den jeg forsøger at kalde.
Avatar billede hrc Mester
14. januar 2009 - 14:16 #2
Har du prøvet at kalde formen med self i stedet for nil?
Avatar billede hrc Mester
14. januar 2009 - 14:19 #3
Åhh. frmLDAP er ikke en klasse er det? Det er et objekt (da det mangler T'et). Prøv det her.

procedure TFrmMain.BitBtn3Click(Sender: TObject);
begin
  with TfrmLDAP.Create(self) do
    try
      ShowModal;
    finally
      Release;
    end;
end;

Eller endnu mere penslet ud:

procedure TFrmMain.BitBtn3Click(Sender: TObject);
var
  frmLDAP: TfrmLDAP;
begin
  frmLDAP := TfrmLDAP.Create(self);
  try
    frmLDAP.ShowModal;
  finally
    frmLDAP.Release;
  end;
end;
Avatar billede kennethv Nybegynder
14. januar 2009 - 14:21 #4
Det skal siges, at i det foregående kald er frmLDAP sat til available forms i Menu -> Project -> Options -> Forms.

Men hvis jeg sætte frmLDAP til Auto-create forms og gør sådan her, har jeg ingen problemer.

procedure TFrmMain.BitBtn3Click(Sender: TObject);
begin
  frmLDAP.showmodal;
end;
Avatar billede kennethv Nybegynder
14. januar 2009 - 14:24 #5
HRC! SMUKT.
Utroligt hvad sådan en lille detalje kan gøre.

Det spiller bare.

Jeg valgte det første eksempel.

Du må lige svare. :)
Avatar billede mbsnet Nybegynder
14. januar 2009 - 20:38 #6
Bemærk hvis du vil oprette en form kun via kode:
Der er mere en 1 constructor, og den normale ".create" skal ikke bruges, men "createNew" skal bruges, for at det virker. eksempel:

with tForm.createNew(nil) do begin
showModal;free
end;

//mbs
Avatar billede hrc Mester
15. januar 2009 - 12:06 #7
mbsnet: øhh. Jeg bruger altid Create. Hvad er der galt med den? Desuden sætter jeg altid self eller application.MainForm i som parameter så jeg kan bruge formens Position-property til at angive placeringen på skærmen.

Bruger tit one-linere. En form hvor Action := caFree er sat i OnClose kalder jeg på denne måde:

  TfrmMyForm.Create(self).ShowModal;
Avatar billede hrc Mester
15. januar 2009 - 14:21 #8
mbsnet: Opretter du forme helt fra bunden af? Lidt interesseret i at se eksempler hvor man det er praktisk at gøre dette. Hvis man har lavet sin egen runtime form designer eller sådan noget?
Avatar billede mbsnet Nybegynder
15. januar 2009 - 17:52 #9
Hej Hrc, jeg har bla gjort det i forbindelse med en slags hjemmelavet ShowMessage dialog, hvor jeg kun bruger kode til at lave formen. Da jeg lavede det mødte jeg nogle resource problemer, hvis jeg benyttede mig af .create, men da jeg rettede det til .createNew, virkede det bare, og har gjort det siden :)
Avatar billede mbsnet Nybegynder
15. januar 2009 - 17:53 #10
PS. her var det tale om en tCustomForm.....
Avatar billede hrc Mester
17. januar 2009 - 17:21 #11
mbsnet: OK. Det vil jeg prøve at huske når jeg laver min egen ShowMessage, dvs. måske bliver det noget andet, da den er blevet lidt bedre i 2009'eren.
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