tag:blogger.com,1999:blog-1688132520265708820.post1461274034592401256..comments2023-04-02T16:52:35.787+03:00Comments on Блог GunSmoker-а (переводы): Хак №10: получение параметров published методовGunSmokerhttp://www.blogger.com/profile/15611696588191431330noreply@blogger.comBlogger5125tag:blogger.com,1999:blog-1688132520265708820.post-15832885831768758092020-04-16T20:47:39.302+03:002020-04-16T20:47:39.302+03:00Для получения параметров методов (имена и типы) ес...Для получения параметров методов (имена и типы) есть альтернатива:<br /><br />interface<br /><br />uses TypInfo;<br /><br /> type<br /> TParamData = record<br /> Flags: TParamFlags;<br /> ParamName: ShortString;<br /> end;<br /><br /> RTTI = ^TParamData;<br /><br />implementation<br /><br />procedure GetParamEvent(Info: PTypeInfo; TS: TStrings);<br />var<br /> Data: PTypeData;<br /> P: RTTI;<br /> N: Integer;<br /> S: string;<br /> S_Type,<br /> S_Return: ^ShortString;<br />begin<br /> try<br /> if Info^.Kind<>tkMethod then<br /> begin<br /> raise Exception.Create ('Категория типа не соответствует "tkMethod"');<br /> exit;<br /> end;<br /> Data:= GetTypeData(Info);<br /> TS.Add('Имя типа : ' + Info^.Name);<br /> TS.Add('Категория типа : ' + GetEnumName(TypeInfo(TTypeKind), Integer(Info^.Kind)));<br /> TS.Add('Категория метода : '+ GetEnumName(TypeInfo (TMethodKind), Integer (Data^.MethodKind)));<br /> TS.Add('Всего параметров : ' +IntToStr(Data^.ParamCount));<br /> TS.Add('');<br /> P:= RTTI(@(Data^.ParamList));<br /> N:= 1;<br /> //<br /> while N<=Data^.ParamCount do<br /> begin<br /> //<br /> S:= '#'+IntToStr(N)+' - ';<br /> //<br /> if pfVar in P^.Flags then<br /> S:= S+'var ';<br /> //<br /> if pfConst in P^.Flags then<br /> S:= S+'const ';<br /> //<br /> if pfOut in P^.Flags then<br /> S:= S+'out ';<br /> //<br /> S:= S+P^.ParamName+' : ';<br /> //<br /> if pfArray in P^.Flags then<br /> S:= S+' array of ';<br /> //<br /> S_Type:= Pointer(Integer(P) + SizeOf(TParamFlags) + Length(P^.ParamName)+1);<br /> //<br /> S:= S+S_Type^;<br /> //<br /> TS.Add(S);<br /> //<br /> P:= RTTI(Integer(P) +SizeOf(TParamFlags) +<br /> Length(P^.ParamName)+1 +Length(S_Type^)+1);<br /> Inc(N);<br /> end;<br /> //<br /> if Data^.MethodKind = mkFunction then<br /> begin<br /> S_Return:= Pointer(P);<br /> TS.Add('Результат : ' + S_Return^);<br /> end<br /> else //<br /> begin<br /> TS.Add('Результат : Отсутствует');<br /> end;<br />end;Игорь. Днепропетровск.https://www.blogger.com/profile/12662196371858112382noreply@blogger.comtag:blogger.com,1999:blog-1688132520265708820.post-57332745244052837132019-04-04T22:35:04.978+03:002019-04-04T22:35:04.978+03:00Конечно. А как же форма загружается? См. модуль Ty...Конечно. А как же форма загружается? См. модуль <a href="http://docwiki.embarcadero.com/Libraries/en/System.TypInfo" rel="nofollow">TypInfo</a>, функции типа <a href="http://docwiki.embarcadero.com/Libraries/en/System.TypInfo.SetOrdProp" rel="nofollow">SetOrdProp</a>, <a href="http://docwiki.embarcadero.com/Libraries/en/System.TypInfo.SetStrProp" rel="nofollow">SetStrProp</a> и др.GunSmokerhttps://www.blogger.com/profile/15611696588191431330noreply@blogger.comtag:blogger.com,1999:blog-1688132520265708820.post-75489601959615345022019-04-04T14:56:16.817+03:002019-04-04T14:56:16.817+03:00Скажите, можно с помощью этой технологии передать ...Скажите, можно с помощью этой технологии передать в качестве параметра имя свойства и изменить его в процедуре? примерно так<br />procedure UniversalSetProperty (ComponentName, PropertyName: string; value: variant);<br />begin<br />// здесь происходит магия<br />// свойству с именем PropertyName компонента с именем ComponentName <br />// присваивается значение value<br />end<br />...<br />UniversalSetProperty('Label1', 'enabled', true);<br />UniversalSetProperty('Label2', 'visible', false);<br />---Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1688132520265708820.post-2845317937467376802012-12-02T17:32:41.046+04:002012-12-02T17:32:41.046+04:00кстати в модуле rtti.pas объявлен такой класс как ...кстати в модуле rtti.pas объявлен такой класс как TRttiMethod, у которого есть<br />function GetParameters: TArray; virtual; abstract;<br />я не проверял что из себя представляет, это какое-то нововведение? я в 2010.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1688132520265708820.post-14041472152257255712012-12-02T17:22:33.645+04:002012-12-02T17:22:33.645+04:00респект) и благодарности за статью)
на самом деле ...респект) и благодарности за статью)<br />на самом деле не так уж бесполезно.<br />мне кажется любой синтаксический анализатор командной строки консольного приложения в лучшей своей версии должен использовать похожий подход.Anonymousnoreply@blogger.com