Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Позиционирование TSaveDialog

Delphi , Программа и Интерфейс , Диалоги и Фреймы

Code:

unit Unit1;

 
interface
 
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, CommDlg;
 
type
TMySaveDialog = class(TSaveDialog)
protected
   procedure WndProc(var Message: TMessage); override;
end;
 
TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
end;
 
var
Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TMySaveDialog.WndProc(var Message: TMessage);
const
X = 10;
Y = 30;
begin
with Message do
begin
   if ((Msg = WM_NOTIFY) and (POFNotify(LParam)^.hdr.code = CDN_INITDONE)) or
      ((Msg = WM_UPDATEUISTATE) and (WParamLo = UIS_SET)) then
   begin
     if Owner is TForm then
       SetWindowPos(GetParent(Handle), HWND_TOP, X, Y, 0, 0, SWP_NOSIZE);
   end
   else
     inherited;
end
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
TMySaveDialog.Create(Self).Execute;
end;
 
end.

 
Автор: Александр (Rouse_) Багель

Взято из http://forum.sources.ru

Code:

unit Unit1;

 
interface
 
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
 
type
TForm1 = class(TForm)
   SaveDialog1: TSaveDialog;
   Button1: TButton;
   procedure SaveDialog1Show(Sender: TObject);
   procedure Button1Click(Sender: TObject);
private
   { Private declarations }
public
 
end;
 
var
Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
{ TForm1 }
 
 
function NewSaveDlgProc(wnd:HWND; uMsg:DWORD; wParam:Integer; lParam:integer):integer; stdcall;
begin
if uMsg=WM_SHOWWINDOW then MoveWindow(wnd, 10, 30, 500, 100, True) ;
result:=CallWindowProc(Pointer(GetWindowLong(wnd,GWL_USERDATA)),wnd,uMsg,wParam,lParam)
end;
 
procedure TForm1.SaveDialog1Show(Sender: TObject);
begin
SetWindowLong(GetParent(SaveDialog1.Handle),GWL_USERDATA,
    SetWindowLong(GetParent(SaveDialog1.Handle),DWL_DLGPROC,DWORD(@NewSaveDlgProc)));
end;
 
 
procedure TForm1.Button1Click(Sender: TObject);
begin
SaveDialog1.Execute
end;
 
end.

Автор: Krid

Взято из http://forum.sources.ru

Первый код-снippet - пример позиционирования контрола TSaveDialog при его отображении с помощью переопределения метода WndProc в Delphi.

В этом примере класс TMySaveDialog переопределяет метод WndProc, чтобы поймать сообщения WM_NOTIFY и WM_UPDATEUISTATE. Когда эти сообщения получаются, код проверяет, инициализируется ли диалог или обновляется, и если да, то вызывает функцию SetWindowPos для позиционирования диалога на координатах (10, 30) относительно его родительского окна.

Второй код-снippet - альтернативное решение, которое достигает того же результата с помощью custom dialog procedure.

В этом примере класс TForm1 имеет метод SaveDialog1Show, который задает custom dialog procedure для контрола SaveDialog1. Custom dialog procedure реализуется как standalone-функция NewSaveDlgProc. Эта функция переопределяет стандартный процедуру окна, проверяя, является ли сообщение WM_SHOWWINDOW, и если да, то перемещает окно на желаемую позицию (10, 30) с помощью функции MoveWindow.

Оба код-снippets достигают того же результата - позиционирования контрола TSaveDialog при его отображении. Первый snippet использует переопределение метода WndProc, а второй snippet - custom dialog procedure.

Некоторые ключевые отличия между двумя подходами:

  • Первый подход требует переопределения метода WndProc в классе TMySaveDialog, что может не быть желательно, если вы хотите сохранить оригинальное поведение контрола.
  • Второй подход более гибок и позволяет настроить диалог-procedure без изменения underlying-контроля.

В целом, оба подхода могут работать хорошо в зависимости от вашей конкретной задачи и ограничений дизайна.

Статья описывает два способа изменения положения диалогового окна TSaveDialog в Delphi, один с помощью наследования от TSaveDialog и другой с использованием SetWindowLong и SetWindowPos.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Диалоги и Фреймы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 01:33:51/0.00319504737854/0