Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.5 MB
Время: 0.026 c
3-1090257855
Mister
2004-07-19 21:24
2004.08.15
имена с пробелами


1-1091177242
TUser
2004-07-30 12:47
2004.08.15
FindFirst/FindNext и скорость


1-1091558535
Zilog
2004-08-03 22:42
2004.08.15
Как по дате определить день недели?


14-1090860821
Art_Z
2004-07-26 20:53
2004.08.15
FAT32,NTFS и 65536 файлов...


3-1090577785
sapsi
2004-07-23 14:16
2004.08.15
Удаление записей в АДО таблице




   Наверх