[Delphi] - вопрос про RTTI

loks-po

У меня достаточно общий вопрос, который возник после прочтения соседнего поста о смене языка на элементах (допустим по старту).
Я прошу мне по возможности "как для тупого" объяснить работу вот этого:


var
PropInfo: PPropInfo;
...
PropInfo:= GetPropInfo(ButtonTrial.ClassInfo, EditProperty.Text);
...


Этот кусок кода взят из книжки Канту и Гуча "Delphi Руководство разработчика" (любезно предоставленной Глебиусом, за что ему отдельное спасибо).
Т.е. как я понимаю, можно написать что-нибудь вроде:


for i:=0 to Form1.ControlCount-1 do
begin
PropInfo:= GetPropInfo(Form1.Components[i].ClassInfo, ?);
end;


Т.е. сам вопрос: можно ли с помощью GetPropInfo получать значения свойств таких как Caption и Text (которые чаще всего надо менять при смене языка)? Или я что-то не так понимаю?
Я бы может и почитал умную книжу, но до ее уровня я явно не дотягиваю, а чего-то промежуточного у меня просто нет. Тем более, там не описывается синтаксис GetPropInfo. В самой справке естественно ничего по этому нет. Там, где у мея вопросы - (может глупый вопрос) там ЧТО писать то?
Короче, объясните идиоту или скажите где я неправильно думаю....
Заранее спасибо.

stm5643616

На место вопросиков поставь свой 'Caption' или 'Text'
А дальше со своим PropInfo делай так


var
PropInfo: PPropInfo;
Source: TComponent;
procedure SetStringProperty(PropName: string);
var
strName: string;
begin
strName := Source.Name + '.' + PropName;
SetStrProp(Source, PropInfo, 'substitute_your_property_value_here');
end;

Corrector

Если хочешь получить свойство объекта, не обяхательно использовать эту хитрую функцию
можно так:


var
MyStr: String
..
try
MyStr := (Form1.Components[i] as TLabel).Caption
except
//произошла хуйня
end;

loks-po

Всем спасибо. Кое-что проясняется...
В последнем посте - там понятно. А вот если при использовании GetPropIngo будет указано несуществующее у Source свойство- тоже исключение возникнет?

vijrel7878

а нахер такой гемор?


for i:= 0 to ComponentsCount-1 do
if Component[i] is TLabel then
TLabel(Component[i]).Caption := 'new caption'
else if Component[i] is TEdit then
TEdit(Component[i]).Text := 'new text'


ну и далее в таком же духе

stm5643616

А вот если при использовании GetPropIngo будет указано несуществующее у Source свойство- тоже исключение возникнет?
Да. Но его можно обработать.
Тем кто говорит, что можно без RTTI: с RTTI можно не перечислять все возможные типы компонент.
Оставить комментарий
Имя или ник:
Комментарий: