Open gsbelarus opened 1 year ago
А почему мы вручную вызываем этот код для нескольких только классов? Что мешает его вызвать один раз на уровне TCreatableForm?
Я перенес его в procedure TgdcCreateableForm.SetComponentProperties
я вижу что перенесли. вопрос в том, почему не вызвать этот код на уровне TgdcCreateableForm?
Он не для каждой формы нужен
Могут быть формы, у которых свои специфические свойства
тут явно ошибка. вы создали объект типа TFornt и тут же потеряли его, потому что поверх переписали:
F := TFont.Create;
F := TFont(GetObjectProp(TComponent(Components[I]), 'Font', TFont));
F.Name := 'Tahoma';
SetObjectProp(TComponent(Components[I]), PropInfo, F);
Я объекту TFont присвоил все те же свойства, что и были у загружаемого. Потом поменял только Name, остальные свойства не изменились (Style, Hieght и т.п.) и переприсвоил этот TFont исходному. Все свойства у него останутся теми же кроме Name.
F := TFont.Create;
^^^^^^^^^^^^
создан объект, ссылка сохранена в переменной F
F := TFont(GetObjectProp(TComponent(Components[I]), 'Font', TFont));
^^^^^^^^^^^^
в переменную F записана ссылка на другой объект. тот объект который был создан ранее навсегда останется в оперативной памяти!!!
F.Name := 'Tahoma';
SetObjectProp(TComponent(Components[I]), PropInfo, F);
что вообще мешает вам написать так:
F := TFont(GetObjectProp(TComponent(Components[I]), 'Font', TFont));
if F is TFont then
TFont(F).Name := 'Tahoma';
или вы не понимаете как в памяти располагаются объекты и что хранит переменная типа объект?
Вы правы. Косяк. Поправил
напишите так, как я показал выше!
в моем случае, если в компоненте встретится свойство названное 'Font', но оно будет другого типа, то код отработает корректно. в вашем случае -- кинет ошибку Access Violation!
F: TObject;
...
F := GetObjectProp(TComponent(Components[I]), 'Font', TFont));
if F is TFont then
TFont(F).Name := 'Tahoma';
как вы поняли что именно в эти формы надо добавить обработку, а в остальные не надо? по какому критерию?
настройте микрофон. надо голосом переговорить.
по-прежнему нет ответа почему нельзя этот код вызвать вообще для всех наследников TgdcCreateableForm? Какую именно проблему решает этот код? Можно ли ее решить по другому? Как были определены те формы, куда добавлен вызов этой процедуры?
1. Почему нельзя этот код вызвать вообще для всех наследников TgdcCreateableForm?
После начала тестирования появился первый баг о том, что слетают предустановленные изначально настройки компонентов формы. Я пытался исполнит п.3. Прогуглил весь интернет и по конкретно Delphi 7, и по каждой компоненте в частности. Что-то пишут про VCL Style, про WindowsXP manifest, но как это применить в конкретном приложении, не нашел. По крайней мере дл D7 (для Delphi от 10 вроде как есть возможности).
2. Какую именно проблему решает этот код?
П.1. Тестировщики жалуются на измененный, непривычный глазу интерфейс форм. Шрифт не тот, закладки не того цвета, едиты не вдавленные и т.п.
3. Можно ли ее решить по другому?
Пытался найти какое-нибудь более простое решение (п.1)
4. Как были определены те формы?
Формы (базовые) определялись после возникновения багов у коллег по результатам тестирования.
5. Куда добавлен вызов этой процедуры?
Вызов добавлялся соответственно классу, на который жаловались коллеги (Tgdc_dlgAttrUserDefined, Tgdc_dlgUserComplexDocument, Tgdc_frmAttrUserDefined...)
_Я побоялся сразу переносить этот метод в базовый класс из-за того, что не был уверен в том, что эти настройки будут актуальны для всех наследников. Еще было сомнение в потере производительнсти, если для каждой открываемой формы будут перекрываться свойства ее компонент. Посмотрел сейчас. Наследников TgdcCreateableForm всего 22 (конечно не считая наследников наследников). В любом случае в проекте их сравниетельно меньше, чем от TForm, а с TForm как раз все в поряде.
Сделаю вызов для всех наследников TgdcCreateableForm, будем дальше отслеживать замечания коллег по этому._
Сделал
в нескольких местах используется один и тот же код. надо оформить его в функцию. и меня смущает как этот код перекрывает шрифты это для чего сделано?