Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.15;
Скачать: CL | DM;

Вниз

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

 
Spivi ©   (2004-07-19 15:02) [0]

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

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


 
Anatoly Podgoretsky ©   (2004-07-19 15:05) [1]

Вряд ли это вообще возможно.


 
Курдль ©   (2004-07-19 15:09) [2]

Посмотреть на форму - они там значком таким обозначены - квадратик с тремя стрелочками.


 
Vlad ©   (2004-07-19 15:09) [3]


> Spivi ©   (19.07.04 15:02)  

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


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


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

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

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


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


 
Anatoly Podgoretsky ©   (2004-07-19 15:19) [5]

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


 
Vlad ©   (2004-07-19 15:23) [6]

Самому стало интересно, вот решил проверить
На форме размещаем 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 или нет.


 
Reindeer Moss Eater ©   (2004-07-19 15:30) [7]

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


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

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


 
Skyle ©   (2004-07-19 15:33) [9]


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

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


 
Reindeer Moss Eater ©   (2004-07-19 15:34) [10]

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


 
Skyle ©   (2004-07-19 15:42) [11]


> 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:43) [12]

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

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

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


 
Anatoly Podgoretsky ©   (2004-07-19 15:52) [13]

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


 
Vlad ©   (2004-07-19 15:57) [14]


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

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


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

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


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

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


 
Anatoly Podgoretsky ©   (2004-07-19 16:23) [17]

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


 
Spivi ©   (2004-07-19 16:36) [18]

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

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


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


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

SetObjectProp


 
Spivi ©   (2004-07-19 16:56) [20]

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


 
Vlad ©   (2004-07-19 17:06) [21]


> 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 17:12) [22]

Ой спасибо



Страницы: 1 вся ветка

Текущий архив: 2004.08.15;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.043 c
1-1091052611
НовиЧок
2004-07-29 02:10
2004.08.15
Всё тот-же манифест XP


3-1090171557
buka
2004-07-18 21:25
2004.08.15
Помогите мастера! Надо найти следующую запись в Table


1-1091434216
Maxim
2004-08-02 12:10
2004.08.15
Вывод чисел


6-1087299366
Razor
2004-06-15 15:36
2004.08.15
Атрибуты файла по HTTP (IdHTTP)


1-1091166407
П7
2004-07-30 09:46
2004.08.15
Элементы TTreeView и Drag n Drop