Форум по 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,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

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

Код:
//============================================================================== 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, время: 14:41.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter