Поиск сообщества
Показаны результаты для тегов 'RTTI'.
Найдено: 3 результата
-
rtti Записать значение в поле через RTTI
rareMax опубликовал вопрос в Вопросы по языку Object Pascal и RTL
(не знаю даже в какой ветке задать вопрос) нужно с помощью rtti создать класс с предустановленными значениями. Значения берутся из атрибута. Все работает кажется нормально ровно до момента когда нужно внести значение в поле. Находит нужное свойство и получает значение атрибута верно. А вот запись не работает. Подскажите где не так делаю? program DemoGenerator; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, System.Rtti; Type // базовый аттрибут DemoDataAttribute = class(TCustomAttribute) private FGenerator: String; public constructor Create(Generator: String); published property Generator: string read FGenerator write FGenerator; end; // Обслуживаемый класс TSomeType = Class private fPhone: string; published [DemoData('+1800764328')] property Phone: string read fPhone write fPhone; End; // Управляющий класс TMegaSuperClass = Class Function Go<T: Class, constructor>: T; End; Procedure Test; var LMsc: TMegaSuperClass; New: TSomeType; Begin LMsc := TMegaSuperClass.Create; try New := LMsc.Go<TSomeType>; Writeln('New.Phone: ' + New.Phone); finally LMsc.Free; // New.Free; end; End; { DemoDataAttribute } constructor DemoDataAttribute.Create(Generator: String); begin FGenerator := Generator; end; { TMegaSuperClass } function TMegaSuperClass.Go<T>: T; var LContext: TRttiContext; LClass: TRttiInstanceType; LProp: TRttiProperty; LAttr: TCustomAttribute; LField: TRttiField; begin // Инициализируем РТТИ LContext := TRttiContext.Create; LClass := LContext.GetType(T) as TRttiInstanceType; Writeln('LClass: ' + LClass.ToString); // Результат Result := T.Create; for LProp in LClass.GetProperties do begin Writeln('LProp: ' + LProp.ToString); for LAttr in LProp.GetAttributes do begin Writeln('LAttr: ' + LAttr.ToString); if LAttr is DemoDataAttribute then Begin Writeln('Attr value: ' + DemoDataAttribute(LAttr).Generator); // Как записать значение? LProp.SetValue(@Result, DemoDataAttribute(LAttr).Generator); End; end; end; end; begin try { TODO -oUser -cConsole Main : Insert code here } Test; Readln; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. Результат консоли: -
Здравствуйте всем! Воодушевившись статьей Ярослава про подход "Control-Model-Presentation" применяю ,как в примере автозаполнение ,но передаю данные в StringList вопрос как правильно уничтожить данные чтобы освободить память от списка и чтобы память не текла //------------------------------------------------------Нужно ли явно разрушать объект? C учетом того что каждое новое заполнение ввода порождает новый список для автозаполнения Edit1.Model.Data['hint_list'].AsType<TSTringList>.Clear; Edit1.Model.Data['hint_list'].AsType<TSTringList>.DisposeOf; //? //--------------------------------------------------------------------------обнулять данные-> чтобы можно было проверить Edit1.Model.Data['hint_list'].IsEmpty Edit1.Model.Data['hint_list']:=Tvalue.Empty; или Edit1.Model.Data['hint_list'].Empty; Просьба сильно не пинать за вопрос так как после отпуска голова не варит совсем
-
Выделение вопроса от Nixon в отдельную тему, В общем, я пытаюсь на основании этой статьи, сделать автоматический пересчет высоты объекта, в зависимости от содержания с учетом изображений и т.д. Для этого мне необходимо получить ширину и высоту конкретного текстового элемента в стиле. Как бы это не звучало странно, но ListBoxItem.StylesData['text.width'].asInteger постоянно возвращает нуль. Естественно пытаюсь получить размеры после того, как ListBoxItem создан и размещен на родителе. И ListBoxItem.StylesData['text.text'].asString не возвращает текст. Это может быть связано с тем что text это TActiveStyleTextObject ? RAD Studio XE6