(решено) PrintDialog1 по центру родительского окна, как?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

(решено) PrintDialog1 по центру родительского окна, как?

Сообщение vitaly_l » 24.02.2017 10:45:27

Всем хорошего дня и настроения!

:?: разместить PrintDialog1 по центру родительского окна, как?
:?: можно ли присвоить PrintDialog1, что-то типа poMainFormCenter ?

Добавлено спустя 3 часа 33 минут:
Ну или хотя-бы задать Top и Left ?
Последний раз редактировалось vitaly_l 02.03.2017 11:52:10, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: разместить PrintDialog1 по центру родительского окна, ка

Сообщение Лекс Айрин » 24.02.2017 15:45:51

Вручную и задавай. Бери координаты родительского окна, вычисляй центр, а потом вычисляй смещение левого верхнего угла относительно центра окна. Top, Left, Width и Height любого окна доступны как на чтение, так и на запись.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: разместить PrintDialog1 по центру родительского окна, ка

Сообщение vitaly_l » 24.02.2017 16:11:54

Лекс Айрин писал(а):Вручную и задавай. Бери координаты родительского окна, вычисляй центр, а потом вычисляй смещение левого верхнего угла относительно центра окна. Top, Left, Width и Height любого окна доступны как на чтение, так и на запись.

Там нет возможности задать Top или Left. У его прототипов, в несколько колен - тоже нет Top или Left. Даже хакнуть не знаю как?
Может быть, как-то можно, получить хэндл окна PrintDialog1 и задать Top и Left с помощью windows API или ещё как???
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: разместить PrintDialog1 по центру родительского окна, ка

Сообщение Лекс Айрин » 24.02.2017 16:53:31

хендл любого, пожалуй, окна получить не проблема -- он забит в самой структуре описателя окон....

Код: Выделить всё
TmpHahdle:= form1.Handle;
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: разместить PrintDialog1 по центру родительского окна, ка

Сообщение olegy123 » 24.02.2017 17:00:10

В винде есть перевод локальных координат в дисплейные..
вроде это оно:
mapwindowpoints

Добавлено спустя 11 минут 30 секунд:
Re: разместить PrintDialog1 по центру родительского окна, как?
http://www.swissdelphicenter.ch/en/showcode.php?id=783
Тут переопределяют:
procedure DoShow; override;
с mapwindowpoints
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: разместить PrintDialog1 по центру родительского окна, ка

Сообщение vitaly_l » 24.02.2017 21:43:34

olegy123 писал(а):http://www.swissdelphicenter.ch/en/showcode.php?id=783
Тут переопределяют:
procedure DoShow; override;
с mapwindowpoints


Задавать, судя по коду Чехов, должен BoundsRect, но BoundsRect у PrintDialog1 - тоже нет :oops: :( :cry:
Проблема в том что, нет возможности задать top и left, т.к. PrintDialog1 - только высоту и ширину позволяет менять.

Добавлено спустя 333 минуты 333 секунды:
Re: разместить PrintDialog1 по центру родительского окна, как?
Нашёл функцию которая двигает окна, называется она как обычно, по буржуйски: MoveWindow
Теперь выяснилось, что PrintDialog1.Handle - всегда возвращает 0 и не получается получить его Handle. Решил проверить в OnShow.
Но увы, родной из инспектора объектов - OnShow у PrintDialog1 - не запускается и Handle определить никак не получается.
Попробовал прикрутить процедуру к OnShow, в надежде что Handle, там уже присвоен. Прикрутил-прикрутилась, но тоже не запускается.

Код: Выделить всё

PrintDialog1.OnShow:=@printWinShow; // почему-то при OnShow у PrintDialog1 - не срабатывет. Почему?

procedure TFormMain.printWinShow(Sender: TObject);
begin
  ShowMessage(IntToStr(PrintDialog1.Handle));
  windows.MoveWindow(PrintDialog1.Handle,111,111,PrintDialog1.Width,PrintDialog1.Height,true);
end; 



:idea: :?: Что делаю не так?

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: разместить PrintDialog1 по центру родительского окна, ка

Сообщение vitaly_l » 01.03.2017 18:53:46

Получается что, этот баг (точнее недоделку) - невозможно исправить?
:arrow: Узнать Handle у PrintDialog - невозможно?
:arrow: Запустить событие OnShow у PrintDialog - невозможно?
:arrow: Переместить окно у PrintDialog - невозможно?

:roll: :| :( :oops: :cry:
.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: разместить PrintDialog1 по центру родительского окна, ка

Сообщение Лекс Айрин » 01.03.2017 19:51:41

Я бы не назвал это багом и/или недоделкой. Это явно сделано специально.

Исправить, конечно, можно -- залезть в потроха диалога и потом перекомпилировать среду. Возможно, получится определить свой диалог печати. А может, проще создать левую форму и позиционировать относительно нее... Но опять же... это как тот неуловимый Джо, которого поймать легко, но он никому не нужен.
Узнать Handle диалогового окна можно, в принципе, так же как и обычного -- после его отображения оно доступно.
Cобытие onShow вполне доступно. Другое дело, что тебе это ничего не даст, так как ни в одном диалоге нет возможности задать координаты. А само событие не более чем заглушка уходящая до CommonDialog. И уже там определенная как процедурная переменная.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: разместить PrintDialog1 по центру родительского окна, ка

Сообщение pupsik » 01.03.2017 20:08:44

http://swissdelphicenter.com/en/showcode.php?id=1852
http://forum.lazarus.freepascal.org/index.php?topic=15793.0

Добавлено спустя 4 минуты 44 секунды:
Re: разместить PrintDialog1 по центру родительского окна, как?
Лекс Айрин это ничего не даст только по одной причине: под каждую систему свой велик. Проще своё поделие сделать на основе формы.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: разместить PrintDialog1 по центру родительского окна, ка

Сообщение Лекс Айрин » 01.03.2017 20:36:13

pupsik писал(а):это ничего не даст только по одной причине: под каждую систему свой велик.


К тому и говорю.

Но думаю, что диалоговые окна располагаются преимущественно по центру по очень банальной причине -- они модальные и работа программы при их активации невозможна (бессмысленна). В случае если вдруг потребуется увидеть то, что под ними -- всегда можно сдвинуть ручками.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: разместить PrintDialog1 по центру родительского окна, ка

Сообщение pupsik » 01.03.2017 21:06:12

всегда можно сдвинуть ручками.
смотря как сделать :)

vitaly_l вы бы уже сделали свой диалог основываясь на форме и не парились.
24.02.2017 -- 01.03.2017... за это время можно все диалоги переделать :mrgreen:
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: разместить PrintDialog1 по центру родительского окна, ка

Сообщение Лекс Айрин » 01.03.2017 21:07:44

pupsik писал(а):смотря как сделать


По человечески. Если делать на отвяжись, то конечно не получится.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: разместить PrintDialog1 по центру родительского окна, ка

Сообщение vitaly_l » 01.03.2017 21:35:09

Лекс Айрин писал(а):окна располагаются преимущественно по центру

Если бы оно по центру открывалось, то всё было бы чудесно, но оно открывается так, что его не видно. Потому что, открывается не по центру программы, а по центру монитора. И если монитор составной, то при открытии - диалогового окна невидно. И я поэтому хочу его по центру программы сделать, чтобы PrintDialog1 окно видно было.
pupsik писал(а):vitaly_l вы бы уже сделали свой диалог основываясь на форме и не парились.

Логично, я думал об этом, но по-прежнему надеюсь, что у программистов есть способ. Так не хочется с этим связываться... в стандартном принтдиалоге - всё работает и всё есть. А тут нужно опять искать. Я честно говоря боюсь системных функций, т.к. в одной версии такое подключение, в иной версии иное подключение. Соответственно, на одной машине будет работать на другой не будет. В Лазарусе, работу - 1000 программистов проверяют, а я могу только 1-5 машинах проверить.
Лекс Айрин писал(а):Узнать Handle диалогового окна можно, в принципе, так же как и обычного -- после его отображения оно доступно

А толку? ОнШоу - не работает, как я таймером его ловить буду? В параллельном режиме запускать? Неужели onShow никак нельзя подключить?
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: разместить PrintDialog1 по центру родительского окна, ка

Сообщение pupsik » 01.03.2017 22:33:39

Стоп... Вам надо "держать по центру" окно всегда, пока оно активно?
Если да то "путь в собственную реализацию" на основе формы, фрейма... Иначе без следящего потока не разгрестись, плюс косяки полезут.

п.с.
Ссылки то хоть смотрели? Там вроде как функция размещающая диалог где необходимо вам, а не как обычно.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: разместить PrintDialog1 по центру родительского окна, ка

Сообщение vitaly_l » 01.03.2017 22:54:39

pupsik писал(а):Стоп... Вам надо "держать по центру" окно всегда, пока оно активно?

Нет, мне нужно чтобы оно открылось по центру окна моей ПРОГРАММЫ. Дальше пользователь может делать с PrintDialog1 всё что хочет.
pupsik писал(а):Ссылки то хоть смотрели?

Да посмотрел, там системные функции завязаны на системный OpenDialog, а мне нужен PrintDialog1 - они разные и я не смогу ими воспользоваться.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 46

Рейтинг@Mail.ru