Avatar billede friiiiis Novice
07. marts 2011 - 16:51 Der er 3 kommentarer og
2 løsninger

form.Show...

Et ULTRA simpelt spørgsmål...:

Jeg opretter en Form2 i Form1:

//======= Form1 ===========================//
if not assigned(Form2) then
  begin
    Form2 := TForm2.Create(Application);
    Form2.Show;
  end;

//==============//

Men... hvordan hvordan lukker jeg så form2 igen inde i form2?

Form2.free; // giver fejlen Access Violation

Form2.release; // giver fejlen Access Violation

Form2.close // giver fejlen Access Violation

??? Hvad gør jeg så?

Jeg har sat form2.borderstyle til bsDialog - jeg ved ikke om det betyder noget...
Avatar billede a_nor Nybegynder
07. marts 2011 - 17:11 #1
1) på en knap i Form2 sættes modal result <> mrNone

2) hvis du laver den om til alm. form skal du udføre Close (eller self.close)  SKRIV IKKE FORM2.CLOSE

hvis du vil have form2 HELT væk, skal du tilføje en
action:= caFree i FormClose koden
Avatar billede hrc Mester
07. marts 2011 - 17:48 #2
Jeg vil råde dig at slette den globale Form2 variabel og prøve at kode dig udenom den. Den burde aldrig være der idet den opfordrer til dårlig kodepraksis.
Jeg har ret tit måtte fejlsøge (andres kode) og fundet at de har refereret variablen selvom den ikke længere var i brug (sådan som a_nor også skriver):

var
  Form2: TForm2;

implementation
...
procedure TForm2.MyEvent(Sender: TObject)
begin
  Form2.Caption := 'HelloWorld';
end;

Hvis Form2 er frigivet eller nil, så kommer der en fejl.

Det letteste her er simpelthen denne one-liner:
TForm2.Create(self).Show;
Sammen med caFree sørger Delphi for at frigive formen når den lukkes.

Jeg er ikke helt enig med a_nor i brugen af modalresult som navnet indikerer, kun bruges når formen er modal. Skal du lukke en form der ikke er modal (åbnet med show) så er det helt sikkert at self.Close;. Når en modalform skal lukkes, benytter man ikke Close, men sætter ModalResult til et eller andet (det er vist ikke alle ModalResults der lukker en form, men mrOK, mrCancel dur i alt fald).
Avatar billede friiiiis Novice
07. marts 2011 - 22:10 #3
a_nor: Jeg erikke lige med på 1) "knap på en form modalresult result <> mrNone" ??

det andet har jeg fattet... også den med CaFree i formclose...

og fine kommentarer fra HRC...

OK jeg deler pointene?
Avatar billede hrc Mester
07. marts 2011 - 22:57 #4
OK med mig Der skulle lige et "bruge" foran self'et ovenover (self er pointeren til objektet man befinder sig i, her en instans af TForm2, så self.close kalder dens lukke-metode.

Det er ikke så tit man behøver bruge den, kun når der er risiko for sammenfald med andre objekters metoder:

procedure TForm2.Button1OnClick(Sender: TObject);
var
  Query: TADOQuery;
begin
  // CreateQuery er en hj.lavet proc. der opretter en TADOQuery.
  with DM.CreateQuery do
  try
    SQL.Add(...);
    Open;
    while not Eof do
    begin
      Next;
    end;
    Close; // Query eller form? Compileren kan blive forvirret
  finally
    Free; // Query eller form? Programmøren kan blive forvirret
  end;
end;

Med self samt ved at begrænse brugen af with indtil den engang bliver udbygget, kan man lave koden lettere at læse. Det ber ikke ligne et C++ program hvis man kan undgå det ...
Avatar billede a_nor Nybegynder
07. marts 2011 - 23:15 #5
Friiiiis:

Hvis du har sat en knap på formen, har denne en property ModalResult du kan sætte. Trykkes knappen med værdi <> mrNone lukker formen med denne 'returværdi'.

Som HRC også antyder kan instancer af tForm2 creates flere gange, 2. og følgende create vil give anledning til at disses NAME renummereres: Form2_2, Form2_3 o.s.v. 

HRC: Kommentaren 1) er rettet mod at der er tale om en dialogbox.
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