Page 1 of 3 1 2 3 LastLast
Results 1 to 15 of 32

Thread: Centreer een dialog op mainform

  1. #1

    Centreer een dialog op mainform

    Ik heb een applicatie waarbij ik runtime dialogs maak en gebruik. Nu wil ik deze centreren op het mainform. Weet iemand hoe dit moet want een dialog heeft geen standaard top en left properties.

  2. #2
    Een form dat je modal toont is ook een dialog, inclusief alle properties. Wat bedoel je met een dialog?
    Marcel

  3. #3
    Waarschijnlijk een TOpenDialog o.i.d.?
    Inside every large, complex program is a small, elegant program that does the same thing, correctly

  4. #4
    Senior Member
    Join Date
    Apr 2003
    Location
    Netherlands
    Posts
    358
    Waarom gebruik je niet gewoon MessageDlgPos()? Kun je zelf verzinnen waar deze moet verschijnen via de toegevoegde X en Y parameter.
    Iedereen heeft recht op mijn mening!
    "You're not thinking, you're merely being logical!"

  5. #5
    Ja, maar dan heb je wel een Message Dialog, en da's misschien niet het dialog dat je wilt.
    Inside every large, complex program is a small, elegant program that does the same thing, correctly

  6. #6
    Sorry voor de onduidelijke beschrijving. Het gaat inderdaad om de standaard "Windows" dialogs zoals TOpenDialog, TSaveDialog en TFindDialog. Ik had verwacht dat dit eigenlijk niet zo moeilijk zou zijn aangezien het met forms inderdaad heel gemakkelijk kan.

  7. #7
    Nou ja, een dialog is géén form. Een Form is een class van Delphi die om een windows venster heen geschreven is. Een dialog is ook een Delphi class, maar wel een andere en die biedt die properties niet.

    Het biedt wel een OnShow event, dus ik hoopte dat onderstaande code zou werken als ik die daaraan zou koppelen, maar dat blijkt niet het geval. De code wordt netjes uitgevoerd, maar de opdracht lijkt genegeerd te worden.
    Delphi Code:
    1. procedure TForm1.OpenDialog1Show(Sender: TObject);
    2. var
    3.   h: THandle;
    4.   r: TRect;
    5.   p1, p2: TPoint;
    6. begin
    7.   h := (Sender as TCommonDialog).Handle;
    8.  
    9.   GetWindowRect(h, r);
    10.   p1 := CenterPoint(r);
    11.   p2 := CenterPoint(Self.BoundsRect);
    12.   if not SetWindowPos( h, 0,
    13.                        r.Left + p2.X - p1.X,
    14.                        r.Top + p2.Y - p1.Y,
    15.                        0, 0,
    16.                        SWP_NOSIZE or SWP_NOZORDER) then
    17.     RaiseLastOSError;
    18. end;
    Inside every large, complex program is a small, elegant program that does the same thing, correctly

  8. #8
    Ik heb jouw voorbeeld geprobeerd en inderdaad werkt het niet helemaal. Het lijkt erop dat de dialog de eerste keer wel geplaatst wordt op de opgegeven coordinaten (Pos1). Als je het dialog verschuift naar pos2, dan komt hij bij de tweede keer openen weer op pos2.

    Hetzelfde geldt bij SetWindowPlacement en MoveWindow. Nog geen idee wat er gebeurd als je een onshow gebruikt met meerdere verschillende dialogs...

    Iemand enig idee?

  9. #9
    Misschien is het moment te vroeg. Probeer eens om in de OnShow van het dialog een message te sturen naar het form met PostMessage. In de handler daarvan kun je mijn code weer uitvoeren.
    Inside every large, complex program is a small, elegant program that does the same thing, correctly

  10. #10
    Goede tip! Het werkt nu voor een dialog wat ik niet dynamisch aanmaak. Dus ik heb een FindDialog op mijn form staan en daarvan laat ik de onshow wijzen naar DialogShow.

    Echter als ik runtime een savedialog aanmaak en daarvan de onshow toewijs aan de DialogShow dan werkt het niet. Rara hoe kan dit?


    De code heb ik hieronder staan:

    Code:
    procedure TTracer1.DialogShow(Sender: TObject);
    begin
        PostMessage(self.Handle,WM_DIALOGCENTER_MESSAGE,Integer(Sender),0);
    end;
    
    procedure TTracer1.OnDialogCenterMessage(var Msg: TMessage);
    var
        h: THandle;
        r: TRect;
        p1, p2: TPoint;
        obj: TCommonDialog;
      
    begin
        obj := TCommonDialog(msg.WParam);
        h := obj.Handle;
    
        GetWindowRect(h, r);
        p1 := CenterPoint(r);
        p2 := CenterPoint(Self.BoundsRect);
    
        if not SetWindowPos( h, 0,
                           r.Left + p2.X - p1.X,
                           r.Top + p2.Y - p1.Y,
                           0, 0,
                           SWP_NOSIZE or SWP_NOZORDER)
        then
            RaiseLastOSError;
    end;

  11. #11
    Werkt niet als in doet niets? Wordt de code wel uitgevoerd? Het zou voor de werking volgens mij niets uit moeten maken, tenzij je het event niet, of te laat, toekent aan je dialog.
    Inside every large, complex program is a small, elegant program that does the same thing, correctly

  12. #12
    Ik bedoel dat hij wel in de message komt maar dat de dialog niet gecentreerd wordt. Het lijkt erop dat de sender niet goed meegegeven wordt. Als ik de dialog aanmaak doe ik :
    saveDialog := TSaveDialog.Create(self);
    saveDialog.OnShow := DialogShow;

    Ik heb geprobeerd om de sender aan DialogShow mee te geven maar dat lukte me niet.

  13. #13
    Die regels lijken in orde. De aanroep uit je eerdere post ook.
    Je zou aan obj.Name (is denk ik leeg) of obj.Classname wel moeten kunnen zien of je het juiste dialog te pakken hebt. Het zou ook kunnen dat het dialog niet goed reageert op het instellen. Maar waarom het dan designtime wel werkt en runtime niet... tenzij er verschil zit in hoe de dialogs dit afhandelen. Je zegt dat je designtime een FindDialog hebt en runtime een SaveDialog maakt. Probeer ook eens een designtime SaveDialog en/of een runtime FindDialog om te zien of het misschien aan het type dialog ligt.
    Inside every large, complex program is a small, elegant program that does the same thing, correctly

  14. #14
    Ik heb je voorstel gevolgd en een aantal testen gedaan. Test is open het dialog, verplaats het dialog, sluit het weer en heropen. Dialog zou elke keer in het midden moeten openen.

    FindDialog gaat goed zowel runtime als designtime.
    Save dialog gaat niet goed.
    Open dialog gaat ook niet goed.

  15. #15
    Senior Member
    Join Date
    Apr 2003
    Location
    Netherlands
    Posts
    358
    Komt omdat de OpenDialogs ed geen TWinControls zijn denk ik, ze stammen allemaal af van TPersistent. SetWindowPos ed heeft ook nul effect hoewel IsWindow het wel herkent als een window :S Raar gedoe...
    Iedereen heeft recht op mijn mening!
    "You're not thinking, you're merely being logical!"

Page 1 of 3 1 2 3 LastLast

Thread Information

Users Browsing this Thread

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

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
  •