Непонятки с класом TForm
Модератор: Модераторы
Непонятки с класом TForm
решил поднять один проект в Лазарусе , и наткнулся на камень на ровном месте, почемуто у формы свойства Height равно ClientHeight, причем получается по логике оно равно ClientHeight, а размер физически формы немного более, и вот не знаю как быть с отрисовкой формы, я хочу высоту формы со всеми заголовками и бордюрами к примеру 200 а он устанавливает в 200 клиентскую часть формы показывает общую высоту тоже 200 но физически на 25-27 пикселей больше, это проблемы глобального характера или у меня чего то?(пробовал собирать проект на разных версиях паскаля и лазаруса эфект одинаковый)
-
Павел Ишенин
- постоялец
- Сообщения: 475
- Зарегистрирован: 24.03.2007 09:16:52
Это не проблемы какого-либо характера. Height для формы = ClientHeight и все. Это отличается от delphi. Если нужна вся высота - пишите GetWindowSize(Form1.Handle)
Если это так, то это баг.
-
betatester
- постоялец
- Сообщения: 276
- Зарегистрирован: 27.04.2007 22:21:45
- Контактная информация:
stikriz писал(а):Если это так, то это баг.
Нет. Это связано с тем, что оболочку окна, заголовок и кнопки в Linux добавляет Window Manager. Без Window Manager'а ваша программа все равно будет работать - т.е. рисовать в свою клиентскую область.
Ну и что, что что-то не так с Linux?
Это методологический вопрос. а не вопрос как ведет себя та или иная операционка.
Когда-то давно в Delphi не было ClientWidth и ClientHeight. Все очень по этому поводу переживали.
Сделали - всем понравилось. Если в Lazarus Width - это ClientWidth, тогда нам не нужен ClientWidth, а нужен WindowWidth, чтобы знать размер окна.
Реальный размер окна нужно знать, когда делаешь привязки окна по отношению к десктопу. Мало-ли, я поменял шрифт в заголовке, и теперь моё окно не влазит...
Короче, это баг.
Это методологический вопрос. а не вопрос как ведет себя та или иная операционка.
Когда-то давно в Delphi не было ClientWidth и ClientHeight. Все очень по этому поводу переживали.
Сделали - всем понравилось. Если в Lazarus Width - это ClientWidth, тогда нам не нужен ClientWidth, а нужен WindowWidth, чтобы знать размер окна.
Реальный размер окна нужно знать, когда делаешь привязки окна по отношению к десктопу. Мало-ли, я поменял шрифт в заголовке, и теперь моё окно не влазит...
Короче, это баг.
В Винде такой проблемы нет.
Если Линуксоиды не могут определить размер окна, то это еще не значит, что Виндовозникам нужно портить жизнь.
Если Линуксоиды не могут определить размер окна, то это еще не значит, что Виндовозникам нужно портить жизнь.
Спасибо всем за участие, хоть что то понятно, когда знаешь правили игры уже проще , буду пока выкручиватся вашими советами, но получается полную кросплатформеность при отрисовки у моих конструкторов форм не добьешься, в Форточках будет работать а в линуксах пока не знаю, ладно поживем увидим 
-
betatester
- постоялец
- Сообщения: 276
- Зарегистрирован: 27.04.2007 22:21:45
- Контактная информация:
Еще раз. Размер рамки окна и заголовка окна в Linux зависит от:stikriz писал(а):В Винде такой проблемы нет.
Если Линуксоиды не могут определить размер окна, то это еще не значит, что Виндовозникам нужно портить жизнь.
- Используемого Window Manager. Их существует порядка 20 штук и все они, вообще говоря, разные.
- Используемого шрифта заголовка.
- Используемой темы WM
Т.к. Lazarus - кроссплатформенное IDE, то приходиться чем-то жертвовать. Вам же предложили вариант с GetWindowSize(Form1.Handle). Чем он вам не нравиться?
-
RED_DRAGON
- новенький
- Сообщения: 13
- Зарегистрирован: 09.01.2009 12:53:16
Это не бага, это фича. Не надо покупаться на сказки Лазарус = Дельфи.
>> Т.к. Lazarus - кроссплатформенное IDE, то приходиться чем-то жертвовать. Вам же предложили вариант с GetWindowSize(Form1.Handle). Чем он вам не нравиться?
Действительно...
А нафига мне вообще объектная модель. если все можно делать на АПИ, так?
Можно же сделать по человечески. Оставить ClientWidth и ClientHeight, но в Windows это будет именно ClientWidth и ClientHeight, а в Linux Width = ClientWidth , Hieght = ClientHeight.
Затем, написать Тольвадсу, что надо бы ввести АПИ на получение ширины рамок, и что бы все "сволочи" обязательно поддерживали этот вызов.
Вы хоть понимаете как это уродливо смотрится, что я не могу получить реальный размер своего окна со всеми рамочками?
Действительно...
А нафига мне вообще объектная модель. если все можно делать на АПИ, так?
Можно же сделать по человечески. Оставить ClientWidth и ClientHeight, но в Windows это будет именно ClientWidth и ClientHeight, а в Linux Width = ClientWidth , Hieght = ClientHeight.
Затем, написать Тольвадсу, что надо бы ввести АПИ на получение ширины рамок, и что бы все "сволочи" обязательно поддерживали этот вызов.
Вы хоть понимаете как это уродливо смотрится, что я не могу получить реальный размер своего окна со всеми рамочками?
-
RED_DRAGON
- новенький
- Сообщения: 13
- Зарегистрирован: 09.01.2009 12:53:16
вах... пятничная религиозная война началась 
ООП чисто ради ООП ничего не стоит... т.к. не решает практическую задачу, которая в конечном итоге все равное решается более низовыми методами.
Потому люди, не подверженные демагогии, ищут максимально оптимальное решение для данных [времени]/[состояния проекта].
ООП чисто ради ООП ничего не стоит... т.к. не решает практическую задачу, которая в конечном итоге все равное решается более низовыми методами.
Потому люди, не подверженные демагогии, ищут максимально оптимальное решение для данных [времени]/[состояния проекта].
RED_DRAGON писал(а):вах... пятничная религиозная война началась
ООП чисто ради ООП ничего не стоит... т.к. не решает практическую задачу, которая в конечном итоге все равное решается более низовыми методами.
Потому люди, не подверженные демагогии, ищут максимально оптимальное решение для данных [времени]/[состояния проекта].
Я не говорил, что это не решение. Я, во первых, предложил более корректное решение, а во вторых объяснил почему. А сейчас, да, сейчас так. Собственно, товарищь ушел довольным, на сколько я понял.
betatester писал(а):Размер рамки окна и заголовка окна в Linux зависит от:
- Используемого Window Manager. Их существует порядка 20 штук и все они, вообще говоря, разные.
![]()
- Используемого шрифта заголовка.
- Используемой темы WM
И это все никаким боком не мешает определить реальный размер окна, мешают только отдельные криворукости WM использовать эти цифры
betatester писал(а):С точки зрения X11 оболочка окна - отдельное окно, отдельный процесс, родителем которого выступает WM, а вовсе не ваша программа.
В висте и даже в XP почти тоже самое, с включенными темами.
зы: В принципе делать специально такое отличие от дельфы конечно маразм.
-
betatester
- постоялец
- Сообщения: 276
- Зарегистрирован: 27.04.2007 22:21:45
- Контактная информация:
stikriz писал(а):Затем, написать Тольвадсу, что надо бы ввести АПИ на получение ширины рамок, и что бы все "сволочи" обязательно поддерживали этот вызов.
Вы хоть понимаете как это уродливо смотрится, что я не могу получить реальный размер своего окна со всеми рамочками?
Я понимаю. И ищу механизмы, которые позволили бы мне не зависеть от ширины рамочек. Вам это очень нужно? Вы что0то особенное делайте, для чего точно нужно знать ширину окна?
- Если вы как-то по особому располагаете окно на рабочем столе - для этого есть отдельные вызовы WM.
- Если вы пишите что-то в область рамки окна - это тоже, в принципе, решаемый вопрос. Но, чаще в сего, в Linux он решается несколько по другому, чем в Windows. Посмотрите на исходный код того же Audacious. Там эти вопросы прописаны.
Просто поймите. То, о чем вы ведете речь - особенности реализации КОНКРЕТНОЙ рабочей среды Linux. И стандартов оформления рамки окна в Linux нету. Практически, единственный стандарт, который управляет поведением и взаимодействием окон X11 - ICCCM. Да и то там темы и толщина рамок не описаны.
Еще раз - X11 - не Windows. И совершенно не важно подо что вы пишите - под QT ли, под GTK или под голый X11 - различия с Windows будут обязательно. Кстати, Торвальдсу писать бессмысленно. Он курирует только разработку ядра Linux. А за X11 отвечает совершенно другая команда(ы). Ну и, разумеется, у каждого из 20 WM - своя команда разработчиков.
