Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
uh-aleks
6 / 6 / 0
Регистрация: 02.01.2010
Сообщений: 68
1

Определение позиции формы

10.06.2010, 18:30. Просмотров 3206. Ответов 16
Метки нет (Все метки)

Как можно совершенно точно определить позицию верхнего левого угла рабочей области формы на экране? Т.е. без заголовка формы. Я думал, что можно из Height вычесть ClientHeight и получить те излишки на заголовок и нижнюю рамку, но здесь могут получиться неточности, т.к. высота заголовка и нижней рамки в разных темах могут иметь разную высоту.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.06.2010, 18:30
Ответы с готовыми решениями:

Вычисление позиции
Итак, есть paintbox надо при нажатии на кнопку произвести следующие вычисления:...

Сохранение позиции Combobox
Друзья, как сохранить в ini файл позицию с Combobox, например выбрал один из...

Рандомные позиции в RadioGroup
Доброго времени суток форумчане! Спасибо тем кто посетил данную страницу. ...

Номер позиции в строке
Найти номер позиции первой цифры в строке. Я пробовал писать, но не выходит,...

Splitter. Процедура позиции
НароД, а существует ли процедура позиции сплиттера, мне нужно что бы исходя из...

16
leejack
190 / 177 / 37
Регистрация: 19.01.2010
Сообщений: 606
Записей в блоге: 1
10.06.2010, 19:01 2
Свойства Top и Left Формы определяют координаты верхнего левого угла
0
Mad_Dog
Фрилансер
449 / 430 / 117
Регистрация: 01.06.2010
Сообщений: 1,315
10.06.2010, 19:09 3
leejack, ему нужны координаты не верхнего левого угла формы, а координаты левого верхнего угла рабочей области, т.е. той, что под заголовком формы (как будто бы нет заголовка у формы...).
0
leejack
190 / 177 / 37
Регистрация: 19.01.2010
Сообщений: 606
Записей в блоге: 1
10.06.2010, 19:30 4
Mad_Dog, сорри...
Тогда Left остается Left'ом...
А Top равен Top+34...
Короче размер верхнего заголовка равен 34
0
uh-aleks
6 / 6 / 0
Регистрация: 02.01.2010
Сообщений: 68
10.06.2010, 19:37  [ТС] 5
А Top равен Top+34...
Это смотря в какой теме оформления. Смотрите скриншот. Как здесь видно в Aero может и +34, а в классической явно меньше. Ну конечно можно вымерить это расстояние для classic, xp и aero basic и aero, но есть и другие темы от сторонних программ, а некоторые даже меняют масштаб экрана, например 125%, тогда заголовок увеличиться на 25% и значит опять всё придётся пересчитывать, да надо ещё и знать как проверить какой масштаб и многое др......
0
Изображения
 
leejack
190 / 177 / 37
Регистрация: 19.01.2010
Сообщений: 606
Записей в блоге: 1
10.06.2010, 20:10 6
uh-aleks, тогда вот так
Delphi
1
2
3
4
Vremenno:=Form1.ClientHeight;
Form1.ClientHeight:=0;
s:=Form1.Height;
Form1.ClientHeight:=Vremenno
Как теперь?
0
uh-aleks
6 / 6 / 0
Регистрация: 02.01.2010
Сообщений: 68
10.06.2010, 20:18  [ТС] 7
Что-то я не понимаю. Зачем переменная s, если она не используется? Итогом этого кода ничего не будет, только лишь форма мигнёт.
0
leejack
190 / 177 / 37
Регистрация: 19.01.2010
Сообщений: 606
Записей в блоге: 1
10.06.2010, 20:25 8
uh-aleks, Да ну?...проверь сам
Напиши после
Delphi
1
ShowMessage(IntToStr(s))
s просто переменная в которую запишется размер верхней части...

А если написать это все в обработчике событий при создании формы так вообще ништяк будет...И мигания никто не увидет...
Можешь даже тему по изменять...
0
uh-aleks
6 / 6 / 0
Регистрация: 02.01.2010
Сообщений: 68
10.06.2010, 20:31  [ТС] 9
Да это понятно она не пустая, но как дальше её использовать? Ты наверно скажешь что нужно вычесть из Height ClientHeight и получить высоту заголовка это и есть s. Но получиться не только заголовок, но и + нижняя рамка, ну конечно и её вычесть. А сколько она? Если померять, то опять получится та же история - у каждой темы своя ширина.
0
leejack
190 / 177 / 37
Регистрация: 19.01.2010
Сообщений: 606
Записей в блоге: 1
10.06.2010, 20:32 10
Блин так тебе, для чего надо?)) Я уже не знаю прям, что и предложить
0
uh-aleks
6 / 6 / 0
Регистрация: 02.01.2010
Сообщений: 68
10.06.2010, 20:50  [ТС] 11
Мне нужны совершенно точные координаты этой точки, для того чтобы использовать метод Popup(x, y) для PopupMenu, а эти координаты отсчитываются именно от этой точки. А погрешность даже в 2 пикселя уже заметна и недопустима.

Добавлено через 12 минут
а эти координаты отсчитываются именно от этой точки.
Исправляю. Здесь как раз другая точка, которая уже выше заголовка.
0
leejack
190 / 177 / 37
Регистрация: 19.01.2010
Сообщений: 606
Записей в блоге: 1
10.06.2010, 20:52 12
Так проверь а я по Y правильно координату расчитывал? Точнее верхней части формы
0
uh-aleks
6 / 6 / 0
Регистрация: 02.01.2010
Сообщений: 68
10.06.2010, 20:59  [ТС] 13
Так как у тебя написано я в первую очередь пробовал, но я же говорю результат получается Заголовок + нижняя рамка, а нужен только заголовок.
0
leejack
190 / 177 / 37
Регистрация: 19.01.2010
Сообщений: 606
Записей в блоге: 1
10.06.2010, 21:04 14
Так нижняя рамка равна тем, что слева и справа?
Эврика реализуешь надеюсь сам....
В коде сначала замеряешь значение ClientWidth
Потом изменяешь BorderStyle на bsNone и потом измеряешь опять ClientWidth
Разница деленая на 2 будет ширина нижней и боковых рамок...))) Дальше сам хотя, если хочешь могу написать...Универсальную, чтобы для всех подходила...
1
uh-aleks
6 / 6 / 0
Регистрация: 02.01.2010
Сообщений: 68
10.06.2010, 21:43  [ТС] 15
Так нижняя рамка равна тем, что слева и справа?
Ты прав. Как я сразу то про это не догадался. Код получается не сложный, я сам позже выложу. Мало ли кому понадобиться. А тебе спасибо

Добавлено через 30 минут
Вот таким образом можно получить координаты левого верхнего угла рабочей области формы на экране
Delphi
1
2
3
4
5
6
7
8
9
10
11
var HeightBorder, HeightCaption: byte;
x, y: word;
begin
// Высота рамки
HeightBorder := (Width-ClientWidth)div 2;
// Высота заголовка
HeightCaption := Height-ClientHeight-HeightBorder;
// Положение нужной точки
x := Left+HeightBorder;
y := Top+HeightCaption;
end;
0
gvprostov
0 / 0 / 0
Регистрация: 18.01.2016
Сообщений: 7
18.01.2016, 17:07 16
Спасибо большое создателю данной темы и всем, кто принимал участие! В итоге у меня получились Отакие функции:
Delphi
1
2
3
// Универсальные функции определения координат левого верхнего угла клиентской области окна.
function FormClientLeft(aForm:TForm):Integer; begin result:=aForm.Left+(aForm.Width-aForm.ClientWidth) div 2; end;
function FormClientTop(aForm:TForm):Integer; begin result:=aForm.Top+aForm.Height-aForm.ClientHeight-(aForm.Width-aForm.ClientWidth) div 2; end;
)))
0
DenNik
Непрофессионал
1801 / 1385 / 307
Регистрация: 26.07.2011
Сообщений: 7,823
18.01.2016, 17:30 17
использовать функцию ClientToScreen, которая заданную точку на КЛИЕНТСКОЙ области формы переводит в абсолютные координаты экрана. Код для демонстрации и скрины с разными темами оформления. в коде форма устанавливается в координаты 0;0 и затем отображаются координаты КЛИЕНТСКОЙ точки 0;0
Delphi
1
2
3
4
5
6
7
8
9
procedure TForm1.Button1Click(Sender: TObject);
var
  p: TPoint;
begin
  Top:= 0;
  Left:= 0;
  P:= ClientToScreen(Point(0,0));
  Label1.Caption:= 'x = ' + IntToStr(P.X) + '; y = ' + IntToStr(P.Y);
end;
Определение позиции формы
Определение позиции формы
0
18.01.2016, 17:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.01.2016, 17:30

Изменение позиции изображения
В общем интересует такой вопрос. Есть много изображений на форме, и...

Перенос позиции ввода
Вот у меня такая проблема, после проверки счётчиком децимального сепаратора и...

Передача имени формы в процедуру и в процедуре вызов метода объекта формы
Есть несколько форм: FrmMain, Frm2, Frm3. На каждой форме есть RichEdit под...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru