Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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> УУУ. Спасибо

УСЁ. Всем бааальшое спасибо. Задача решена.




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.14;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.023 c
14-43145          Феликс                2002-01-28 22:25  2002.03.14  
Классификация флеймеров.


14-43174          Dimk                  2002-01-31 11:10  2002.03.14  
Proxies.pas


1-42998           Art1                  2002-02-28 12:24  2002.03.14  
Как работать с формами в DLL?


14-43160          Егор                  2002-01-31 04:23  2002.03.14  
DCOM от А до Я


3-42937           Biocron               2002-02-14 07:27  2002.03.14  
Помогите ПЛИЗ