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

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

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

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

Сохранение позиции 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 / 1
Регистрация: 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 / 1
Регистрация: 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 / 1
Регистрация: 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 / 1
Регистрация: 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 / 1
Регистрация: 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 / 1
Регистрация: 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
Непрофессионал
1783 / 1286 / 304
Регистрация: 26.07.2011
Сообщений: 7,532
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