Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.02.2019, 22:40
Alex7 Alex7 вне форума
Новичок
 
Регистрация: 18.09.2018
Сообщения: 62
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Определение позиции формы в Delphi

Здравствуйте, подскажите пожалуйста как в Deldhi можно определить позиции формы Top и Left на экране после перетаскивания окна для последующего сохранения значений в .ini ?
Ответить с цитированием
  #2  
Старый 16.02.2019, 21:17
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну так и определять. Значения в св-вах Left и Top отображают положение формы относительно десктопа. Только там есть один момент. Надо еще отслеживать:
1. Не является ли форма максимизированной. Тогда надо сохранить именно статус, а координаты не сохранять, т.к. они будут на весь монитор (0,0).
2. Проверять, не "вылетело" ли окно за десктоп - в случае многомониторной конфигурации, когда один из мониторов не включен.
Ответить с цитированием
  #3  
Старый 17.02.2019, 21:19
Аватар для kuzduk
kuzduk kuzduk вне форума
Прохожий
 
Регистрация: 17.02.2012
Сообщения: 38
Репутация: 10
По умолчанию

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
//============================================================================== ini Load
function Form_iniLoad(Form: TForm; SectionName: string = ''; MaxSize: Boolean = False): Boolean;
{
Читаем настройки из ini файла: положение XY формы на экране и её размеры WH
Условие для правильной работы: в IDE форма должнга быть WindowsState = wsNormal
MaxSize - если нет файла ini или нет секции в ini, то делаем WH XY по центру экрана, а если MaxSize = true то максимизируем форму
}
var
  ini: TIniFile;
  iniPath: string;
  WP: TWindowPlacement;
 
begin
 
Result := False;
 
 
if SectionName = '' then SectionName := Form.Name;
 
iniPath := ExtractFilePath(Application.ExeName) + _setini;
 
if FileExists(iniPath)
then
begin
  ini := TiniFile.Create(iniPath);
  try
        if ini.SectionExists(SectionName)
        then
        begin
              Form.Position := poDesigned;
 
              Form.Top     := ini.ReadInteger( SectionName, 'Top'    , 100 );
              Form.Left    := ini.ReadInteger( SectionName, 'Left'   , 100 );
              Form.Height  := ini.ReadInteger( SectionName, 'Height' , Form.Height );
              Form.Width   := ini.ReadInteger( SectionName, 'Width'  , Form.Width );
 
              Form_TLWH_Normalize(Form);
 
              if ini.ReadBool(SectionName, 'Maximized', False)
              then Form.WindowState := wsMaximized;
  //            else Form.WindowState := wsNormal;
 
              Result := True;
        end;
 
  finally
        ini.Free;
  end;
end;
 
 
 
//Если нет файла ini или нет секции в ini
if not Result
then
begin
 
  //По центру экрана
  Form.Position := poScreenCenter;
  Form.WindowState := wsNormal;
  Form_TLWH_Normalize(Form);
 
 
  //Максимизируем + при нормализации по центру экрана
  if MaxSize
  then
  begin
    GetWindowPlacement(Form.Handle, @WP);
    WP.rcNormalPosition.Top    := Form.Top;
    WP.rcNormalPosition.Left   := Form.Left;
    WP.rcNormalPosition.Bottom := Form.Top  + Form.Height;
    WP.rcNormalPosition.Right  := Form.Left + Form.Width;
 
    Form.WindowState := wsMaximized;
  end;
 
end;
 
 
end;
 
 
 
//============================================================================== ini Save
procedure Form_iniSave(Form: TForm; SectionName: string = '');
//Сохраняем настройки в ini файл: положение формы XY на экране и её размеры WH
var
  ini : TIniFile;
  d: TWindowPlacement;
 
begin
 
if SectionName = '' then SectionName := Form.Name;
 
ini := TiniFile.Create( Path_App + _setini );
 
try
    ini.WriteBool( SectionName, 'Maximized', Form.WindowState = wsMaximized );
 
 
    GetWindowPlacement(Form.Handle, @d);
 
    ini.WriteInteger( SectionName, 'Top'    , d.rcNormalPosition.Top    );
    ini.WriteInteger( SectionName, 'Left'   , d.rcNormalPosition.Left   );
    ini.WriteInteger( SectionName, 'Height' , d.rcNormalPosition.Bottom - d.rcNormalPosition.Top   );
    ini.WriteInteger( SectionName, 'Width'  , d.rcNormalPosition.Right  - d.rcNormalPosition.Left  );
 
 
 
finally
      ini.Free;
end;
 
end;
 
 
 
 
//============================================================================== TLWH Normalize
procedure Form_TLWH_Normalize(Form: TForm);
//Функция нормализации положения и размера окна:
begin
 
//если размер окна программы больше размера экрана, то уменьшаем форму:
if Form.Height > Screen.Height then Form.Height := Screen.Height;
if Form.Width  > Screen.Width  then Form.Width  := Screen.Width ;
 
//если окно программы выходит за границы экрана, то принудительно сдвигаем форму:
if Form.Top  > Screen.Height - Form.Height then Form.Top  := Screen.Height - Form.Height;
if Form.Top  < 0 then Form.Top := 0;
 
if Form.Left > Screen.Width  - Form.Width then Form.Left := Screen.Width - Form.Width;
if Form.Left < 0 then Form.Left := 0;
 
end;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:15.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025