Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Массовое изменение свойств


Автор: lamravas 7.7.2008, 14:16
Вот у меня нескольлько компонентов у них есть общее свойство которое я хочу менять в процессе работы приложения.
вот пример
Код


case pcontrol.ActivePageIndex of
0:begin  lpPOnum.LookupSource:=sQadjust;
trdate.DataSource:=sqadjust;
tdescr.DataSource:=sqadjust;
tjtype.DataSource:=sqadjust;
testim.DataSource:=sqadjust;
tpradj.DataSource:=sqadjust;
tcur.DataSource:=sqadjust;
tdesm.DataSource:=sqadjust;
  end;
  1: begin lpPOnum.LookupSource:=ssaved;
  trdate.DataSource:=ssaved;
  tdescr.DataSource:=ssaved;
  tjtype.DataSource:=ssaved;
  testim.DataSource:=ssaved;
  tpradj.DataSource:=ssaved;
  tcur.DataSource:=ssaved;
  tdesm.DataSource:=ssaved;
     end;
    2:begin  lpPOnum.LookupSource:=sclosed;
    trdate.DataSource:=sclosed;
    tdescr.DataSource:=sclosed;
    tjtype.DataSource:=sclosed;
    testim.DataSource:=sclosed;
    tpradj.DataSource:=sclosed;
    tcur.DataSource:=sclosed;
    tdesm.DataSource:=sclosed;
      end;

проблем бы не было только вот компонентов стало неприлично много , хочу узнать если более изящный способ.????

Автор: Alexeis 7.7.2008, 14:37
lamravas, занести компоненты в массив и менять в цикле.

Автор: lamravas 7.7.2008, 14:39
Цитата(Alexeis @  7.7.2008,  14:37 Найти цитируемый пост)
lamravas, занести компоненты в массив и менять в цикле. 

нельзя небольшой примерчик

Автор: Alexeis 7.7.2008, 15:25
Код

var
  i : Integer;
begin
  for I := 0 to DataContrlosLen - 1
  do
    if DataContrlos[i] is TDBImage then (DataContrlos[i] as TDBImage).DataSource    = ssaved
    else if DataContrlos[i] is TDBMemo then (DataContrlos[i] as TDBMemo).DataSource = ssaved;
    ...


Если у компонентов есть общий предок, то дело упрощается.

Добавлено через 5 минут и 39 секунд
  Кстати можно еще использовать модуль TypInfo и устанавливать свойство при помощи SetPropValue не возясь с типами, менять просто по строковому имени. Это будет еще изящней, но намного медленнее. 

Автор: lamravas 8.7.2008, 09:41
блин проблемка еще в том что это форма создаёться 
Код


with tfrmjobadd.create(self) do
begin
  i:=showmodal;
  free;
rdate.DataSource:=frmjobs.Sjobs;
  descr.DataSource:=frmjobs.sjobs;
  lpjtypes.DataSource:=frmjobs.sjobs;
  lpclid.DataSource:=frmjobs.sjobs;
  ponum.DataSource:=frmjobs.sjobs; 
end;

Дельфи постоянно выкидывает ошибку, на первой же строке присвоения нового свойства
Код


rdate.DataSource:=frmjobs.Sjobs;


что делать как присвоить новое свойство компоненту на другой форме???? smile 

Автор: Alexeis 8.7.2008, 09:46
Цитата(lamravas @  8.7.2008,  08:41 Найти цитируемый пост)
что делать как присвоить новое свойство компоненту на другой форме????

  Это не желательно, так как приводит к увеличении связанности модулей. Есть обработчик формы OnCreate, который вызывается при создании формы, в нем уже можно присваивать значения свойств. Вопрос слишком туманно поставлен. Трудно понять в чем проблема.

Автор: lamravas 8.7.2008, 10:55
Ну вот у меня к примеру форма1  на ней кнопа при нажатиии выполняеться вызов формы2, формы-ввода, след. образом
Код

i:integer;
begin
 qQuot.edit;
 qQuotUndel.Value:=1;
 if  qquotjclose.Value=1 then
 MessageDlg('This Job closed!!!', mtWarning, [mbYes], 0) else
 with tfrmQuotAdd.create(self) do
    begin
    i:=showmodal;
    free;
    end;
 case i of
 mrOK: begin qquotqsave.Value:='0'; qquot.Post; end;
 mrcancel: begin qquot.Cancel;  end;
 mrYes: begin qquotqsave.Value:='q'; qquot.Post;
 qQuot.Close; qsave.Close;  qclosed.Close;
 qQuot.Open;  qsave.Open;  qclosed.Open; qquot.Refresh; end;
 end;
qquot.Refresh;


Код

with tfrmQuotAdd.create(self) do
    begin
    i:=showmodal;
    free;
    end;

на этой форме2 ввода (которая создаёться )  присутствуют компоненты связанные с таблицией находящейся на форме1.
На форме 1 присутствует pagecontrol-компонет при изменении которого у компонентов на форме 2 следует изменять свойства компонентов(благо оно одно) это ДАТАСОУРС. Проблема еще  в том что датасоурсы находятся на форме1
это на онкрейт формы2(ввода)
Код

case frmjobs.PControl.ActivePageIndex of
0:begin
  rdate.DataSource:=frmjobs.Sjobs;
  descr.DataSource:=frmjobs.sjobs;
  lpjtypes.DataSource:=frmjobs.sjobs;
  lpclid.DataSource:=frmjobs.sjobs;
  ponum.DataSource:=frmjobs.sjobs;   end;
  1: begin
  rdate.DataSource:=frmjobs.ssaved;
  descr.DataSource:=frmjobs.ssaved;
  lpjtypes.DataSource:=frmjobs.ssaved;
  lpclid.DataSource:=frmjobs.ssaved;
  ponum.DataSource:=frmjobs.ssaved;  end;
    2:begin
  rdate.DataSource:=frmjobs.sclosed;
  descr.DataSource:=frmjobs.sclosed;
  lpjtypes.DataSource:=frmjobs.sclosed;
  lpclid.DataSource:=frmjobs.sclosed;
  ponum.DataSource:=frmjobs.sclosed; end;
end;

итак имеем 
Форма1 (pagecontrol, cxgrid, button, Датасоурсы)
Форма2 (компоненты связанные с таблице на форме1)

Автор: Alexeis 8.7.2008, 11:30
Гм.. я не силен в СУБД, но мне кажеться что тут что-то со структурой не в порядке. Можно в конечную форму кинуть TSQL  или как там его и использовать как источник данных. В общем так чтобы связывался только 1 компонент, а все остальные связывались через него.

Автор: lamravas 8.7.2008, 12:06
Да нет неважно субд это или еще чтото
Просто ответьте такое возможно или нет
При вызове формы поменять значение свойства1 (к примеру) компонентов находящихся на вызванной форме, на значение находящиеся на первоначальной форме с которого осуществляеться вызов???
Вот и всё

Автор: Alexeis 8.7.2008, 12:21
lamravas, это неверно с точки зрения проектирование системы. Жесткая связь неотказоустойчиая и негибкая. Лучше отослать сообщение или передать объект, который на месте все настроит сам.

Автор: lamravas 8.7.2008, 12:29
Alexeis,  Т.е. если я правильно понял то мне надо свойство, передаваемое компонентам на форме2, послать сначала с формы1 на форму2,
А уже в дальнейшем изменять свойства компонентов на  полученные?

Автор: Alexeis 8.7.2008, 12:42
Цитата(lamravas @  8.7.2008,  11:29 Найти цитируемый пост)
Т.е. если я правильно понял то мне надо свойство, передаваемое компонентам на форме2, послать сначала с формы1 на форму2,
А уже в дальнейшем изменять свойства компонентов на  полученные? 

  Примерно, так. Только лучше это сделать не по свойствам, а ввиде одной или 2х логически оформленных программных единиц, ввиде передачи объекта или интерфейса. Почитайте книжку по патернам, это здорово облегчит проектирование. 

Автор: pseud 14.7.2008, 10:14
Цитата(lamravas @  8.7.2008,  09:41 Найти цитируемый пост)

Код

with tfrmjobadd.create(self) do
begin
  i:=showmodal;
  free;
  rdate.DataSource:=frmjobs.Sjobs;
  descr.DataSource:=frmjobs.sjobs;
  lpjtypes.DataSource:=frmjobs.sjobs;
  lpclid.DataSource:=frmjobs.sjobs;
  ponum.DataSource:=frmjobs.sjobs; 
end;

Дельфи постоянно выкидывает ошибку, на первой же строке присвоения нового свойства
Код

rdate.DataSource:=frmjobs.Sjobs;

что делать как присвоить новое свойство компоненту на другой форме???? smile
 


по-моему, ты страдаешь херней.
обращаешься к свойствам компонентов, лежаших на несуществующей (удаленной тобой же free) форме.
попробуй так:
Код

with tfrmjobadd.create(self) do
try
  i:=showmodal;
  rdate.DataSource:=frmjobs.Sjobs;
  descr.DataSource:=frmjobs.sjobs;
  lpjtypes.DataSource:=frmjobs.sjobs;
  lpclid.DataSource:=frmjobs.sjobs;
  ponum.DataSource:=frmjobs.sjobs; 
finally
  free;
end;


Добавлено через 2 минуты и 6 секунд
смысла, конечно, в этом коде больше не стало. но он рабочий. и это уже пол-дела.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)