NLDelphi logo

Apada
Start Forum Nieuws Artikelen Links E mail Statistieken
NLDelphi partnersite: nlDotnet
NLDelphi

Ga Terug   NLDelphi > Vraagbaak > Algemeen

Antwoord
 
Onderwerpopties Zoek in onderwerp Stem op Onderwerp Weergavemodus
Oud 19-Jan-10, 22:24   #1
antonbeerens
Registered User
 
Geregistreerd op: Dec 2009
Berichten: 17
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.
antonbeerens is offline   Met citaat antwoorden
Oud 19-Jan-10, 22:36   #2
Marcel
Beheerder
 
Marcel's Avatar
 
Geregistreerd op: Mar 2001
Locatie: Earth
Berichten: 20.161
Een form dat je modal toont is ook een dialog, inclusief alle properties. Wat bedoel je met een dialog?
__________________
Marcel
Marcel is offline   Met citaat antwoorden
Oud 19-Jan-10, 23:07   #3
GolezTrol
Moderateur
 
GolezTrol's Avatar
 
Geregistreerd op: Oct 2002
Berichten: 15.267
Waarschijnlijk een TOpenDialog o.i.d.?
__________________
Inside every large, complex program is a small, elegant program that does the same thing, correctly
GolezTrol is offline   Met citaat antwoorden
Oud 19-Jan-10, 23:26   #4
BobbaFet
Senior Member
 
Geregistreerd op: Apr 2003
Locatie: Netherlands
Berichten: 353
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!"
BobbaFet is offline   Met citaat antwoorden
Oud 19-Jan-10, 23:34   #5
GolezTrol
Moderateur
 
GolezTrol's Avatar
 
Geregistreerd op: Oct 2002
Berichten: 15.267
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
GolezTrol is offline   Met citaat antwoorden
Oud 20-Jan-10, 07:58   #6
antonbeerens
Registered User
 
Geregistreerd op: Dec 2009
Berichten: 17
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.
antonbeerens is offline   Met citaat antwoorden
Oud 20-Jan-10, 08:28   #7
GolezTrol
Moderateur
 
GolezTrol's Avatar
 
Geregistreerd op: Oct 2002
Berichten: 15.267
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
GolezTrol is offline   Met citaat antwoorden
Oud 20-Jan-10, 10:00   #8
antonbeerens
Registered User
 
Geregistreerd op: Dec 2009
Berichten: 17
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?
antonbeerens is offline   Met citaat antwoorden
Oud 20-Jan-10, 10:29   #9
GolezTrol
Moderateur
 
GolezTrol's Avatar
 
Geregistreerd op: Oct 2002
Berichten: 15.267
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
GolezTrol is offline   Met citaat antwoorden
Oud 20-Jan-10, 15:35   #10
antonbeerens
Registered User
 
Geregistreerd op: Dec 2009
Berichten: 17
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;
antonbeerens is offline   Met citaat antwoorden
Oud 20-Jan-10, 16:04   #11
GolezTrol
Moderateur
 
GolezTrol's Avatar
 
Geregistreerd op: Oct 2002
Berichten: 15.267
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
GolezTrol is offline   Met citaat antwoorden
Oud 20-Jan-10, 16:08   #12
antonbeerens
Registered User
 
Geregistreerd op: Dec 2009
Berichten: 17
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.
antonbeerens is offline   Met citaat antwoorden
Oud 20-Jan-10, 16:30   #13
GolezTrol
Moderateur
 
GolezTrol's Avatar
 
Geregistreerd op: Oct 2002
Berichten: 15.267
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
GolezTrol is offline   Met citaat antwoorden
Oud 20-Jan-10, 16:45   #14
antonbeerens
Registered User
 
Geregistreerd op: Dec 2009
Berichten: 17
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.
antonbeerens is offline   Met citaat antwoorden
Oud 21-Jan-10, 06:11   #15
BobbaFet
Senior Member
 
Geregistreerd op: Apr 2003
Locatie: Netherlands
Berichten: 353
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!"
BobbaFet is offline   Met citaat antwoorden
Antwoord

Bookmarks


Momenteel bekijken: 1 (0 leden en 1 gasten en/of zoekmachine bots) actieve gebruikers dit onderwerp
 
Onderwerpopties Zoek in onderwerp
Zoek in onderwerp:

Geavanceerd zoeken
Weergavemodus Stem op dit onderwerp:
Stem op dit onderwerp::

Berichting Regels
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Aan
Smilies zijn Aan
[IMG] code is Aan
HTML code is Uit

Forumnavigatie


Alle tijden zijn GMT +2. De tijd is nu 04:48.


Forum software: vBulletin, versie 3.8.6
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Copyright ©2011, NLDelphi.com (Dutch Delphi programming)