powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / статус формы и ее координаты
10 сообщений из 10, страница 1 из 1
статус формы и ее координаты
    #39591058
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую, форумчане!

Параметры открываемых клиентом форм приложения сохраняю и восстанавливаю с помощью компоненты. Сколько лет работал, бед не знал, и тут решил реализовать в приложении SDI и MDI на выбор юзера, и тут понеслось... :) посыпались давнишние недоработки:

В дизайнере формы указываю WindowState = wsMaximized.
А при открытии формы в процедурах восстановления размеров из прошлого сеанса работы с формой выставляю:

WindowState := wsNormal;
setBounds(любые положения и размеры);

После SetBounds свойство WindowState выставилось обратно в wsMaximized. Почему, как этого избежать?

Если сделаю сначала SetBounds, а потом WindowState = wsNormal, то в итоге получаю окно с координатами, выставленными в дизайнере формы, а мои установки форма напрочь проигнорировала.

Ну, я-то решил проблему с помощью магического затыка: стараюсь в дизайнере wsMaximized не ставить, а если надо, то руками это делаю. Но это затык, а не решение. Хотелось бы, чтобы когда мне надо, чтобы приложение изначально включалось в режиме Maximized, а это касается главной формы приложения, не усложнять решение, а просто в дизайнере это указывать, а восстановление формы уже от этого бы и плясало.

Вторая проблема, и что-то показывает, что она связана с первой очень тесно:

окно когда-то было в режиме wsNormal с такими-то координатами. Потом юзер перевел его в режим wsMaximized и закрыл окно, координаты, ну, то есть Left,Top,Width и Height сбились, они показывали столько, сколько окно имело в максимизированном размере. Но те, что были в Normal, мы сохранили ранее, допустим. Когда открываем окно заново, мы восстановили режим Maximized, но хотим, чтобы при переводе в Normal юзер получил эти сохраненные координаты. Как задать окну эти координаты при создании окна? Логично было бы, что при создании окна сначала выставить координаты в нормальные, а потом уже сделать максимизированным размер окна. Хрена, после того, как юзер переведет окно в Normal, он получит опять дефолтные координаты.

И тут вообще непонятно вот что: берем окно, вот его координаты имеем в свойствах Left,Top,Width,Height, делаем ему wsMaximized, теперь значения этих свойств сбились, и те, что были в режиме Normal - утеряны, по крайней мере я не нашел никаких переменных и свойств в форме, отвечающих за их хранение. Откуда тогда форма берет их, когда восстанавливает при переводе окна в wsNormal?

Заранее спасибо всем за ответы!
...
Рейтинг: 0 / 0
статус формы и ее координаты
    #39591064
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
V.BorzovПочему, как этого избежать?

Неверно выбрана точка вызова процедуры восстановления размеров. Накатывание значений из
родительской формы происходит уже после нее. Ты ведь в курсе, что MDI формы не могут быть
максимизированы по отдельности, только все вместе?.. И, конечно, знаешь, что сам MDI
интерфейс был объявлен нерекомендуемым к использованию более десяти лет назад.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
статус формы и ее координаты
    #39591067
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, еще забыл: хитрые люди как-то делают в SDI, чтобы при максимизации окошек они не перекрывали собой главное. И даже я в своих экспериментах так сам делал, помню, когда-то, лет 18 назад... Но потом ушел безоговорочно в MDI, и теперь всё забыл... А SVN тогда еще не пользовался... :) Теперь сижу и туплю жестко, начинаю думать о пенсии....
...
Рейтинг: 0 / 0
статус формы и ее координаты
    #39591071
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНеверно выбрана точка вызова процедуры восстановления размеров. Накатывание значений из
родительской формы происходит уже после нее.

Вообще компонента моя в Loaded делает, но пробовал то же самое повторять в OnCreate - результаты, вроде, те же. Дальше что унас, OnShow?

Ты ведь в курсе, что MDI формы не могут быть
максимизированы по отдельности, только все вместе?.. И, конечно, знаешь, что сам MDI
интерфейс был объявлен нерекомендуемым к использованию более десяти лет назад.

А я всегда, как что-то сделаю, так выясняется, что это что-то уже давно устарело. Написал программу на парадоксе под BDE, так всё никак ее на фаерберд не переведу уже сколько лет ))) А при переводе воспользовался FibPlus, а он тоже уже устарел... Щас решил опционально вернуться к SDI, ибо начиналось приложение с него ровно 20 лет назад....
...
Рейтинг: 0 / 0
статус формы и ее координаты
    #39591077
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор. Ты ведь в курсе, что MDI формы не могут быть
максимизированы по отдельности, только все вместе?.
Тут меня больше заинтересовала главная форма приложения, а также возможность делать это для всех остальных форм SDI-приложения. Поэтому в MDI вооще не парился с Maximized, а в главной форме всегда выставлял максимизацию, и вот один клиент заявил, что ему так неудобно, что он хочет, чтобы приложение восстанавливало свой размер.
...
Рейтинг: 0 / 0
статус формы и ее координаты
    #39591169
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
V.Borzovхитрые люди как-то делают в SDI, чтобы при максимизации окошек они не перекрывали собой
главное

RTFM WM_GETMINMAXINFO
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
статус формы и ее координаты
    #39591208
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
V.BorzovDimitry SibiryakovНеверно выбрана точка вызова процедуры восстановления размеров. Накатывание значений из
родительской формы происходит уже после нее.

Вообще компонента моя в Loaded делает, но пробовал то же самое повторять в OnCreate - результаты, вроде, те же. Дальше что унас, OnShow?
Совершенно верно. Читать можно где угодно, а устанавливать - в OnShow. Причём помимо размеров в нормальном состоянии ( rcNormalPosition ) вне зависимости от текущего, нужно сохранять и состояние окна ( showCmd ). В своих проектах для этого использую GetWindowPlacement
При восстановлении сначала устанавливаются размеры формы, а потом её состояние в зависимости от showCmd
...
Рейтинг: 0 / 0
статус формы и ее координаты
    #39591242
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
V.Borzov,

я у себя TJvFormStorage. Правда, конкретно с mdi child не использовал. С остальными всем особых вопросов не видел. Только что жедаи свежие стоит ставить.
...
Рейтинг: 0 / 0
статус формы и ее координаты
    #39591266
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
V.BorzovВ дизайнере формы указываю WindowState = wsMaximized.
А при открытии формы в процедурах восстановления размеров из прошлого сеанса работы с формой выставляю:

Я обычно в дизайнере всегда ставлю wsNormal, а потом при необходимости в OnShow делаю `WindowState = wsMaximized`.
При этом если в реестре сохраняются размеры окна, то сначала устанавливаем их, а потом уже WindowState, тогда оно при восстановлении само встаёт куда надо.

Всё вместе это выглядит как-то так
Код: pascal
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.
type
  TWinPosition = packed record
    case Byte of
      0: (Width, Left, Height, Top: Word);
      1: (HPos, VPos: Cardinal);
  end;

procedure TfmMainForm.FormShow(Sender: TObject);
var
  TempValue: DWORD;
  WinPos: TWinPosition;
begin
  with TSimpleRegistry.Create(SBoxRegSettings, KEY_READ, False, False) do try
    WinPos.Left := (Screen.Width - Width) div 2;
    WinPos.HPos := GetDWord('HPosition', WinPos.Left shl 16 or Width and $FFFF);
    if WinPos.Left + WinPos.Width <= Screen.Width then begin
      Left := WinPos.Left;
      Width := WinPos.Width;
    end;
    WinPos.Top := (Screen.Height - Height) div 2;
    WinPos.VPos := GetDWord('VPosition', WinPos.Top shl 16 or Height and $FFFF);
    if WinPos.Top + WinPos.Height <= Screen.Height then begin
      Top := WinPos.Top;
      Height := WinPos.Height;
    end;
    TempValue := GetDWord('WindowsState');
    if TempValue <= DWord(High(TWindowState)) then
      WindowState := TWindowState(TempValue);
    TempValue := GetDWord('Splitter', lbGroups.Width);
    if TempValue <= DWORD(ClientWidth - splVertical.Width - MIN_RECORDS_WIDTH) then
      lbGroups.Width := TempValue;
  finally
    FPosLoaded := True;
    Free;
  end;
end;

...
Рейтинг: 0 / 0
статус формы и ее координаты
    #39591319
V.Borzov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо, дело пошло!
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / статус формы и ее координаты
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]