[Delphi] ShowModal geeft AccessViolation

Pagina: 1
Acties:

  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Topicstarter
Eerst de code :
code:
1
2
3
4
5
6
7
8
9
10
    try
      i:=StrToInt(EditVoorraad1.Text);
      Table1.InsertRecord([//knip//.Text]);
      FormSelecteerLeveranciers.ShowModal;
    except
      on EDataBaseError do
        MessageDlg('Niet alle velden zijn correct ingevoerd',mtError,[mbOK],0);
      on EConvertError do
        MessageDlg('Niet alle velden zijn correct ingevoerd',mtError,[mbOK],0);
    end;

Op het moment dat FormSelecteerLeveranciers.ShowModal voor het eerst wordt gedaan, gebeurt het ook gewoon, zonder errors. Ik .Close het venster, en de volgende keer dat ik em weer wil .ShowModal-en, krijg ik een EAccessViolation :'(

Het heeft denk ik weinig zin om nog meer code te posten, want die is er eigenlijk ook niet, de rest van het programma houdt zich met andere dingen bezig.

Ik gebruik wel de tables door het hele programma, maar die worden na .Edit overal ge-.Post enzo, en allen staan .Open ...

Wat doe ik fout ??


edit: Lay-out was fucked up

Mother, will they like this song?


  • The_Sentinel
  • Registratie: December 2000
  • Niet online
Heeft FormSelecteerLeveranciers niet een 'Show' function?
dus FormSelecteerLeveranciers.Show; ipv FormSelecteerLeveranciers.ShowModal;

WTF! Hebben we nu alweer koffiepauze!?


Verwijderd

Op donderdag 30 mei 2002 21:23 schreef The_Sentinel het volgende:
Heeft FormSelecteerLeveranciers niet een 'Show' function?
dus FormSelecteerLeveranciers.Show; ipv FormSelecteerLeveranciers.ShowModal;
Dat kan ik me niet voorstellen.

Meestal komen AV's voor als je iets met het object gaat doen als deze nog niet of niet meer aangemaakt is. Weet je zeker dat het form niet ergens een destroy of free krijgt?

Je schrijft immers dat het form eerst wel actief kan worden. Dus dan moet ie wel een keer created zijn.

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 16:09

Tomatoman

Fulltime prutser

Het form wordt met Close automatisch vernietigd. Zet in de OnClose event van het form:

Action := caHide;

Een goede grap mag vrienden kosten.


Verwijderd

Op donderdag 30 mei 2002 21:30 schreef tomatoman het volgende:
Het form wordt met Close automatisch vernietigd. Zet in de OnClose event van het form:

Action := caHide;
Of een Form.Hide i.p.v. Form.Close

  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Topicstarter
hee beter! .Show en .Hide samen gebruiken, en nu werkt het! tnx !

Mother, will they like this song?


  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Topicstarter
En wat nog beter werkt : ShowModal gebruiken, en voor het afsluiten ModalResult veranderen in een not-0-waarde

Mother, will they like this song?


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:09
De beste manier is, imho, om []geen enkel[/b] form (behalve het mainform dan) autocreated te zetten in de Project Options.

Iedere keer dat je een form wilt tonen, dan maak je zelf een instance van die form en toon je ze:
code:
1
2
3
4
5
6
var
  frmMyForm : TForm1;
begin
  frmMyForm := TForm1.Create(Self);
  frmMyForm.ShowModal();
end;

Dit is toch een nettere manier dan de Show/Hide manier. (maar da's mijn mening).

https://fgheysels.github.io/


  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Op deze manier heb je dat venster dus altijd in je geheugen staan, ook als je `m niet gebruikt.
Ik doe het (om die reden) zo:
code:
1
2
3
4
With TForm2.Create(nil) do
  Try ShowModal;
  Finally Free;
End;

If then else matters! - I5 12600KF, Asus Tuf GT501, Gigabyte Gaming OC 16G 5080 RTX, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:09
Op vrijdag 31 mei 2002 09:09 schreef XLerator het volgende:
Op deze manier heb je dat venster dus altijd in je geheugen staan, ook als je `m niet gebruikt.
Ik doe het (om die reden) zo:
code:
1
2
3
4
With TForm2.Create(nil) do
  Try ShowModal;
  Finally Free;
End;
Welke manier bedoel je? De Show/Hide manier?

Wordt het scherm niet automatisch ge-free-ed als het gesloten wordt?

https://fgheysels.github.io/


  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Ik bedoel inderdaad de show/hide manier.
Nee dan wordt ie niet gefreed.
Tenzij je in de onClose event de action op caFree zet.
Maar als je `m alleen hide, dan is hij gewoon aanwezig, alleen onzichtbaar.
Als je `m free`d dan issie echt pleite, en moet ie `m opnieuw aanmaken als je de create(nil) aanroept.
En het is praktisch nix langzamer ofzo.

If then else matters! - I5 12600KF, Asus Tuf GT501, Gigabyte Gaming OC 16G 5080 RTX, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


  • Coltrui
  • Registratie: Maart 2001
  • Niet online

Coltrui

iddqd

Persoonlijk vind ik de oplossing van Whoami de netste en memory-vriendelijkste.
De Show/Hide methode is het eerste wat ze me op 't werk afgeleerd hebben. :)

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 16:09

Tomatoman

Fulltime prutser

Memory-vriendelijk betekent ook laadtijd-onvriendelijk (en omgekeerd). Voor bijvoorbeeld een zelfgemaakt find/replace dialoogvenster die het verstandiger om het form in het geheugen te houden. Datzelfde geldt voor een form waar een ingewikkelde query op staat. Maar dit zijn wel uitzonderingen, over het algemeen ben ik het er mee eens dat je een form het beste kunt laden wanneer je het nodig hebt en daarna gelijk weer vernietigen.

Een goede grap mag vrienden kosten.


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:09
Hou eens een 20-tal forms van uw app in het geheugen en draai daarnaast nog eens enkele andere programma's... Niet echt memory-vriendelijk als je 't mij vraagt.

https://fgheysels.github.io/


Verwijderd

Dit is naar mijn mening nog netter.
Tenminste zo heb ik het altijd geleerd.
code:
1
2
3
4
5
6
7
8
9
10
var
  frmMyForm : TForm1;
begin
  try
    frmMyForm := TForm1.Create(Self);
    frmMyForm.ShowModal();
  finally
    frm.Free;
  end;
end;
Pagina: 1