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

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

компоненты, у которых есть свойство DataSource


Страницы:   1 2

Spivi ©   (2004-07-19 15:02:00) 

Всем привет.
Как можно отыскать на форме все компоненты, у которых есть свойство DataSource.

Заранее всем благодарен!!!


Spivi   (2004-07-19 17:12:00) [1]

Ой спасибо


Vlad   (2004-07-19 17:06:00) [2]


> Spivi ©   (19.07.04 16:56) [20]
> Я уже пробовал.
> Но в качестве значения там параметр типа Variant

Какой такой Variant ?

procedure SetObjectProp(Instance: TObject; const PropName: string;
 Value: TObject);


и где тут Variant ?

------------
SetObjectProp(Components[I], 'DataSource', YourDataSource);


Spivi   (2004-07-19 16:56:00) [3]

Я уже пробовал.
Но в качестве значения там параметр типа Variant


Vlad   (2004-07-19 16:50:00) [4]


> Spivi ©   (19.07.04 16:36) [18]

SetObjectProp


Spivi   (2004-07-19 16:36:00) [5]

Спасибо всем большое!
(особенно Reindeer Moss Eater)

только вот теперь возникла другая проблема
как этот DataSource присвоить этому свойству.


Anatoly Podgoretsky   (2004-07-19 16:23:00) [6]

Немного неправ, разговор про свойства


Anatoly Podgoretsky   (2004-07-19 16:12:00) [7]

Vlad ©   (19.07.04 15:57) [14]
Понятие на форме бесформенное, если те которые брошены на форму, то конечно они доступны, но тогда и просто можно использовать оператор IS


Polevi   (2004-07-19 15:59:00) [8]

ему на форме надо, будет Owner


Vlad   (2004-07-19 15:57:00) [9]


> Anatoly Podgoretsky ©   (19.07.04 15:52) [13]
> Components[I], включает только те у которых будет назначен
> параметр Owner

Ну так автор спрашивал как отыскать на форме. Значит те компоненты, которые помещены туда в дизайн-тайме по умолчанию имеют в качестве owner - форму. Ну а те, которые он создает в рантайме, пускай создает от имени своей формы, и всё будет ОК


Anatoly Podgoretsky   (2004-07-19 15:52:00) [10]

Components[I], включает только те у которых будет назначен параметр Owner


Reindeer Moss Eater   (2004-07-19 15:43:00) [11]

Если в точности ответить автору на его вопрос, он получит список дата-аваре контроловна форме вместе со списком компонентовнаследников например TQuery.

Как обрабатывать эту солянку - трудно себе представить.

Ему нужны либо контролы, либо компоненты only.
Иначе говоря простой перебор элементов components или controls и учет того, в каком именно классе впервые задекларировано DataSource как public.


Skyle   (2004-07-19 15:42:00) [12]


> Reindeer Moss Eater ©   (19.07.04 15:34) [10]

Согласен. Если поиск части алгоритмизируется, то интерфейсы тут облегчат код. Решать задачи вида
for I := 0 to ComponentCount - 1 do
 if Components[I] is TMyDSIntf then
   (Components[I] as TMyDSIntf).GetDatSource/SetDataSource/...

можно достаточно наглядно.
Хотя есть наверное задачи, для которых оптимальнее идти не отсюда..


Reindeer Moss Eater   (2004-07-19 15:34:00) [13]

Ему нужна только частьэтого списка.


Skyle   (2004-07-19 15:33:00) [14]


> Reindeer Moss Eater ©   (19.07.04 15:30) [7]

А что ему нужно? ;-)))


Skyle   (2004-07-19 15:32:00) [15]

Как моё решение, так и решение
> Vlad ©   (19.07.04 15:23) [6]
опираются в конечном итоге на Components[]. Насчёт RTTI подозреваю некоторые ограничения (вроде как не для всех генерируется). В случае, когда я из обработчика формы перечисляю всё, что на ней лежит, на область видимости, есессно, наплевать.
В случае, когда одна форма спрашивает совершенно другую о списке компонент, можно научить форму этим списком отвечать.
В чём я неправ?


Reindeer Moss Eater   (2004-07-19 15:30:00) [16]

Можно держать пари, что автору вопроса не нуженсписок компонентов, у которых есть свойство DataSource.


Vlad   (2004-07-19 15:23:00) [17]

Самому стало интересно, вот решил проверить
На форме размещаем ListBox и кнопку, на нажатие которой выполняется этот код
(само собой также должны присутствовать компоненты имеющие property DataSource)

procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
P: PPropInfo;
begin
for I:= 0 to ComponentCount - 1 do
begin
 P:=GetPropInfo(Components[I],'DataSource');
 if Assigned(P) then
  ListBox1.Items.Add(Components[I].Name);
end;
end;

Причем независимо private или нет.


Anatoly Podgoretsky   (2004-07-19 15:19:00) [18]

Они могут быть в приватной части, речь идет о поиске в рантайм


Skyle   (2004-07-19 15:10:00) [19]


> Anatoly Podgoretsky ©   (19.07.04 15:05) [1]

Можно кое что сломать, если очень хотеть..;-)

Если действительно так надо, то можно наделать своих наследников от всех интересующих компонент, единственным отличием которых от стандартных будет реализация какого-нибудь интерфейса
IDataSourcedComponent = interface
 procedure SetDataSource(Value : TDataSource);
end;


Набор методов - по желанию.
После этого, подозреваю, найти все такие компоненты не представляет сложности.


Vlad   (2004-07-19 15:09:00) [20]


> Spivi ©   (19.07.04 15:02)  

uses TypInfo.pas
функция GetPropInfo, если я не ошибаюсь.


Страницы:   1 2

Наверх

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