La fonction API GetSaveFileName
, qui est ce que TSaveDialog
est une forme d'emballage, ne fournit aucun moyen de contrôler la position de la boîte de dialogue, de sorte que vous devez intercepter un message au début de la boîte de dialogue et d'ajuster la position là, comme d'autres solutions que vous avez vu ont fait. Vous voulez que la boîte de dialogue soit centrée sur votre formulaire, donc les solutions qui fournissent les propriétés Top
et Left
pour la boîte de dialogue ne fonctionneront pas très bien car elles ne tiennent pas compte de la taille de la fenêtre et elles vous demandent également pour calculer de nouvelles coordonnées avant d'appeler Execute
à chaque fois.
Voici une idée différente. Il faudra toujours passer outre WndProc
.
type
TCenterSaveDialog = class(TSaveDialog)
private
FCenterForm: TCustomForm;
protected
procedure WndProc(var Message: TMessage); override;
public
// When this property is assigned, the dialog will center
// itself over the given form each time the dialog appears.
property CenterForm: TCustomForm read FCenterForm write FCenterForm;
end;
procedure TCenterSaveDialog.WndProc(var Message: TMessage);
var
lpOfNotify: POFNotify;
FormRect, DialogRect: TRect;
NewLeft, NewTop: Integer;
begin
inherited;
if (Message.Msg = wm_Notify) and Assigned(CenterForm) then begin
lpOfNotify := POFNotify(Message.LParam);
if lpOfNotify.hdr.code = cdn_InitDone then begin
GetWindowRect(CenterForm.Handle, FormRect);
GetWindowRect(lpOfNotify.hdr.hwndFrom, DialogRect);
NewLeft := FormRect.Left
+ (FormRect.Right - FormRect.Left) div 2
- (DialogRect.Right - DialogRect.Left) div 2;
NewTop := FormRect.Top
+ (FormRect.Bottom - FormRect.Top) div 2
- (DialogRect.Bottom - DialogRect.Top) div 2;
SetWindowPos(lpOfNotify.hdr.hwndFrom, 0,
NewLeft, NewTop, 0, 0,
swp_NoActivate or swp_NoOwnerZOrder or swp_NoSize or swp_NoZOrder);
end;
end;
end;
Voir aussi: cdn_InitDone
était ma question sur cette page. Mais cette solution n'est pas complète. Parce que la position est définie une seule fois au début. Le deuxième ou le troisième réglage de la position a échoué. –
Ne pas le régler * une fois * assez ??? –
Je veux montrer le dialogue à chaque fois au centre du formulaire principal. Exemple de problème: l'utilisateur ferme la boîte de dialogue de sauvegarde, puis déplace le formulaire principal et ouvre à nouveau la boîte de dialogue de sauvegarde => à ce stade, je ne suis pas en mesure de déplacer la boîte de dialogue de sauvegarde au centre du formulaire principal. –