![]() |
Position von Dialog
Hi
und zwar hatte ich gestern ne Frage wie man die Messagedialogs in der Mitte meiner Form aufgehen lässt. Jetzt ist mir aufgefallen das ich die ganzen Dialogs (Open-, Picture-, Printdialog usw) auch in der Mitte aufgehen lassen muss gibt es da auch eine möglichkeit die Position zu bestimmen Gruß Sascha |
Re: Position von Dialog
Eine "Idee von Pascal Enz" zu den "richtigen" Dialogen findest Du
![]() Zur mittigen Positionierung habe ich es so abgewandelt:
Delphi-Quellcode:
// OldProcfuerOpendialog1: Dword globale Variable
//Idee von Pascal Enz function DialogProc(Handle: HWND; Msg: DWORD; wParam, lParam: Integer):Integer; stdcall; const W = 683; H = 512; begin if MSG = WM_SHOWWINDOW then Begin SendMessage(Handle, WM_COMMAND, $A004, 0); SendMessage(Handle, WM_COMMAND, $A004, 0); SetWindowPos(Handle, 0, Form.Left + (Form.Width div 2) - (W div 2), Form.Top + (Form.Height div 2) - (H div 2), W, H, 0); End; Result := CallWindowProc(Pointer(OldProcForOpenSaveDialog), Handle, Msg, wParam, lParam); end; Zu den MessageDialogen habe ich keine Lösung gefunden - würde mich aber auch noch interessieren. stahli |
Re: Position von Dialog
Zu den MessageBoxen gabe
War vom Dani und Funzt sehr gut selbst beim verkleinern der Form (logisch)
Delphi-Quellcode:
function MessageDlgPos2(const Msg: string; DlgType: TMsgDlgType;
Buttons: TMsgDlgButtons; ParentForm: TForm = nil; HelpCtx: Longint = -1; const HelpFileName: string = ''): Integer; begin with CreateMessageDialog(Msg, DlgType, Buttons) do try HelpContext := HelpCtx; HelpFile := HelpFileName; if Assigned(ParentForm) then begin Position := poDesigned; //0 div 2 -> 0, also kein Problem. Left := ParentForm.Left + ((ParentForm.Width - Width) div 2); Top := ParentForm.Top + ((ParentForm.Height - Height) div 2); end else begin Position := poScreenCenter; end; Result := ShowModal; finally Free; end; end; procedure TForm1.Button1Click(Sender: TObject); begin MessageDlgPos2('Dies ist ein Test', mtInformation, [mbOK], Self); end; |
Re: Position von Dialog
so hier nochmal komplett:
Delphi-Quellcode:
stahli
implementation
uses Windows, Messages; var OldProcForOpenSaveDialog: DWord; // OldProcfuerOpendialog1: Dword globale Variable //Idee von Pascal Enz function DialogProc(Handle: HWND; Msg: DWORD; wParam, lParam: Integer):Integer; stdcall; const W = 683; H = 512; begin if MSG = WM_SHOWWINDOW then Begin SendMessage(Handle, WM_COMMAND, $A004, 0); SendMessage(Handle, WM_COMMAND, $A004, 0); SetWindowPos(Handle, 0, FormXyz.Left + (FormXyz.Width div 2) - (W div 2), FormXyz.Top + (FormXyz.Height div 2) - (H div 2), W, H, 0); End; Result := CallWindowProc(Pointer(OldProcForOpenSaveDialog), Handle, Msg, wParam, lParam); end; // und folgende Ereignisbehandlungen den Dialogen zuweisen... procedure TFormXyz.OpenDialogClose(Sender: TObject); var Handle: HWND; begin Handle := GetParent((Sender as TOpenDialog).Handle); SetWindowLong(Handle, DWL_DLGPROC, Integer(OldProcForOpenSaveDialog)); OldProcForOpenSaveDialog := 0; end; procedure TFormXyz.OpenDialogShow(Sender: TObject); var Handle: HWND; begin Handle := GetParent((Sender as TOpenDialog).Handle); OldProcForOpenSaveDialog := GetWindowLong(Handle, DWL_DLGPROC); SetWindowLong(Handle, DWL_DLGPROC, Integer(@DialogProc)); end; procedure TFormXyz.SaveDialogClose(Sender: TObject); var Handle: HWND; begin Handle := GetParent((Sender as TSaveDialog).Handle); SetWindowLong(Handle, DWL_DLGPROC, Integer(OldProcForOpenSaveDialog)); OldProcForOpenSaveDialog := 0; end; procedure TFormXyz.SaveDialogShow(Sender: TObject); var Handle: HWND; begin Handle := GetParent((Sender as TSaveDialog).Handle); OldProcForOpenSaveDialog := GetWindowLong(Handle, DWL_DLGPROC); SetWindowLong(Handle, DWL_DLGPROC, Integer(@DialogProc)); end; |
Re: Position von Dialog
Mach ich da was falsch habe es jetzt mal mit dem Color dialog versuch aber irgenwie will das net so
Delphi-Quellcode:
var Form6: TForm6; OldProcForOpenSaveDialog: DWord; implementation . . . . function DialogProc(Handle: HWND; Msg: DWORD; wParam, lParam: Integer):Integer; stdcall; const W = 683; H = 512; begin if MSG = WM_SHOWWINDOW then Begin SendMessage(Handle, WM_COMMAND, $A004, 0); SendMessage(Handle, WM_COMMAND, $A004, 0); SetWindowPos(Handle, 0, Form6.Left + (Form6.Width div 2) - (W div 2), Form6.Top + (Form6.Height div 2) - (H div 2), W, H, 0); End; Result := CallWindowProc(Pointer(OldProcForOpenSaveDialog), Handle, Msg, wParam, lParam); end; procedure TForm6.ColorDialog1Close(Sender: TObject); var Handle: HWND; begin Handle := GetParent((Sender as TColorDialog).Handle); SetWindowLong(Handle, DWL_DLGPROC, Integer(OldProcForOpenSaveDialog)); OldProcForOpenSaveDialog := 0; end; procedure TForm6.ColorDialog1Show(Sender: TObject); var Handle: HWND; begin Handle := GetParent((Sender as TColorDialog).Handle); OldProcForOpenSaveDialog := GetWindowLong(Handle, DWL_DLGPROC); SetWindowLong(Handle, DWL_DLGPROC, Integer(@DialogProc)); end; |
Re: Position von Dialog
Was geht denn genau nicht?
Hast Du das mal schrittweise angesehen? |
Re: Position von Dialog
Es plobt nicht in der mitte der Form auf auch wenn ich Sie verschiebe.
Immer nur in der mitte vom screen |
Re: Position von Dialog
Werden die Prozeduren korrekt abgearbeitet?
Was steht in Form6.Left und Width? |
Re: Position von Dialog
Die proceduren Arbeiten
Im OI Top = 0 und Left = 0 aber das ändert sich ja zur laufzeit immerwieder wenn man die Form verschiebt |
Re: Position von Dialog
... soll sich ja auch ändern ;-)
Hier Form6.Left + (Form6.Width div 2) - (W div 2), Form6.Top + (Form6.Height div 2) - (H div 2), kannst Du Dir doch ansehen, was genau zugewiesen wird... Sonst weiß ich auch nicht... stahli |
Re: Position von Dialog
ok anscheinend komm ich nicht in die funktion rein
es wird nichts angezeigt mit einem showmessgae |
Re: Position von Dialog
Moin, Moin,
ich habe für diese Zwecke immer folgendes verwendet, um z.B. einen OpenDialog zu positionieren:
Delphi-Quellcode:
Das funktioniert eigentlich immer - dachte ich! Es funktioniert aber offenbar nur, wenn in Options des Dialogs die Eigenschaft ofOldStyleDialog=true ist. Als alter Mann nutze ich immer diese Option - hihihi. Läßt man den Dialog aber im modernen Stil erscheinen, funktioniert die Positionierung nicht. Vielleicht ist das auch der Grund, das eure Lösungen nicht funktionieren?!
procedure Tfo~~.OpenDialog1Show(Sender:TObject);
var Rect : TRect; begin with Sender as tOpenDialog do begin GetWindowRect(Handle,Rect); MoveWindow(Handle, 0, // new Left 0, // new Top succ(Rect.Right -Rect.Left), succ(Rect.Bottom-Rect.Top), true ); end; end; |
Re: Position von Dialog
ok ich versuche es ja gerdae beim Colordialog und da gibt es diese eigenschaft garnicht also geht es damit anscheinend nicht.
|
Re: Position von Dialog
Ahh, bei mir funktioniert das (mit meinem Ansatz) beim ColorDialog schon. Verwendet deine Delphi-Version dann wohl schon einen NEUEN ColorDialog?! Aber sicherlich gibt es auch für die "neuen Dialoge" einen Weg - leider kenne ich ihn nicht :(
|
Re: Position von Dialog
Kennt vielleicht irgendjeman noch einen Weg.
Ich Frage mich immer nur wie Ihr das sonst macht, überlasst Ihr das Windows wo es aufplopen soll oder könnt Ihr das alle ohne nachzufragen. :gruebel: Bin ich so blöd ich weiss ich habe immer viele Fragen aber im gegensatz zudem was ich alles selber schreibe und finde, sind es noch recht wenig Fragen :mrgreen: |
Re: Position von Dialog
Gut beim Normalen Opendialog funzt es jetzt bei mir auch.
Nur beim Colordialog nicht??? |
Re: Position von Dialog
Was liefern denn
Form6.Left + (Form6.Width div 2) - (W div 2), Form6.Top + (Form6.Height div 2) - (H div 2), zur Laufzeit zurück? Wird CallWindowProc aus der Unit Windows aufgerufen? |
Re: Position von Dialog
wie gesagt es kommt nicht aus der funktion zurück
Aber dein code funzt bei den anderen Dialogen ganz gut, muss jetzt nur noch gucken ob es beim Fontdialog geht. Für das Colordialog muss ich mal schauen ob ich nochwas finde habe aber schon überall im Forum gesucht, anscheinen hatte noch niemand das Problem. |
Re: Position von Dialog
Hi
wollte nur nochmal nachfragen ob da jemand ne Lösung hat. Habe jetzt fetgestellt das der Code von stahli bei den meisten Dialogen funktioniert nur beim Font- Color- und printdialog nicht. Hat jeman vielleicht eine Lösung. Gruß Sascha |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz