Die GetSaveFileName
API-Funktion, das ist, was TSaveDialog
ein Wrapper Form ist, bietet keine Möglichkeit, die Position des Dialogfelds zu steuern, so dass Sie eine frühe Mitteilung an den Dialog müssen abzufangen und stellen Sie die Position, wie andere Lösungen, die Sie gesehen haben, getan haben.
Sie möchten, dass das Dialogfeld über Ihrem Formular zentriert wird. Lösungen, die die Eigenschaften Top
und Left
für den Dialog bereitstellen, funktionieren nicht sehr gut, da sie die Fenstergröße nicht berücksichtigen und auch Sie benötigen um neue Koordinaten zu berechnen, bevor Sie jedes Mal Execute
anrufen.
Hier ist eine andere Idee. Es muss weiterhin überschrieben werden 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;
Siehe auch: cdn_InitDone
es meine Frage auf dieser Seite war. Aber diese Lösung ist nicht vollständig. Weil die Position am Anfang nur einmal festgelegt ist. Die zweite oder dritte Einstellung der Position ist fehlgeschlagen. –
Einstellung nicht * einmal * genug ??? –
Ich möchte den Dialog jedes Mal in der Mitte des Hauptformulars anzeigen. Beispiel des Problems: Der Benutzer schließt den Speicherdialog, dann das Hauptformular verschieben und dann den Speicherdialog wieder öffnen => an diesem Punkt kann ich den Speicherdialog nicht in die Mitte des Hauptformulars verschieben. –