Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.11.23;
Скачать: CL | DM;

Вниз

MessageDlgPos   Найти похожие ветки 

 
Dr. Genius   (2008-10-08 18:51) [0]

Здравствуйте!

Какие значения X и Y надо вводить в MessageDlgPos, чтобы это диалоговое окно появлялось прямо по центру формы, из которой оно вызывается.


 
{RASkov} ©   (2008-10-08 19:32) [1]

> Какие значения X и Y надо вводить в MessageDlgPos

Если только отгадывать каждый раз...

> [0] Dr. Genius   (08.10.08 18:51)

Попробуй вот так:
function CenterMyFormMessageDlg(const Msg: String; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; AParentForm: TForm): Integer;
begin
 with CreateMessageDialog(Msg, DlgType, Buttons) do try
  if Assigned(AParentForm) then begin
   Left:=(AParentForm.Left+AParentForm.Width div 2)-(Width div 2);
   Top:=(AParentForm.Top+AParentForm.Height div 2)-(Height div 2);
  end;
   Result:=ShowModal;
 finally
  Free;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 CenterMyFormMessageDlg("Это круто?", mtConfirmation, [mbYes, mbNo], self);
end;


CreateMessageDialog - в D7 находится в модуле Dialogs, как это в D6 фик знает....


 
jack128_   (2008-10-08 20:36) [2]

а не проще центровать по текущему активному окну???


 
Anatoly Podgoretsky ©   (2008-10-08 21:15) [3]


> MessageDlg

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


 
Правильный$Вася   (2008-10-08 21:21) [4]


>  диалоговое окно появлялось прямо по центру формы, из которой
> оно вызывается.

вот интересно, а если форма у меня задвинута за экран, едва-едва видна
по центру чего ты хочешь показать свой диалог, а?


 
Dr. Genius   (2008-10-10 09:05) [5]

{RASkov}, спасибо за код. Он работает, но это не совсем то, что мне нужно. Долго объяснять почему, но мне требуется именно ф-ия MessageDlgPos.

Я пробовал ввести приведенные в коде значения (см. ниже) в качестве X и Y в ф-ию MessageDlgPos, но это не помогает – диалоговое окно не центрируется посередине формы.

(AParentForm.Left+AParentForm.Width div 2)-(Width div 2);
(AParentForm.Top+AParentForm.Height div 2)-(Height div 2);

Неужели никак нельзя высчитать центр формы вместо того, чтобы написать свой вариант MessageDlg.


 
anonims   (2008-10-10 10:13) [6]

ClienttoScreen


 
Правильный$Вася   (2008-10-10 11:22) [7]


> Неужели никак нельзя высчитать центр формы

можно
используй Form.Top, Left, Width, Height и арифметику
сложнее с вычислением размеров твоего диалога, т.к. они зависят от размеров текста на нем
но ты так и не ответил на [4]


 
{RASkov} ©   (2008-10-10 11:58) [8]

> [5] Dr. Genius   (10.10.08 09:05)
> Неужели никак нельзя высчитать центр формы

Нельзя... так как перед вызовом ты еще не знаешь размеры будующего окна сообщения...


 
{RASkov} ©   (2008-10-10 13:17) [9]

> [5] Dr. Genius   (10.10.08 09:05)
> но мне требуется именно ф-ия MessageDlgPos.

Вот:
unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

const MSG_CENTERDIALOG = WM_USER + 101;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private { Private declarations }
   procedure CenterDialog(var Mes: TMessage); message MSG_CENTERDIALOG;
 public { Public declarations }
 end;

var Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.CenterDialog(var Mes: TMessage);
var HND: THandle; R: TRect; W, H: Integer;
begin
 HND:=GetForegroundWindow;
 GetWindowRect(HND, R);
 W:=R.Right-R.Left;
 H:=R.Bottom-R.Top;
 SetWindowPos(HND, HWND_NOTOPMOST, (Left+Width div 2) - (w div 2), (Top+Height div 2)-(h div 2), 0, 0, SWP_NOSIZE);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 PostMessage(Handle, MSG_CENTERDIALOG, 0, 0);
 MessageDlgPos("Изврат?", mtConfirmation, [mbYes, mbNo], 0, 0, 0);
end;

end.

Жми [Yes] :)


 
{RASkov} ©   (2008-10-10 13:47) [10]

С учетом [4] можно сделать нечто вот так:
procedure TForm1.CenterDialog(var Mes: TMessage);
var HND: THandle; R: TRect; L, T, W, H: Integer;
begin
 HND:=GetForegroundWindow;
 GetWindowRect(HND, R);
 W:=R.Right-R.Left;
 H:=R.Bottom-R.Top;
 L:=Min(Max((Left+Width div 2) - (w div 2), 0), Screen.WorkAreaWidth-W);
 T:=Min(Max((Top+Height div 2)-(h div 2), 0), Screen.WorkAreaHeight-H);
 SetWindowPos(HND, 0, L, T, 0, 0, SWP_NOSIZE or SWP_NOOWNERZORDER);
end;

Но мне кажется, что автору и это не подойдет, так как он ленивый и переписывать в проекте кучу строк не захочет.... :)
Я в принципе вижу еще пару решений задачи, но они все подразумевают изменение(написания) кода, а не угадывание координат до вызова диалога.... т.е. что хочет автор...


 
{RASkov} ©   (2008-10-10 13:57) [11]

Да, так же нужно понимать(помнить) что под эту строку
> HND:=GetForegroundWindow;

может попасть и вовсе не наш диалог) ...и произойдет центрирование окна-невезунчика по нашей форме...


 
Leonid Troyanovsky ©   (2008-10-10 17:55) [12]


> RASkov} ©   (10.10.08 13:57) [11]

> может попасть и вовсе не наш диалог)

HND:=GetActiveWindow;

--
Regards, LVT.


 
{RASkov} ©   (2008-10-10 18:15) [13]

> [12] Leonid Troyanovsky ©   (10.10.08 17:55)
> HND:=GetActiveWindow;

А тут 100% будет наш диалог? ...или тоже вилами по воде...
:)


 
Anatoly Podgoretsky ©   (2008-10-10 18:54) [14]

> {RASkov}  (10.10.2008 18:15:13)  [13]

А в справке разве тяжело посмотреть?


 
{RASkov} ©   (2008-10-10 20:54) [15]

> [14] Anatoly Podgoretsky ©   (10.10.08 18:54)

А если у автора, например, еще и по таймеру окошки вылазят?)
Не, это хоть и лучше(надежнее) вариант чем изначально мой, но тоже могут быть казусы.... 1 из мильёна, но могут :)



Страницы: 1 вся ветка

Текущий архив: 2008.11.23;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.009 c
11-1195918889
Михаил
2007-11-24 18:41
2008.11.23
KOLZip


6-1195580822
9899100
2007-11-20 20:47
2008.11.23
определить по IP клиента MAC адрес его сетевой


3-1210259859
AlexAl-77
2008-05-08 19:17
2008.11.23
MSSQL 2005


15-1222077048
Пробежал...
2008-09-22 13:50
2008.11.23
Книжные магазины


3-1210056416
andreoman
2008-05-06 10:46
2008.11.23
cxGridDBTableView+IBQuery+IBUpdateSQLW, проверка столбца