отправить сообщение всем контролам определённого класса

delman2011
Дата: 13.05.2011 11:03:02
Добрый день,

хочу написать свою процедуру типа Broadcast, но чтобы эта процедура отправляла сообшение только контролам определённых классов, переданных в качестве параметра.

Что-то вроде этого:

  procedure BroadcastToClasses(var Message; // отправляемое сообщение
                               ParentControl:TWinControl; // родительский контрол
                               CheckClasses:array of {тип ???} // массив для проверки на соответствие типам        
                               )
  begin
    ......
    {проходим в цикле по всем дочерним контролам ParentControl}
    ...
    {проверяем каждый контрол в цикле на принадлежность к CheckClasses
     и если класс соответствует, то шлём ему сообщение}

     if Controls[i] is CheckClasses[j] // эта проверка не работает (E2015 Operator not applicable to this operand type)
     then Controls[i].WindowProc(TMessage(Message));
     
  end;


Пример вызова процедуры:
Допустим, хотим отправить сообщение только кнопкам на форме:

  BroadcastToClasses(Message, Form1, [TButton, TBitBtn, TCustomButton] );

Ну и собственно 2 вопроса:

1. какой тип элементов массива CheckClasses указать ?
2. как проверить каждый контрол на форме на соответствие классу-элементу массива ?
Ramin Hashimzade
Дата: 13.05.2011 11:07:50
   for I := 0 to frm_CUSTOMERS_ACDetails.ComponentCount - 1 do
    begin
      if (frm_CUSTOMERS_ACDetails.Components[i] is TDBEdit) and (cmp_PageControl.ActivePageIndex = 0)
      then (frm_CUSTOMERS_ACDetails.Components[i] as TDBEdit).DataSource := cmp_DSAccount;
      if (frm_CUSTOMERS_ACDetails.Components[i] is TDBEdit) and (cmp_PageControl.ActivePageIndex = 1)
      then (frm_CUSTOMERS_ACDetails.Components[i] as TDBEdit).DataSource := cmp_DSOFFAccount;
    end;
FlyD
Дата: 13.05.2011 11:11:35
delman2011
[src delphi]
CheckClasses:array of {тип ???} // массив для проверки на соответствие типам
[src delphi]
TClass или TComponentClass или..
FlyD
Дата: 13.05.2011 11:14:43
procedure TForm1.Test(A: array of TComponentClass);
var
  i, j: Integer;
begin
  for i := 0 to ControlCount - 1 do
    for j := Low(A) to High(A) do
      if Controls[i] is A[j] then
        Memo1.Lines.Add(Controls[i].Name)
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Test([TButton, TBitBtn, TCustomButton]);
end;
Barmaley57
Дата: 13.05.2011 11:17:03
delman2011,
array of TClass
не подходит?
delman2011
Дата: 13.05.2011 12:16:19
Спасибо, предварительно работает, ошибок компиляции нет.

Для более точной проверки надо "покодить" немного, но думаю, что всё будет нормально.

P.S. TClass вроде тоже подходит.
fd00ch
Дата: 13.05.2011 16:10:11
delman2011, если нужно отправлять сообщение - то вместо TClass логичнее тот же TWinControl, ну или TControl