Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Не изменяется размер наследуемой формы


Автор: TechnoMag 2.12.2014, 17:42
При выходе из программы сохраняются актуальные размеры и позиция формы.
При входе, эти данные читаются, но только форма TMainForm не изменяет свои размеры.

Код

TMyCustomForm = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    FWindowMaximized: boolean;
    FWindowTop: integer;
    FWindowLeft: integer;
    FWindowWidth: integer;
    FWindowHeight: integer;
    procedure SetWindowPosition;
    procedure Load;
    procedure Save;
  public
    { Public declarations }
     procedure DoCreate; override;
    property WindowTop: integer read FWindowTop write FWindowTop;
    property WindowLeft: integer read FWindowLeft write FWindowLeft;
    property WindowWidth: integer read FWindowWidth write FWindowWidth;
    property WindowHeight: integer read FWindowHeight write FWindowHeight;
    property WindowMaximized: boolean read FWindowMaximized write FWindowMaximized;
  end;

//var
//  MyCustomForm: TMyCustomForm;

implementation

{$R *.dfm}

procedure TMyCustomForm.FormCreate(Sender: TObject);
begin
  inherited;
  Load;
  if WindowMaximized then
    self.WindowState := wsMaximized
  else
    SetWindowPosition;
end;

procedure TMyCustomForm.FormDestroy(Sender: TObject);
begin
  Save;
  inherited;
end;

procedure TMyCustomForm.Load;
var
  Config: TMemIniFile;
begin
  Config := TMemIniFile.Create(ExtractFilePath(ParamStr(0)) + '\config.ini');
  try
    WindowMaximized := Config.ReadBool(self.ClassName, 'Maximized', false);
    WindowTop := Config.ReadInteger(self.ClassName, 'Top', 10);
    WindowLeft := Config.ReadInteger(self.ClassName, 'Left', 10);
    WindowWidth := Config.ReadInteger(self.ClassName, 'Width', 1024);
    WindowHeight := Config.ReadInteger(self.ClassName, 'Height', 768);
  finally
    Config.Free;
  end;
end;

procedure TMyCustomForm.DoCreate;
begin
  inherited;
end;

procedure TMyCustomForm.Save;
var
  Config: TMemIniFile;
begin
  Config := TMemIniFile.Create(ExtractFilePath(ParamStr(0)) + '\config.ini');
  try
    Config.WriteBool(self.ClassName, 'Maximized', WindowMaximized);
    Config.WriteInteger(self.ClassName, 'Top', Top);
    Config.WriteInteger(self.ClassName, 'Left', Left);
    Config.WriteInteger(self.ClassName, 'Width', Width);
    Config.WriteInteger(self.ClassName, 'Height', Height);
    Config.UpdateFile;
  finally
    Config.Free;
  end;
end;

procedure TMyCustomForm.SetWindowPosition;
begin
  Top := WindowTop;
  Left := WindowLeft;
  Width := WindowWidth;
  Height := WindowHeight;
end;

end.


TMainForm = class(TMyCustomForm)
// ....
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  inherited;
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  inherited;
end;

Автор: Poseidon 3.12.2014, 09:30
Файл смотрел? Все туда нормально сохранилось? FormCreate срабатывает при запуске? В Load считывание нормально происходит? Тут под отладкой надо смотреть что не так делается. Скинь проектом. На первый взгляд вроди все нормально должно быть.

Автор: TechnoMag 3.12.2014, 10:08
Все смотрел,  сохранение происходит нормально, FormCreate отрабатывает, Load считывает. При присвоении считанных с файла размеров ничего не происходит.

Автор: БелАмор 3.12.2014, 11:27
Вчера вечером сделал по вашему коду тестовый проект.
Всё нормально работает.
Насколько я понимаю, проблема в назначении событий.
Выложите здесь dfm на обе формы.

А вообще, события, назначаемые в инспекторе, лучше не использовать в формах-предках, поскольку на всю цепочку наследников хранится только один указатель на процедуру-обработчик, кроме того, есть ещё куча всяких нюансов.
В вашем случае лучше использовать конструкторы и деструкторы вместо FormCreate и FormDestroy.
Но это потом, сначала надо разобраться с текущим кодом.

Update
Конечно-же, не pdf, а dfm.
Исправил.

Автор: БелАмор 3.12.2014, 12:31
Загляните ещё сюда:
http://delphikingdom.com/asp/viewitem.asp?catalogid=665

Автор: TechnoMag 3.12.2014, 14:03
Спасибо. Проблема действительно крылась в событиях, и в свойстве форм Position.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)