Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TComponent, а как "детей" определить? [D7, WinXP]


Arbiter ©   (2005-02-03 11:08:00) 

Появилась необходимость сделать автоматически формирующийся INI файл, куда будут записаны значения Caption, Text и др. значения компонентов размещённых в программе.
Всё дело встало когда возник вопрос:"Получил я компонент (TComponent), узнал что это потомок TButton, а как свойства выдрать?"


Erik1   (2005-02-03 12:12:00) [1]

PropInfo := TypInfo.GetPropInfo(Control.ClassInfo, 'Caption');
if Assigned(PropInfo) and Assigned(PropInfo.GetProc) then
 GetOrdProp(Control, PropInfo, ....)
Вполне надежный метод, учитывая, что нужныые свойства находятся в published.


Ega23   (2005-02-03 11:55:00) [2]

2 Александр Иванов ©   (03.02.05 11:23) [7]
Он компилироваться не будет.

Да я прямо тут набирал, по-памяти. Сейчас посмотрел, действительно TControl.Caption в protected-секции сидит. Ну, тогда явное приведение потомков от TControl надо.


asafr   (2005-02-03 11:24:00) [3]

PathBase - это просто название, которое м.б. любым... Просто тупо скопировал...


asafr   (2005-02-03 11:23:00) [4]


var
Ini:TIniFile;
i:integer;
begin
Ini:=TIniFile.Create(ChangeFileExt( Application.ExeName,'.INI'));
for i:=0 to Form1.ControlCount-1 do
if (Form1.Controls[i] is TButtonChild) then
 begin
 Ini.WriteString('PathBase','PathBase',(Form1.Controls[i] as TButtonChild).Caption);
 Ini.WriteString('PathBase','PathBase',(Form1.Controls[i] as TButtonChild).Name);
 end;
Ini.Free
end;


Александр Иванов   (2005-02-03 11:23:00) [5]

Ega23 ©   (03.02.05 11:18) [5]
Он компилироваться не будет.


Ega23   (2005-02-03 11:18:00) [6]

WriteLn(F, Form1.Controls[i].Caption); Уверен?

Нет, конечно. Если захочет - разберётся куда и что писать...


Александр Иванов   (2005-02-03 11:17:00) [7]

Александр Иванов ©   (03.02.05 11:16) [3]
Да, не заметил коммент, приведения нужно.


Digitman   (2005-02-03 11:16:00) [8]

если интересуют лишь заранее известные тебе заведомо существующие св-ва (public или published они - неважно в дан.случае), то прочитать, например, то же св-во TButton.Caption проще пареной репы :

TButton(SomeComponent).Caption - читаем св-во Caption


Александр Иванов   (2005-02-03 11:16:00) [9]

Ega23 ©   (03.02.05 11:12) [1]
WriteLn(F, Form1.Controls[i].Caption); Уверен?


Ega23   (2005-02-03 11:12:00) [10]

Получил я компонент (TComponent), узнал что это потомок TButton,

Ничего не путаешь?

По сабжу:

for i:=0 to Form1.ControlCount-1 do
begin
 WriteLn(F, Form1.Controls[i].Caption); // за Caption не уверен, у некоторых в protected может быть вынесено
 WriteLn(F, Form1.Controls[i].Name);
 ......
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо