Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];

Вниз

компоненты, у которых есть свойство 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.047 c
11-1078950253
Sormy
2004-03-10 23:24
2004.08.15
KOL-MCK - модули


6-1087301835
DNS
2004-06-15 16:17
2004.08.15
Работа с Socket


8-1084093956
dimon_programmer
2004-05-09 13:12
2004.08.15
Как правильно менять увеличивать резкость изображения


6-1087208264
alexa
2004-06-14 14:17
2004.08.15
Mailslots


1-1091174254
Fate
2004-07-30 11:57
2004.08.15
Не могу разобраться с полиморфизмом





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский