powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перебор DB контролов на вкладке
23 сообщений из 23, страница 1 из 1
Перебор DB контролов на вкладке
    #39734662
Алексаша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

На форме имеется PageControl с множеством вкладок. На каждой вкладке имеется DBGrid, DBEdit и др. контролы DB, причем db контрлы располагаются ни непосредственно на TabSheet а на Panel, др. словами имеется вложенность. Можно ли при смене вкладок открыть датасеты на которых завязаны DB контролы расположенные на текущей вкладке?
...
Рейтинг: 0 / 0
Перебор DB контролов на вкладке
    #39734663
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть parent и owner. owner - это форма-владелец. Делай цикл по owner и проверий тип или проверяй наличие нужного свойства, например свойства FieldName.
...
Рейтинг: 0 / 0
Перебор DB контролов на вкладке
    #39734664
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.Classes.TComponent.Components

У каждого контрола есть список дочерних контролов.
Пройди их все рекурсивным перебором и найди нужные тебе типы.
...
Рейтинг: 0 / 0
Перебор DB контролов на вкладке
    #39734665
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Перебор DB контролов на вкладке
    #39734667
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не нужно привязываться к Parent. Используйте ActivePage. Завтра вам понадобится не только Гриды открывать, а ещё что нибудь
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure PageControlChange(Sender: TObject);
begin
  if PageControl.ActivePage = tsFirst then begin
    DatasetFirstGrid.Open;
    DatasetFirstLookup.Open;
    DatasetFirstOther.Open;
  end else
  if PageControl.ActivePage = tsSecond then begin
    DatasetSecondGrid.Open;
    DatasetSecondLookup.Open;
    SecondLookup.KeyValue := DatasetFirstGrid['IdKey'];
  end else
end;
...
Рейтинг: 0 / 0
Перебор DB контролов на вкладке
    #39735016
Алексаша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите разобраться. Если установлено что компонент имеет свойство как его изменить

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
procedure SearchControl(Sender: TObject);
var
  i: integer;
  p : PPropInfo;
begin

    for i := 0 to TWinControl(Sender).ControlCount - 1 do
    begin
    p := GetPropInfo(TWinControl(Sender).Controls[i], 'DataSource')
    if Assigned(p) then
      /// как обратиьтся к свойсву компонента ведь может быть любой DB
      TDB_какойтоДБконтрол(TWinControl(Sender).Controls[i])
        .DataSource.DataSet.Active := True
      else
      SearchControl(TWinControl(Sender).Controls[i])
    end
end;

procedure PgCntrlChange(Sender: TObject);
begin

  SearchControl(PgCntrl.Pages[PgCntrl.ActivePageIndex]);

end;
...
Рейтинг: 0 / 0
Перебор DB контролов на вкладке
    #39735070
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексаша,

.. is .. as ?
...
Рейтинг: 0 / 0
Перебор DB контролов на вкладке
    #39735213
Алексаша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Док,

и перебирать всевозможные варианты DB контролов?
...
Рейтинг: 0 / 0
Перебор DB контролов на вкладке
    #39735284
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексашаи перебирать всевозможные варианты DB контролов?
все перебирать не надо, фильтруй по условию
Код: pascal
1.
2.
3.
4.
5.
for i := 0 to TWinControl(Sender).ControlCount - 1 do
begin
  if TWinControl(Sender) is TDB_какойтоДБконтрол then
  //тут с отфильтрованным по условию контролом делай, что хочешь
end



зы. ты бы приложил какой-нибудь минимальный проект, кол-во помощников увеличилось бы на порядок
...
Рейтинг: 0 / 0
Перебор DB контролов на вкладке
    #39735322
Алексаша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Док,

На вкладках PageControl располагаются различные контролы DBGrid, DBEdit и др. и получается что надо так

Код: pascal
1.
2.
3.
4.
5.
for i := 0 to TWinControl(Sender).ControlCount - 1 do
begin
  if TWinControl(Sender) is TDBGrid or  TWinControl(Sender) is TDBEdit or ..... then
  //тут с отфильтрованным по условию контролом делай, что хочешь
end
...
Рейтинг: 0 / 0
Перебор DB контролов на вкладке
    #39735337
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексашаполучается что надо так
получается так, как напишешь :)
...
Рейтинг: 0 / 0
Перебор DB контролов на вкладке
    #39735358
Алексаша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сейчас наткнулся на SetPropValue
получается можно попробовать так ...

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
procedure SearchControl(Sender: TObject);
var
  i: integer;
  p : PPropInfo;
begin

    for i := 0 to TWinControl(Sender).ControlCount - 1 do
    begin
    p := GetPropInfo(TWinControl(Sender).Controls[i], 'DataSource')
    if Assigned(p) then
      /// как обратиьтся к свойсву компонента ведь может быть любой DB
      TDB_какойтоДБконтрол(TWinControl(Sender).Controls[i])
        .DataSource.DataSet.Active := True
      SetPropValue(TWinControl(Sender).Controls[i], 'Active', True);
      else
      SearchControl(TWinControl(Sender).Controls[i])
    end
end;

procedure PgCntrlChange(Sender: TObject);
begin

  SearchControl(PgCntrl.Pages[PgCntrl.ActivePageIndex]);

end;
...
Рейтинг: 0 / 0
Перебор DB контролов на вкладке
    #39735366
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексашасейчас наткнулся на SetPropValue получается можно попробовать так ...
Можно, но певерьте не нужно. Дайте датасетам нормальные имена и откройте их без всякого перебора контролов на форме. Это и проще и понятнее изменять в дальнейшем и меньше кода занимает.
Вы накропали уже 15 строчек кода для открытия датасета привязаного к гриду. За эти 15 строчек можно открыть 15 датасетов, без всякого рекурсивного перебора и более понятным кодом
...
Рейтинг: 0 / 0
Перебор DB контролов на вкладке
    #39735371
Алексаша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBr,

на данный момент 15 вкладок на каждой как минимум 2 датасета, порядок вкладок меняется. А так я подумал один раз написал 15 строчек и забыл привязывать соответствующие датасеты к порядковому номеру ТабШита на событие Change. Так мне показалось, что правильнее.

Спасибо за высказанное мнение, может и вправду откажусь от такого подхода.
...
Рейтинг: 0 / 0
Перебор DB контролов на вкладке
    #39735375
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Порядок меняется и что ? Имена то у вкладок не меняются.
Кроме Гридов завтра появятся DB-контролы со датасетами (например Lookup-ы), которые тоже нужно будет открывать, а послезавтра попадётся Master/Details и прежде чем открыть этот Details нужно задать ему параметры от мастера. То есть его открытие не зависит от вкладки, а зависит от другого.
...
Рейтинг: 0 / 0
Перебор DB контролов на вкладке
    #39735383
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В исходной задаче были датасеты т.е. наследники TDataSet, которые надо было открывать. А теперь уже "всевозможные варианты DB контролов". Определился бы...
...
Рейтинг: 0 / 0
Перебор DB контролов на вкладке
    #39735388
Фэйтл Эра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerВ исходной задаче были датасеты т.е. наследники TDataSet, которые надо было открывать. А теперь уже "всевозможные варианты DB контролов". Определился бы...
ТС ищет db - контролы.
Когда найдет - будет искать их TDataSource, потом - в TDataSet's и открывает их.
Потом выяснит, что некоторые db контролы имеют больше одного TDataSource, будет искать и их.
Потом - что некоторые db - контролы могут работать, не используя TDataSource.
А еще у некоторых этот самый TDataSource запрятан чуть глубже, чем обычно.
А еще некоторые могут вообще обходиться без прослойки TDataSource.
Потом выяснится, что важен порядок активации датасетов.
И т.д., движуха.

Сик итур ад астра.
...
Рейтинг: 0 / 0
Перебор DB контролов на вкладке
    #39735456
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексаша Можно ли при смене вкладок открыть датасеты на которых завязаны DB контролы расположенные на текущей вкладке?
Можно) У меня тоже самое.
Сам ответил:
Код: pascal
1.
2.
3.
4.
5.
for i := 0 to TWinControl(Sender).ControlCount - 1 do
begin
  if TWinControl(Sender) is TDBGrid or  TWinControl(Sender) is TDBEdit or ..... then
  //тут с отфильтрованным по условию контролом делай, что хочешь
end



1. Если эта форма родитель, то сделай это в базовой форме -тогда такой функционал перейдёт все наследники.
2. Не используй RTTI
3. Раньше, я выносил это в отдельный класс.
...
Рейтинг: 0 / 0
Перебор DB контролов на вкладке
    #39735458
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В результате, я не поленился и сделал вот так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
unit Common.Interfaces;

type
 IHaveDataBinding = interaface
 [GUID]
  function GetIDataSource:TDataSource;
  function GetIDataField:string;
end;

 IAmLazyControl = interaface
 [GUID]
  procedure LazyInit;
end;
...

for Component in Components do
 if  Supports(Component, IAmLazyControl) then 
     (Component as IAmLazyControl).LazyInit;


Да, это требует переделки всех контролов, но потом код гораздо легче обслуживать и значительно повышает его читабельность.
В общем, в результате ты сделаешь всю туже самую работу, только растянув это на много строчек кода перебирая
Код: pascal
1.
2.
if Control is TDBGrid then ... else
if Control is TDBEdit then ... else
...
Рейтинг: 0 / 0
Перебор DB контролов на вкладке
    #39735684
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_B
Код: pascal
1.
2.
 if  Supports(Component, IAmLazyControl) then 
     (Component as IAmLazyControl).LazyInit;


Почему не сделать так?
Код: pascal
1.
2.
 if  Supports(Component, IAmLazyControl, LazyControl) then 
     LazyControl.LazyInit;
...
Рейтинг: 0 / 0
Перебор DB контролов на вкладке
    #39735687
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Valery_B
Код: pascal
1.
2.
 if  Supports(Component, IAmLazyControl) then 
     (Component as IAmLazyControl).LazyInit;


Почему не сделать так?
Код: pascal
1.
2.
 if  Supports(Component, IAmLazyControl, LazyControl) then 
     LazyControl.LazyInit;


Что бы переменную не объявлять
...
Рейтинг: 0 / 0
Перебор DB контролов на вкладке
    #39735703
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrЧто бы переменную не объявлятьДа. Лучше два раза вызвать GetInterface
...
Рейтинг: 0 / 0
Перебор DB контролов на вкладке
    #39735712
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_DimaBrЧто бы переменную не объявлятьДа. Лучше два раза вызвать GetInterface
Для разового инита - не критично
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перебор DB контролов на вкладке
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]