Форум: "Основная";
Текущий архив: 2002.03.14;
Скачать: [xml.tar.bz2];
ВнизСвязь компонента Найти похожие ветки
← →
Dtr (2002-02-27 12:51) [0]Вопрос может немного непонятный, но все же:
Предистория:
На формах имеется несколько компонентов, которые так или иначе связаны с DataSet, находящимся на DataModule1.
Связь может быть разной - то есть:
DBGRID - DBGrid.Datasource.DataSet
DBLookUpComboBox - DBLookUpComboBox.ListSorce.Dataset и т.д.
Заранее не известно, какие компоненты как связаны.
А теперь собственно вопрос.
Как посчитать количество таких компонент на форме, которые связаны с DataSet.
Если что неясно, уточню.
← →
Digitman (2002-02-27 13:04) [1]в run-time ?
← →
Dtr (2002-02-27 13:12) [2]>Digitman
Да
← →
Digitman (2002-02-27 13:22) [3]Result:= 0;
for i:= 0 to Screen.FormCount - 1 do
with Screen.Forms[i] do
for j:= 0 to ComponentCount - 1 do
if (Components[i] is TDataSource)
and (TDataSource(Components[i]).DataSet = DataModule1.MyDataSet) then
Result:= Result + 1;
← →
Dtr (2002-02-27 13:39) [4]>Digitman
Не, так не пойдет. потому как на форме только гриды, эдиты, и т.д.(сурсов нет)
А их все перечислять очень долго.
А может что-нить типа
Components[i]. PropertyByName("DataSet").Value
имеется? Только я не знаю как такая функция называется и есть ли она вообще.
← →
Юрий Зотов (2002-02-27 14:08) [5]См. в модуле TypInfo:
GetPropInfo
GetOrdProp или GetObjectProp
а также TObject.ClassInfo
← →
Digitman (2002-02-27 14:36) [6]>Dtr
Из твоего вопроса это, кстати, вовсе не очевидно.
Под "связью" с неким заданным DataSet следует понимать именно наличие значения некоего объектного св-ва типа TDataSet некоего компонента, равное значению адреса заданного экземпляра класса-наследника TDataSet. В твоем случае такими компонентами являются именно компоненты класса TDataSource (о других используемых тобой классах, имеющих данное св-во, ты не упомянул). Именно их число и подсчитывается в приведенном мной фрагменте кода.
Если же тебе надо учесть при подсчете только модули данных (а не формы), то организуй чуть иной цикл (принципиально не отличается):
Result:= 0;
for i:= 0 to Screen.DataModuleCount - 1 do
with Screen.DataModules[i] do
for j:= 0 to ComponentCount - 1 do
if (Components[i] is TDataSource)
and (TDataSource(Components[i]).DataSet = DataModule1.MyDataSet) then
Result:= Result + 1;
← →
Dtr (2002-02-28 09:08) [7]>Digitman
Одно из двух : либо ты меня не понял, либо я тебя.
Попытаюсь снова объяснить, что надо:
Есть Модуль данных (Datamodule) - DM1 На нем лежат:
1. Table1
2. DataSourse1 (DataSourse1.DataSet=Table1)
3. Table2
4. DataSource2 (DataSourse2.DataSet=Table2)
Есть форма - Form1. На ней лежат:
1. DBGrid1 - (DBGrid1.DataSource=DM.DataSourse1)
2. DBLookUpComboBox1- (DBLookUpComboBox1.ListSorce=DM.DataSourse2)
Есть форма - Form2. На ней лежат
1. DBEdit1 -(DBEdit1.DataSource=DM.DataSourse1)
2. DBCheckBox1 -(DBCheckBox1.DataSource=DM.DataSourse1)
Требуется подсчитать, сколько компонентов на каждой форме используют
1. Table1 (Ответ должен быть соответственно 1 на Form1 и 2 на Form2)
2. Table2 (Ответ должен быть соответственно 1 на Form1 и 2 на Form2)
НО!!! таких компанент может быть куча. (DBDateEdit, DBMemo и т.д.) а следовательно я не могу заранее написать строку типа
if Component[i] is DBGrid then...
Потому что проверять все компаненты - это не рационально.
А вот как это реализовать - я не знаю.
← →
Dtr (2002-02-28 09:11) [8]Исправление -
Ответ 2 должен быть соответственно 1 на Form1 и 0 на Form2
← →
Digitman (2002-02-28 09:37) [9]>Dtr
Тогда твой вопрос д.б. прозвучать иначе :
"Сколько виз.компонентов, принадлежащих в run-time всем существующим в приложении в данный момент формам, имеют св-во DataSource, ссылающееся на некий объект класса TDataSource c заданным св-вом DataSet ?"
Подсчитываем все виз.контролы, имеющие непустое св-во DataSource: TDataSource, ссылающееся на объект класса TDataSource, св-во DataSet которого = Table1 :
var
DS: TObject;
Result:= 0;
for i:= 0 to Screen.FormCount - 1 do
with Screen.Forms[i] do
for j:= 0 to ComponentCount - 1 do begin
DS := GetObjectProp(Components[i], "DataSource", TWinControl);
if Assigned(DS) and (DS is TDataSource) and (TDataSource(DS).DataSet = Table1) then
Result:= Result + 1;
end;
← →
Dtr (2002-02-28 09:55) [10]>Digitman
А у компанента DBLookUpComboBox1 у меня используется для связи свойство ListSorce (У других могут быть другие свойства) - Как с этим бороться?
← →
Dtr (2002-02-28 14:40) [11]НАРОД!!! ПОМОГАЙТЕ.
Свойство DataSource Может быть спрятано и за другими свойствами
(Как у DBPlannerDatePicker - DBPlannerDatePicker.Calendar.DataSource)
Лучше наверно свормулировать вопрос так:
Сколько виз.компонентов, принадлежащих в run-time всем существующим в приложении в данный момент формам, имеют какое-нибудь св-во, ссылающееся на некий объект класса TDataSource c заданным св-вом DataSet ?"
← →
yaJohn (2002-02-28 14:56) [12]Perebor vseh ob"ektnih svoistv vseh vizual"nih komponentov, videlenie sredi nih TDataSource, a dalshe - uje skazano.
Kak perebrat" vse komponenti - poniatno.
Vse ob"ektnie svoistva - otsilau na milo, tam vse yasno. Hotia v TypInfo eto vse est".
← →
Юрий Зотов (2002-02-28 15:01) [13]Ну что так кричать? Вам же сказали - см. TypInfo. Там все есть.
Через RTTI делаете рекурсивный проход по объектным свойствам и в итоге вылавливаете все ссылки на DataSet, где бы они не сидели. Пишется максимум за полчаса.
← →
Dtr (2002-03-01 08:15) [14]yaJohn> УУУ. Спасибо
УСЁ. Всем бааальшое спасибо. Задача решена.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.03.14;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c