Results 1 to 12 of 12

Thread: Mdi ?

  1. #1
    5th member of nldelphi
    Join Date
    Mar 2001
    Location
    Alkmaar
    Posts
    2,127

    Question Mdi ?

    Hoi aan iedereen, ik heb een vraag over het fenomeen MDI, ik weet daar nog helemaal niets vanaf dus ik hoop dat jullie mij wat wijzer kunnen maken.

    Ik heb een Applicatie met meerde Forms, nu heb ik 1 Form en dat is het hoofd Formulier deze zal altijd gemaximaliseerd zijn dus beslaat deze het hele scherm.
    Momenteel als ik een ander Formulier opent dan zal deze boven op mijn huidige hoofd Form komen te staan, nu wil ik graag dat het tweede Form gedockt ? wordt op het hoofd Form, nu heb ik de kreet MDI ooit wel eens horen vallen dus vandaar dat ik aan het testen en proberen ben geslagen.
    Maar al meteen ondervindt ik het volgende probleem, ik het mijn Formstyle van het Hoofd Form op fsMDIForm staan en op het tweede Form is dat fsMDIChild.
    Als mijn Application wordt geladen dan zie ik dat het 2e Form meteen al zichtbaar is in het hoofd Form, zonder ook maar iets te doen, en het is pas de bedoeling dat ik het 2e Form ziet als er op een button geklikt wordt.
    Nu kan ik de 'Autocreate' van Form2 wel uitzetten, en dan via de Button het form laten createn maar hoe dan als ik het form daarna wil afsluiten en verderop in mijn programma toch weer wil zien.?
    En als dan de Autocreate functie toch wordt uitgeschakeld wordt mijn Applicatie dan niet trager tijdens het laden of creeren van de Forms die ik nodig heb.?

    P.S. Mischien dat het ook opgelost kan worden d.m.v. een Dockfunctie als die bestaat, en zoja hoe ?

    Wie kan mij meer vertellen ?
    RLD

  2. #2
    Hoi Richard,

    Los van het soort user-interface dat je gebruikt zou ik altijd zo weinig mogelijk formulieren automatisch aanmaken bij het opstarten. Zeker bij wat grotere programma's krijg je dan alleen maar last van traag startende programma's. Als de gebruiker later het formulier open moet ie ook wel wachten, maar 4x een halve seconde wachten lijkt nu eenmaal een stuk korter dan 1x twee seconden.

    Om je MDI child bij het sluiten vrij te geven zet je de volgende regel in je OnClose event:
    Code:
      Action := caFree;
    Je formulier wordt nu vrijgegeven. Wil de gebruiker hem nog eens zien maak je hem gewoon opnieuw aan.
    Marcel

  3. #3
    5th member of nldelphi
    Join Date
    Mar 2001
    Location
    Alkmaar
    Posts
    2,127

    Thumbs up Perfect,

    Bedankt Marcel,

    Ik heb als probeerseltje de volgende code toegepast:

    Code:
    procedure TForm1.Exit1Click(Sender: TObject);
    begin
     Application.Terminate;
    end;
    
    procedure TForm1.CreateForm21Click(Sender: TObject);
    begin
      if not Form2.Active then
        begin
          Application.CreateForm(TForm2, Form2);
          Form2.WindowState := wsMaximized;
        end
      else
      Showmessage('Formulier al gecreerd.');
    end;
    
    procedure TForm1.FreeForm21Click(Sender: TObject);
    begin
     if Form2.Active then Form2.Close
     else ShowMessage('Formulier 2 niet Actief.');
    end;
    Ik heb de Action:= caFree in het OnClose event van Form2 geplaatst ik neem aan dat dat klopt he ?

    Maar nu zoals je zelf waarschijnlijk al aan de bovenstaande code ziet zal ik voordat Form2 gecreerd wordt een Foutmelding krijgen,

    Ik wou dit invoegen om te controleren of het Formulier al actief is zodat deze niet voor de 2e keer gecreerd wordt (want daar hebben we natuurlijk niets aan.) en dat geldt hetzelfde voor het aflsuiten waarom iets proberen af te sluiten terwijl het mischien toch niet actief is.
    Dus met andere worden hoe kan ik controleren of het Form al actief is. Dus ook vooooor de eerste keer.

    Mvg, Richard.

    (ik kom straks nog ff kijken.)
    RLD

  4. #4
    Je MainForm heeft een property
    Code:
    property MDIChildren[I: Integer]: TForm;
    deze kun je gebruiken om al je children af te lopen om te kijken of ie al bestaat. Dus zoiets:
    Code:
    var
      i: Integer;
    begin
      for i := 0 to MDIChildCount-1 do
        if MDIChildren[i] is TForm2 then
        begin
          MDIChildren[i].Show;
          Break;
        end;
    end;
    Marcel

  5. #5
    Old Navigator Matthijs's Avatar
    Join Date
    Mar 2001
    Location
    Ede, NL. Delphi: Delphi 7/2005 :). Matthijs schrijf je Matthijs
    Posts
    2,199

    Lightbulb Controleren of een MDI-child bestaat!

    Ik gebruik deze functie om te controleren of een bepaald childform al bestaat:
    Code:
    function TFormHoofdscherm.FormBestaat(FormType : TFormClass; Titel: String) : Boolean;
    var
      i : Integer;
    begin
      Result := False;
      for i := 0 to MDIChildCount - 1 do begin
        if MDIChildren[i] is FormType then begin
          if Titel <> '' then begin
            if MDIChildren[i].Caption = Titel then begin
              Result := True;
              MDIChildren[i].WindowState := wsNormal;
            end else begin
              Result := False;
            end;
          end else begin
            Result := True;
            MDIChildren[i].WindowState := wsNormal;
          end; // if Titel <> ''
        end; // if MDIChildren[i] is FormType
        if Result then Break;
      end; // for i := 0 to MDIChildrenCount - 1
    end;
    Deze functie wordt dan op de volgende manier aangeroepen:
    Code:
    procedure TFormHoofdscherm.KlantenActieExecute(Sender: TObject);
    begin
    // Klantgegevens kunnen invoeren en wijzigen.
      if not FormBestaat(TFormOverzichtRelatie, 'Klantenlijst') then begin
        KlantenForm := TFormOverzichtRelatie.Create(Self);
      end;
      KlantenForm.Show;
    end;
    Ik gebruik soms eenzelfde scherm om verschillende tabellen te benaderen. In dit geval wordt er dus een versie van TFormOverzichtRelatie gebruikt om klant-gegevens te laten zien en in een ander geval om leveranciers te tonen.

    Ik hoop dat dit wat duidelijk maakt.
    What's in a sig?

    Would my posting be less valuable if it didnot have a sig? (Vrij naar William S.)

    Let op de kleine lettertjes. For all postings: e&oe!
    This program performed an illegal function, the police are on their way

  6. #6
    Ziet er goed uit! Hij zou zelfs nog een stapje korter kunnen:
    Code:
    if not Result then
    begin
      with FormType.Create(self) do 
      begin
        Caption := Titel;
        Show;
      end;
    end;
    Marcel
    [IT]En dankzij de codeformatter van PeterW staat de begin ook op de goede plaats ...[/IT]

  7. #7
    Old Navigator Matthijs's Avatar
    Join Date
    Mar 2001
    Location
    Ede, NL. Delphi: Delphi 7/2005 :). Matthijs schrijf je Matthijs
    Posts
    2,199

    Talking Begin op het begin?

    Ik ben toch van de andere school! een begin hoeft niet altijd aan het begin van een regel te staan! Bovendien vind ik eigenlijk, dat ik mijn code keurig formatteer en voldoende commentaar invoeg! (Dit laatste soms in een grote inhaal beweging, maar dat is weer wat heel anders!)
    Last edited by Matthijs; 08-May-01 at 08:34.
    What's in a sig?

    Would my posting be less valuable if it didnot have a sig? (Vrij naar William S.)

    Let op de kleine lettertjes. For all postings: e&oe!
    This program performed an illegal function, the police are on their way

  8. #8
    Ik bedoelde er niets mee, als je je code bewust formateerd vind ik het al heel wat.
    Marcel

  9. #9
    Old Navigator Matthijs's Avatar
    Join Date
    Mar 2001
    Location
    Ede, NL. Delphi: Delphi 7/2005 :). Matthijs schrijf je Matthijs
    Posts
    2,199
    [it]Originally posted by Marcel [/it]
    Ik bedoelde er niets mee, als je je code bewust formateerd vind ik het al heel wat.
    Was ik ook helemaal niet bang voor hoor!
    'k Wou alleen even aangeven dat er meerdere mogelijkheden zijn voor de formatering van je sources. De manier de ik me heb aangeleerd (en misschien wel helemaal fout is ) gebruik ik al sinds mijn Beeb-tijd. (Beep staat in dit geval voor BBC, Acorn BBC dus)
    What's in a sig?

    Would my posting be less valuable if it didnot have a sig? (Vrij naar William S.)

    Let op de kleine lettertjes. For all postings: e&oe!
    This program performed an illegal function, the police are on their way

  10. #10
    5th member of nldelphi
    Join Date
    Mar 2001
    Location
    Alkmaar
    Posts
    2,127

    Thumbs up Bedankt

    Bedankt jongens, ik ziet het al het is weer laat geworden voor jullie gister avond, ik gaat het even uit proberen en dan horen juliie nog..
    RLD

  11. #11
    5th member of nldelphi
    Join Date
    Mar 2001
    Location
    Alkmaar
    Posts
    2,127

    Wink Mdi perikeltje

    Zo daar zijn we weer jongens,

    Het volgende (puntje cq probleempje);
    Ik heb een 'Main' form dat altijd gemaximaliseerd via de onderstaande code open staat.
    Code:
    procedure TForm1.FormCreate(Sender: TObject);
    Var
    WorkArea_Vorig: Trect;
    WorkArea_Huidig: Trect;
    begin
      SystemParametersInfo(SPI_GETWORKAREA, 0, @WorkArea_Huidig, 0);
      SetBounds(WorkArea_Huidig.Left, WorkArea_Huidig.Top, WorkArea_Huidig.Right -
        WorkArea_Huidig.Left, WorkArea_Huidig.Bottom - WorkArea_Huidig.Top);
    end;
    Dit form is uiteraard van het type fsMdiForm, mijn huidige scherm resolutie is 1024x768 of 1280x1024, als ik dan een ander form ontwerp van het type fsMdiChild, stel dat het formaat van dit form HxB := 300x500 is, met in de Linker & Rechter boven en onderhoek een button of iets dergelijk herkenbaars ivm de hoeken.
    Als ik dit form open in mijn huidige main form, en dan laat ik dit form (child) maximalizeren, dan zie ik dat dit form als het ware linksbovenin het main form wordt 'uitgelijnd' terwijl ik dit form juist gecentreert in het midden van het main form moet worden en tevens moet deze ook nog gemaximaliseert worden dit ivm de soort 'dock' uiterlijk (geen randen, blauwebalk, etc, etc,)
    Is dit te realiseren, want als ik al tijdens design time al rekening moet gaan houden met het zorgen dat de objecten wel gecentreerd worden weergegeven in het main form dan ben ik voorlopig nog niet klaar.

    Code:
    Ps. dt is geen code hoor.... alleen maar property settings.
    MainForm:
    Bordericons = biNone
    BorderStyle = bsSingle
    Anchors = akTop, akLeft
    FormStyle = fsMdiForm
    Postition = poDefault
    Align = aNone
    WindowsState = wsNormal
    
    Form2:
    Bordericons = biNone
    BorderStyle = bsSingle
    Anchors = akTop, akLeft
    FormStyle = fsMdiChild
    Postition = poDefault
    Align = aNone
    WindowsState = wsNormal
    Iemand Suggesties.
    BvD.
    R.R.
    RLD

  12. #12
    Hoi Richard,

    Ik heb een 'Main' form dat altijd gemaximaliseerd via de onderstaande code open staat.
    Waarom op deze manier? Heeft WindowState wsMaximized niet hetzelfde effect? Ik heb het idee dat je beide formulieren op wsMaximized moet zetten om het effect te krijgen dat je zoekt: een applicatie over je hele scherm met een scherm daarin waarvan je niet ziet dat het een apart scherm is.

    Ik denk dat ik het iets te simpel zie, maar ik zie niet in wat er bij jou mis gaat.
    Marcel

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. MDI Applicatie
    By Mentallunatic in forum Algemeen
    Replies: 23
    Last Post: 02-Dec-04, 22:40
  2. MDI Scherm Sluiten
    By Shibby in forum Algemeen
    Replies: 8
    Last Post: 05-Aug-04, 16:44
  3. twee icoontjes bij een mdi scherm
    By ruudje in forum Algemeen
    Replies: 6
    Last Post: 15-Jan-04, 08:30
  4. popupmenu in MDI child
    By Jeroen in forum Algemeen
    Replies: 2
    Last Post: 30-Sep-02, 11:51
  5. keypress in MDI forms
    By Jeroen in forum Algemeen
    Replies: 10
    Last Post: 16-Sep-02, 12:52

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •