Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-42961
Draculenok
2002-02-13 14:44
2002.03.14
Вопрос по Paradox


14-43179
Tess
2002-01-31 20:52
2002.03.14
Про потоки ... как то они у меня непараллельно работают


3-42966
tns
2002-02-15 09:40
2002.03.14
Сетевое приложение


1-43084
Voldemar
2002-02-27 02:45
2002.03.14
TImage обалдел или я?


1-43005
метеоролог
2002-02-28 15:30
2002.03.14
компонент DELPHI3





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский