|
|
||||||||
|
|||||||||
![]() |
|
|
#1 |
|
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.
|
|
|
|
|
|
#2 |
|
Beheerder
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 |
|
|
|
|
|
#3 |
|
Moderateur
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 |
|
|
|
|
|
#4 |
|
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!" |
|
|
|
|
|
#5 |
|
Moderateur
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 |
|
|
|
|
|
#6 |
|
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.
|
|
|
|
|
|
#7 |
|
Moderateur
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:
__________________
Inside every large, complex program is a small, elegant program that does the same thing, correctly |
|
|
|
|
|
#8 |
|
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? |
|
|
|
|
|
#9 |
|
Moderateur
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 |
|
|
|
|
|
#10 |
|
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;
|
|
|
|
|
|
#11 |
|
Moderateur
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 |
|
|
|
|
|
#12 |
|
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. |
|
|
|
|
|
#13 |
|
Moderateur
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 |
|
|
|
|
|
#14 |
|
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. |
|
|
|
|
|
#15 |
|
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!" |
|
|
|
![]() |
| Bookmarks |
| Momenteel bekijken: 1 (0 leden en 1 gasten en/of zoekmachine bots) actieve gebruikers dit onderwerp | |
| Onderwerpopties | Zoek in onderwerp |
| Weergavemodus | Stem op dit onderwerp: |
|
|