![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
компоненты, у которых есть свойство DataSource
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, если я не ошибаюсь.