Форум: "Базы";
Текущий архив: 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.49 MB
Время: 0.039 c