Gå til innhold

Beste måten å kalle modale former


Anbefalte innlegg

Jeg forklarer litt nærmere...

 

Jeg har en modal form A, som skal kalle en modal form B. Poenget er at form A skal frigjøres før form B åpnes.

 

Kan jeg gjøre dette i form A uniten?

 

Jeg prøvde å kalle formB på formADestroy, men den stopper jo opp og avventer når man kaller en ny modal form.

 

Og hvis jeg da skal lage en ny instans av form A fra form B igjen på samme måte, så vil jeg få to instanser av form A...

 

kan jeg gjøre dette uten å måte ha en overordnet unit som først frigjør A og lager B? kan jeg gjøre dette i form A uniten?

Lenke til kommentar
Videoannonse
Annonse

et lite spørsmål til....

 

da må vel den overordnede uniten ha med alle vinduene jeg skal kalle i sin 'uses' blokk? og spiser ikke dette enormt med minne? jeg har en fem-seks vinduer som skal kalles og alle har inkludert mange units, og inneholder ganske mye komponenter

Lenke til kommentar

Eneste som skjer når du legger en unit i Uses, er at den overordnede uniten får vite om disse og kan aksessere klasser og objekter der. Og hvis uniten ikke er inkludert i prosjektet, garanterer dette at unit blir kompilert.

 

Dette spiser ikke opp minne, nei. Minnet reserveres kun når du oppretter form.

 

Eksempel: alle dine modale former skal ha 3 knapper med ModalResult mrNo (tilbake), mrYes (fram) og mrCancel (ut)

 

procedure TOverForm1.Button1Click(Sender:TObject);
const
 MAX_FORMS=2;
var
 MR:TModalResult;
 FormNR:Integer;
 function ShowForm1:TModalResult;
   F:TForm1;
 begin
     Result:=mrNone;
     F:=TForm1.Create(Self);
     try
       {vi kan selvfølgelig kjøre noe spesialbehandling av forms objekter her}
       Result:=F.ShowModal;
       {... og her, når vi vet resultatet}
     finally
       F.Free;
     end;
 end;
 function ShowForm2:TModalResult;
   F:TForm2;
 begin
     Result:=mrNone;
     F:=TForm2.Create(Self);
     try
       Result:=F.ShowModal;
     finally
       F.Free;
     end;
 end;
 {...osv}
begin
 MR:=mrNone;
 FormNR:=1;
 while MR<>mrCancel do
 begin
   case FormNR of
   1: MR:=ShowForm1;
   2: MR:=ShowForm2;
   {dette kan utvides}
   end;
   case MR of
   mrNO:dec(FormNR);
   mrYes:inc(FormNR);
   end;
   if FormNR<1 then
     FormNR:=1;
   if FromNr>MAX_FORMS then
     FormNR:=MAX_FORMS;
 end;
end;

 

Jeg har ikke kjørt dette, så det kan være feil i koden, men jeg tror dette illustrerer hvordan du kan bla frem og tilbake mellom modale former. Til enhver tid eksisterer kun 1 modal form, så andre spiser ikke noe minne.

Lenke til kommentar

Du kan fint vise ein ny modal form, sjølv frå den modale formen som allereie køyrer. Dersom du vil gjere dette, er det berre å setje ModalResult := mrOK; rett før du kallar på den andre formen;

 

Plasser dette i t.d. FormA.OnClose;

ModalResult := mrOK;
FormB.ShowModal;

 

Du må sjølvsagt setje ModalResult til den verdien som tilsvarer knappen som vart trykt på. Du bør kanskje heller ikkje plassere denne i OnClose, men på t.d. OK og Cancel-knappar som finns på FormA.

Lenke til kommentar
  • 2 uker senere...

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...