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

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

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

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

Сообщение pupsik » 01.03.2017 23:13:51

Да посмотрел, там системные функции ..
вам как мёд так и ложку? Разница у них почти сомнительная.

Это, возможно, интереснее...
http://stackoverflow.com/questions/5381188/how-do-i-position-a-topendialog

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

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

Сообщение vitaly_l » 01.03.2017 23:43:46

pupsik писал(а):Это, возможно, интереснее...
http://stackoverflow.com/questions/5381 ... opendialog

Похоже, на то... сейчас попробую переделать под принт диалог. спасибо.
Последний раз редактировалось vitaly_l 01.03.2017 23:55:16, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение pupsik » 01.03.2017 23:55:02

Вам сложно модифицировать исходник?
Код: Выделить всё
TPrintDialogPos = class(Dialogs.TPrintDialog)
  private
     Pt : TPThread;
  public
     function Execute(X,Y : integer):boolean; reintroduce;
  end;


Код: Выделить всё
function TPrintDialogPos.Execute(X,Y : integer):boolean;
begin
  Pt:= TPThread.Create(False);
  Pt.XPos := X;
  Pt.YPos := Y;
  if Self.Title <> '' then
     Pt.Title := Self.Title
  else begin
    Self.Title := 'ily tyta ^)';
    Pt.Title := Self.Title;
  end;
  Result:= inherited Execute;
  Pt.Free;
end; 


и вызывать как то так:
Код: Выделить всё
dlgPrint:=TPrintDialogPos.Create(self);

...
with dlgPrint do begin
    Title :='found meee, pleaz';
....
end;
...
if dlgPrint.Execute(Left+Width div 2, Top+Height div 2) then begin
    // your code
end;
...
dlgPrint.Free


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

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

Сообщение vitaly_l » 02.03.2017 00:09:50

pupsik писал(а):пока писал вы походу подправили сообщение. Или глюк?

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

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

Сообщение pupsik » 02.03.2017 02:49:03

адаптировать хак под принтдиалог
адаптировать там надо расчёт положения диалога.

п.с.
В лине проще будет диалогом двигать. Через Screen нашёл диалог. И можно координаты "пихать".
Но это только со "своими" окнами.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

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

Сообщение vitaly_l » 02.03.2017 12:07:07

pupsik писал(а):адаптировать

Адаптировал, хак - фурычит. Естественно только с english названиями, т.к. буржуйский FindWindow, на других языках - ни бельмеса не понимает, а так всё работает.

И ещё вот эта пара функций вызывает недоумение, потому что, вторая функция дублирует и перекрывает первую:
Код: Выделить всё
       MoveWindow(PrHandle, XPos, YPos,Right-Left,Bottom-Top,True);
       SetWindowPos(PrHandle, HWND_TOP, XPos, YPos, 0, 0, SWP_NOSIZE);   

Если любую из них убрать, то результат неизменно верный. Смысл такого дубляжа непонятен :roll: т.к. если вторая функция отсутствует в системе, то будет сбой, а если она есть везде то, зачем нужна первая? :cry: Всё тоже самое касается и первой функции.
Интересно: Какая из этих двух функций, более древняя и есть во всех версиях window-вз?

В любом случае Бородатому Пупсику - БОЛЬШУЩЕЕ СПАСИБО!!!


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

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

Сообщение pupsik » 02.03.2017 13:03:09

т.к. буржуйский FindWindow, на других языках
понимает... Приведите его в адекватную строку понятную винде.
п.с.
В любом случае...
это не мой код... И его можно применять. Но желательно подправить. Уж очень как то не правильно "дергать" окно без необходимости.

Смысл такого дубляжа непонятен
простой пример, без наворотов.
Просто намечалось "искать виновного" :
Получается что, этот баг (точнее недоделку) - невозможно исправить?
. Вот и пришлось у гугла спросить. :mrgreen:
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

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

Сообщение vitaly_l » 02.03.2017 13:31:53

pupsik писал(а):Вот и пришлось у гугла спросить.

Всё равно непонятно: :roll: зачем они отключили onShow? <== Странно всё это.
Если бы onShow работало как полагается, то всё бы закончилось, без хаков - одной функцией: MoveWindow

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

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

Сообщение pupsik » 02.03.2017 14:13:27

onShow
оно работает. Только вот зачем оно?
Вы думаете что оно в момент показа окна должно сработать? :)
Посмотрите код:
Код: Выделить всё
if FDoShowCalled then Exit;
  FDoShowCalled := True;
  if Assigned(FOnShow) then FOnShow(Self);

Т.е. вы что то там инициализировать или ещё чего захотели. Вот и заполнили событие. Перед Dialog.Execute "сказали" Dialog.DoShow. И будет выполнен код из onShow.
А то что вы хотите - перехват показанного окна, а не момент инициализации. И без потока сложновато это сделать. В принципе можно руками тащить из длл. Но там песец прячется (маленький но муторный).

И кто не работает? Где баг? Кто виноват?
Я знаю ответы: лазарь или система :twisted:

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

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

Сообщение vitaly_l » 02.03.2017 14:32:00

pupsik писал(а):все же сделайте себе принтдиалог на основе формы или фрейма и будет кросс..

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

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

Сообщение Лекс Айрин » 02.03.2017 14:39:21

vitaly_l писал(а):Если любую из них убрать, то результат неизменно верный.


Это разные функции. Первая передвигает окно, а вторая располагает координаты окна окно на указанную позицию. Разница в том, что, для MoveWindow окно должно быть показано, а для SetWindowPos (теоретически) окно может быть и скрыто.

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

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

Сообщение vitaly_l » 02.03.2017 14:45:40

Лекс Айрин писал(а):Первая передвигает окно, а вторая располагает координаты окна окно на указанную позицию.

Суть от этого не меняется, обе функции ставят окно в одно и тоже положение. Соответственно, любую из них можно смело убрать из кода.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение Лекс Айрин » 02.03.2017 15:31:39

vitaly_l,
Вот пример кода

Код: Выделить всё
frame.Free;//? стоит ли?  С ним ошибка при повторном нажатии исчезает.))
...   
Frame := TFrameFolders.Create(PanelFolders);
    Frame.Align:=alClient;
    Frame.Parent := PanelFolders;

    Form1.Caption:='Папки';
   
    PanelFolders.Visible:=true;
...


Вопрос на засыпку.... зачем первая строчка?
Это я к тому, что любое, даже самое странное решение может быть введено из-за совсем непонятных с первого взгляда причин. И убранная строчка может аукнуться неизвестно где.

Вообще, по логике работы, MoveWindow должна вызывать SetWindowsPos для установки координат, но тогда непонятно их использование в одном и том же куске кода. По манам разница между ними только в том, что вторая может поднять/опустить окно относительно других (изменить его Z-индекс).

В winAPI, к сожалению, как я понял, по историческим причинам такого дублирования функций полно. Судя по всему, лучше убрать MoveWindow.
А насчет того у какой больше шансов выжить в перспективе, так это не скажет никто.

Добавлено спустя 5 минут 10 секунд:
Ах да... вот еще одна разница.

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

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

Сообщение pupsik » 02.03.2017 16:29:02

Вопрос на засыпку.... зачем первая строчка?
для вашего велика. :)
С другой стороны: если вы на одном frame "держите" разные формы то вполне нормально. Иначе: храните frames в контейнере.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

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

Сообщение Лекс Айрин » 02.03.2017 16:43:56

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

Пред.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru
cron