Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1223996504
Gurd
2008-10-14 19:01
2008.11.23
Назначить edit2 событие onKeyPress edit1


2-1223557692
AlexDan
2008-10-09 17:08
2008.11.23
RichEdit и буфер обмена


15-1222076420
Дмитрий Белькевич
2008-09-22 13:40
2008.11.23
Ищу ножную USB педаль


4-1198642093
Black_Tomcat
2007-12-26 07:08
2008.11.23
Отловить сообщение во втором потоке созданным CreateThread


3-1210245809
Tans
2008-05-08 15:23
2008.11.23
Помогите, плиз.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский