Hvis jeg gættede rigtigt så skal du lave en "over"-form og sætte dens FormStyle til MDI-form. De efterfølgende forme (i første niveau efter overformen) sættes til MDI-child. Violá har du en MDI-applikation.
Lige et spørgsmål til? Når jeg opretter en form som er fsMDIform og så opretter en anden form som fsMDIChild, så kommer fcMIDchild'formen automatisk frem i form1 uden at jeg har skrivet noget kode? Det er jo ikke meningen?
Det er nok fordi din Delphi opretter formene automatisk. Du kan klikke dem fra og til i ... min Delphi er gået ned ... projects/properties (noget med skift-alt-F11) tror jeg nok. Den eneste form du bør vise automatisk er din main-form.
Resten er noget med at søge i listen over åbne MDIChilds (der findes en liste i TForm) og hvis du klikker på "knappen" og formen du vil åbne allerede er oprettet, så sætter du bare fokus, alternativt opretter og viser du det.
Husk i øvrigt at sætte MDI-child'ets OnClose event:
Åhh, nu rødmer jeg ;-). Jeg sender lige lidt mere. Min ShowMDIChild funktion nedenfor leder efter formen i MDIChild listen og hvis den findes, så returnerer den. Hvis ikke så opretter jeg den. Mit MDIChild har en label1 på formen og den sætter jeg bagefter (det er derfor jeg returnerer den fundne/oprettede form - det kan jo være at jeg skal lave lidt mere end bare oprette den.
Mine forme viser sig også straks jeg opretter dem - det er åbenbart ikke helt som jeg huskede det.
Min funktion er i øvrigt en variant af Delphi's egen CreateForm og som du kan se, så fodrer jeg den med klassenavnet, ikke et oprettet objekt. Vidste du i øvrigt at du kan springe til koden ved (i en proj der er compileret) at klikke på eksempelvis CreateForm samtidig med at ctrl-tasten er trykket ned. I øverste højre hjørne har du to pile som du så kan bladre frem og tilbage med.
function TfrmMain.ShowMDIChild(InstanceClass: TComponentClass): TForm; var i : integer; bFound : boolean; // b for boolean (ikke konsekvent) ... Instance: TForm; begin i := -1; bFound := false; while (i < MDIChildCount - 1) and not bFound do begin inc(i); bFound := MDIChildren[i] is InstanceClass; end; // while
if bFound then result := MDIChildren[i] else result := TForm(InstanceClass.NewInstance).Create(self); end;
procedure TfrmMain.dsf1Click(Sender: TObject); begin with TfrmSub(ShowMDIChild(TFrmSub)) do // Sending class not object Label1.Caption := 'Here we go!'; end;
Synes godt om
Ny brugerNybegynder
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.