В Delphi как назначить значения свойств компонента перед созданием главной формы приложения? - PullRequest
0 голосов
/ 14 сентября 2011

Компонент FormSize TMS сохраняет размер и положение aForm в файле .ini.Путь этого файла хранится в свойстве компонента SaveName.Я хотел бы назначить FormSize.SaveName для файла в папке AppData пользователя.Я могу найти путь AppData в моем исходном коде.

Кто-нибудь знает, где (в моем коде) я назначаю путь AppData для FormSize.SaveName?Я думаю, что компонент FormSize создан и инициализирован SaveName по умолчанию, ДО создания aForm.Другими словами, FormSize загружает файл конфигурации ДО запуска событий FormCreate aForm;присвоение значения FormSize.SaveName во время aForm.FormCreate слишком поздно.

Спасибо, как всегда.

Ответы [ 3 ]

2 голосов
/ 15 сентября 2011

Корректировка формы выполняется в методе Loaded TFormSize, а не при изменении свойства SaveName (хотя оно было прочитано из DFM ранее).

Если вы установите для свойств SavePosition и SaveSize значение false во время разработки, во время выполнения ничего не будет загружено. В этом случае вы можете вручную загрузить и сохранить настройки в удобном месте кода, позвонив по номеру LoadFormSettings и SaveFormSettings.

.
1 голос
/ 15 сентября 2011

Я ожидаю, что SaveName будет храниться в файле .dfm, поэтому его следует назначить компоненту при загрузке.

Если вы хотите определить имя сохранения в коде, вероятно, оно должно быть в начале цикла. Я только что проверил несколько возможностей:

  1. В конструкторе формы (переопределить), перед вызовом наследуемого;
  2. в конструкторе формы (переопределить), после вызова унаследованного;
  3. в обработчике формы FormCreate;
  4. в загруженной процедуре формы (переопределение), перед вызовом унаследованного и
  5. в загруженной процедуре формы (переопределение), после вызова унаследованного.

Возможности 4 и 5 работали как ожидалось . 3 и 2 ничего не сделали, а 1 вызвал AV. Так что предложение Дэвида кажется правильным.

0 голосов
/ 12 января 2015

"присвоение значения FormSize.SaveName во время aForm.FormCreate слишком поздно ".

У меня было похожее требование изменить свойство компонента, принадлежащее модулю. Стандартное событие «Создать» было слишком поздно, поскольку загруженное свойство уже действовало.

Свойства, сохраненные в DFM, присваиваются (или кэшируются) во время вызова защищенной виртуальной ReadState процедуры. Обычно кэшированные свойства активируются во время защищенного виртуального вызова на Loaded . И ReadState, и Loaded могут быть переопределены.

В моем случае я хотел убедиться, что свойство Connected TADOConnection имеет значение false в сборке выпуска. Во время разработки свойство компонента обычно истинно, учитывая потребности проектирования зависимых наборов данных.

Больно было задавать для свойства значение false перед проверкой кода для последующих сборок / развертываний. Поэтому вместо этого я переопределил метод Loaded и взломал значение потокового свойства на false.

interface

type
    TMyDataModule = class(TDataModule)
        MyAdoConnection: TADOConnection;
    protected
        procedure Loaded; override;
    end;

implementation

type
  TADOConnectionHack = class(TADOConnection) end;

procedure TMyDataModule.Loaded;
begin
  TADOConnectionHack(MyAdoConnection).StreamedConnected := False;
  inherited Loaded;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...