Форум: "Начинающим";
Текущий архив: 2008.11.23;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c