Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2015, 03:26   #1
le7o
Форумчанин
 
Регистрация: 19.05.2011
Сообщений: 116
По умолчанию Сохранение положения и размеров создаваемых форм проекта

В общем ситуация такая проект с БД.
При запуске автосоздаются только DataModule и главная форма form1

Все остальные формы вызываются по следующему коду или аналогичному:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  form2 : TForm2;
begin
  form2:= TForm2.Create(nil);
  form2.ShowModal;
  form2.free;
end;
В DataModule создал две процедуры для сохранения и загрузки параметров:
Код:
...
  public
    procedure SaveFormState(aForm: TForm);
    procedure LoadFormState(aForm: TForm);
    { Public declarations }
  end;
 
var
  DataModule4: TDataModule4;
  ini : TIniFile;
  pathINI : string;
 
implementation
 
{%CLASSGROUP 'Vcl.Controls.TControl'}
 
{$R *.dfm}
 
{ TDataModule4 }
 
procedure TDataModule4.DataModuleCreate(Sender: TObject);
begin
  pathINI:=extractfilepath(application.ExeName)+'\example.ini';
end;
 
procedure TDataModule4.LoadFormState(aForm: TForm);
begin
try
  ini := TIniFile.Create(pathINI);
  with aForm do
  begin
      //Left := ini.ReadInteger(aForm.Name, 'Left', Left);
      //Top := ini.ReadInteger(aForm.Name, 'Top', Top);
      Width := ini.ReadInteger(aForm.Name, 'Width', Width);
      Height := ini.ReadInteger(aForm.Name, 'Height', Height);
    end;
  FreeAndNil(ini);
except
  ShowMessage('Не удалось добавить должность');
end;
end;
 
procedure TDataModule4.SaveFormState(aForm: TForm);
begin
  ini := TIniFile.Create(pathINI);
  with aForm do
  begin
    //ini.WriteInteger(aForm.Name, 'Left', Left);
    //ini.WriteInteger(aForm.Name, 'Top', Top);
    ini.WriteInteger(aForm.Name, 'Height', Height);
    ini.WriteInteger(aForm.Name, 'Width', Width);
  end;
  FreeAndNil(ini);
end;
 
end.
Но вышеуказанный код работает только на автосоздаваемых формах, на Form2, которую я создаю уже в процессе работы сыпятся ошибки...

Как сохранить настройки в ini файле для не автосозданных форм?
Во вложении набросок для тест и для воспроизведения ошибки.
Вложения
Тип файла: zip ini.zip (77.3 Кб, 8 просмотров)
le7o вне форума Ответить с цитированием
Старый 23.11.2015, 10:19   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
уже в процессе работы сыпятся ошибки..
Стоит ли говорить "Ошибки в студию"? Хм... Совпаднуть? - не думаю )))
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.11.2015, 11:10   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Код:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
///DataModule4.SaveFormState(Form2);
DataModule4.SaveFormState(SELF);
end;
Аналогично и для LoadFromState.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 23.11.2015 в 11:14.
evg_m на форуме Ответить с цитированием
Старый 23.11.2015, 11:13   #4
le7o
Форумчанин
 
Регистрация: 19.05.2011
Сообщений: 116
По умолчанию

То что нужно спасибо)))

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
///DataModule4.SaveFormState(Form2);
DataModule4.SaveFormState(SELF);
end;
le7o вне форума Ответить с цитированием
Старый 23.11.2015, 11:16   #5
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,883
По умолчанию

Цитата:
Сообщение от le7o Посмотреть сообщение
Но вышеуказанный код работает только на автосоздаваемых формах, на Form2, которую я создаю уже в процессе работы сыпятся ошибки...

Как сохранить настройки в ini файле для не автосозданных форм?
Во вложении набросок для тест и для воспроизведения ошибки.
Что такое Form2 ?
Пока не уяснишь для себя этот вопрос так и будут сыпЯться ошибки!

Грамотный код:
Код:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
DataModule4.SaveFormState(Self);  
end;
northener вне форума Ответить с цитированием
Старый 23.11.2015, 11:22   #6
le7o
Форумчанин
 
Регистрация: 19.05.2011
Сообщений: 116
По умолчанию

В Unit2 глобальная переменная типа TForm.
в Unit1 локальная для процедуры кнопки, соответственно ссылались в разные места...

Или я что то не правильно понимаю?

Цитата:
Сообщение от northener Посмотреть сообщение
Что такое Form2 ?
Пока не уяснишь для себя этот вопрос так и будут сыпЯться ошибки!

Грамотный код:
Код:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
DataModule4.SaveFormState(Self);  
end;
le7o вне форума Ответить с цитированием
Старый 23.11.2015, 11:47   #7
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,883
По умолчанию

Главное это то, что та самая глобальная переменная, которую IDE автоматически подставляет в шаблон формы в общем и целом не имеет никакого отношения ни к конкретному экземпляру формы, ни тем более к классу формы. Это всего лишь глобальная переменная, в которую записывается ссылка на экземпляр формы при автоматическом её создании.
northener вне форума Ответить с цитированием
Старый 30.11.2015, 19:52   #8
le7o
Форумчанин
 
Регистрация: 19.05.2011
Сообщений: 116
По умолчанию

Еще вопрос в рамках данной темы...
Практически на всех формах проекта у меня присутствуют компоненты типа Panel, GroupBox и т.п. + Splitter для изменения размеров, и хочется эти размеры сохранить...

На данный момент сделал так для одного произвольного компонента:
Код:
procedure SaveFormState(aForm: TForm); overload; 
procedure SaveFormState(aForm: TForm; aPanel: TWinControl); overload;


procedure TDM.SaveFormState(aForm: TForm);
begin
  ini := TIniFile.Create(pathINI);
try
  with aForm do
  begin
    ini.WriteInteger(aForm.Name, 'Height', Height);  
    ini.WriteInteger(aForm.Name, 'Width', Width);     
  end;
  FreeAndNil(ini);
except
  ShowMessage('Не удалось сохранить размеры формы');
end;
end;


procedure TDM.SaveFormState(aForm: TForm; aPanel: TWinControl);
begin
ini := TIniFile.Create(pathINI);
try
  with aForm do
  begin
    ini.WriteInteger(aForm.Name, 'Height', Height);   
    ini.WriteInteger(aForm.Name, 'Width', Width);     
    ini.WriteInteger(aForm.Name, 'PanelWidth', aPanel.Width);   
  end;
  FreeAndNil(ini);
except
  ShowMessage('Не удалось сохранить размеры формы');
end;
end;
Как в процедуру сохранения передать N количество параметров - компонентов?
le7o вне форума Ответить с цитированием
Старый 01.12.2015, 09:35   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
Как в процедуру сохранения передать N количество параметров - компонентов?
передать то можно с помощью массива. (точнее открытого массива)
Код:
procedure TDM.SaveFormState(aForm: TForm; list: array of TWinControl);

dm.SaveFromstate(form2, [panel1, panel3, groupbox2, ....]);
Но вот соханить-то удастся или нет.
Код:
for j:=low(list) to high(list) do begin
  ini.WriteInteger(aform.name, 'panelwidth', list[j].width);
end;
И мы получим РОВНО ОДНУ запись для последнего.
Этот пример для того чтобы ТС мог его исправить и записать ВСЕ значения.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 01.12.2015 в 09:37.
evg_m на форуме Ответить с цитированием
Старый 01.12.2015, 11:06   #10
le7o
Форумчанин
 
Регистрация: 19.05.2011
Сообщений: 116
По умолчанию

evg_m, огромное спасибо, протестировал на паре форм все работает...

Код:
...
  public
    procedure SaveFormState(aForm: TForm); overload;
    procedure SaveFormState(aForm: TForm; List: array of TWinControl); overload;
    procedure LoadFormState(aForm: TForm); overload;
    procedure LoadFormState(aForm: TForm; List: array of TWinControl); overload;
    { Public declarations }
  end;

var
  DataModule4: TDataModule4;
  ini : TIniFile;
  pathINI : string;

implementation

{%CLASSGROUP 'Vcl.Controls.TControl'}

{$R *.dfm}

{ TDataModule4 }

procedure TDataModule4.DataModuleCreate(Sender: TObject);
begin
  pathINI:=extractfilepath(application.ExeName)+'\example.ini';
end;

procedure TDataModule4.LoadFormState(aForm: TForm);
begin
try
  ini := TIniFile.Create(pathINI);
  with aForm do
  begin
      Width := ini.ReadInteger(aForm.Name, 'Width', Width);
      Height := ini.ReadInteger(aForm.Name, 'Height', Height);
    end;
  FreeAndNil(ini);
except
  ShowMessage('Не удалось добавить должность');
end;
end;

procedure TDataModule4.SaveFormState(aForm: TForm);
begin
  ini := TIniFile.Create(pathINI);
  with aForm do
  begin
    ini.WriteInteger(aForm.Name, 'Height', Height);
    ini.WriteInteger(aForm.Name, 'Width', Width);
  end;
  FreeAndNil(ini);
end;

procedure TDataModule4.LoadFormState(aForm: TForm; List: array of TWinControl);
var
  j:integer;
begin
try
  ini := TIniFile.Create(pathINI);
  with aForm do
  begin
if Ini.SectionExists(aForm.Name) then   // если форма еще не сохранена то ни чего не делаем
      begin
      Width := ini.ReadInteger(aForm.Name, 'Width', Width);
      Height := ini.ReadInteger(aForm.Name, 'Height', Height);
      for j:=low(list) to high(list) do
      begin
        list[j].Width := ini.ReadInteger(aForm.Name, list[j].Name+'panelwidth', list[j].width);
      end;
end;
    end;
  FreeAndNil(ini);
except
  ShowMessage('Не удалось добавить должность');
end;
end;

procedure TDataModule4.SaveFormState(aForm: TForm; List: array of TWinControl);
var
j : integer;
begin
  ini := TIniFile.Create(pathINI);
  with aForm do
  begin
    ini.WriteInteger(aForm.Name, 'Height', Height);
    ini.WriteInteger(aForm.Name, 'Width', Width);
    for j:=low(list) to high(list) do
    begin
      ini.WriteInteger(aform.name, list[j].Name+'panelwidth', list[j].width);
    end;
  end;
  FreeAndNil(ini);
end;
...
le7o вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сохранение и загрузка форм LomoCoder Общие вопросы Delphi 13 28.07.2013 14:22
Отслеживание изменения положения и размеров окна RAZOR1703 Win Api 9 03.12.2011 16:43
импорт форм из проекта.как? seven123 Общие вопросы Delphi 1 23.05.2011 11:53
Определение размеров компонента и положения по хендлу Marsel737 Общие вопросы Delphi 10 03.05.2010 00:53
Сохранение положения сплиттеров в ини файле mutabor Общие вопросы Delphi 10 11.09.2009 17:23