Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.09.2014, 12:52   #1
loom12
Пользователь
 
Регистрация: 05.09.2014
Сообщений: 24
По умолчанию Изменение цвета на динамически созданных объектах

Здравствуйте!

Подскажите пожалуйста как можно сделать изменение цвета на динамически созданных объектах (TPanel) c помощью таймера?
Например сработало три объекта(панели), которые находятся на разных формах(динамически созданных) и они должны мигать разным цветом.

Объект(панель-1"Авария-41"),(панель-2"Авария-32") находится на NewForm[0], а Объект(панель-1"Авария-17") находится на NewForm[1] и т.д.

Вот как я начал:

Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var i:Integer;
begin

     for i:= 0 to NewForm[0].ComponentCount-1 do  //окно
         begin
           if NewForm[0].Components[i].Tag=1 then    //если Tag=1, панель№1 будет мигать красным цветом.
            begin
               if (NewForm[0].Components[i] as TPanel).Color=clBtnFace then
                  (NewForm[0].Components[i] as TPanel).Color:=clRed
                    else(NewForm[0].Components[i] as TPanel).Color:=clBtnFace;

            end;

         end;

end;
в дискуссии рождается истина
loom12 вне форума Ответить с цитированием
Старый 16.09.2014, 13:28   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Неправильно начал. Надо вот так начинать:
Код:
type
  TBlinkPanel = class (TPanel)
  private
    FTimer: TTimer;
    FBlinkColor: TColor;
    function GetBlinked: Boolean;
    procedure SetBlinked(const ANew: Boolean);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override; 
  published    
    property Blinked: Boolean read GetBlinked write SetBlinked;
    property BlinkColor: TColor read FBlinkColor write FBlinkColor;
    property Interval: Cardinal read ... write ...; //......................и т.д.
  end;
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 16.09.2014, 13:29   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Каждой панельке свой таймер отведи.
А в нем:
Код:
with PanelБлаБла do 
 if Color=clRed then color:=clGreen else color:=clRed;
Не надо один таймер на всех делать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.09.2014, 23:17   #4
StriderX
Форумчанин
 
Регистрация: 21.04.2014
Сообщений: 115
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Каждой панельке свой таймер отведи.
...Не надо один таймер на всех делать.
Это может оказаться вредным советом, а может и не оказаться... всё зависит от задачи =-)
Любое движение на экране приковывает внимание пользователя. Если фазы мигания у контролов разойдутся, то могут побежать всякие узоры (как на гирлянде), что обязательно привлечет к себе внимание, но непонятно зачем. Поэтому таймер может быть и один, и на каждого свой, и таймера может вообще не быть (в смысле компоненты), но моргать желательно всем в одной фазе =-)
StriderX вне форума Ответить с цитированием
Старый 17.09.2014, 08:31   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Это может оказаться вредным советом, а может и не оказаться... всё зависит от задачи =-)
Любое движение на экране приковывает внимание пользователя. Если фазы мигания у контролов разойдутся, то могут побежать всякие узоры (как на гирлянде), что обязательно привлечет к себе внимание, но непонятно зачем. Поэтому таймер может быть и один, и на каждого свой, и таймера может вообще не быть (в смысле компоненты), но моргать желательно всем в одной фазе =-)
А можно сделать и так и сяк, а в настройках - чекбокс, пусть юзер сам решает.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 17.09.2014, 11:09   #6
loom12
Пользователь
 
Регистрация: 05.09.2014
Сообщений: 24
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Каждой панельке свой таймер отведи.
А в нем:
Код:
with PanelБлаБла do 
 if Color=clRed then color:=clGreen else color:=clRed;
Не надо один таймер на всех делать.
---------
Наверно можно создать динамически таймера для каждой панельки (их может быть разное кол-во например 100),
добавляются из конфигурационного файла при запуске приложения).
А если создавать таймера только для текущих аварий. Например: появились три аварии в StringGrid, определяю что первая авария это NewForm[1],NewPanel[2],
вторая авария это NewForm[2],NewPanel[1], а третья авария это NewForm[2],NewPanel[2]
Код:
type
  TForm1 = class(TForm)
   procedure MyTimerEvent(Sender: TObject);
..
end;

var
 MyTimer:array of TTimer; 
 implementation

procedure monitor; //мониторинг аварий
var i:integer;
begin
..
  SetLength(MyTimer,CountAlarm);// сколько аварий столько созд.таймеров
 for i:=0 to CountAlarm-1 do  
 begin
   MyTimer[i]:= TTimer.Create(NewForm[i]);
    MyTimer[i].OnTimer := Form1.MyTimerEvent;//обработчик события
    MyTimer[i].Tag:=i;
    MyTimer[i].Interval := 1000;
    MyTimer[i].Enabled:=True;
 end;
end;

 procedure TForm1.MyTimerEvent(Sender: TObject);
 var i:Integer;
begin
//А обработчик события то один все равно. Это тоже самое получается что обычный таймер procedure TForm1.Timer1Timer(Sender: TObject);
 и вот тут никак не могу сообразить как в этом событии обработать информацию, передавать в NewForm[?].Components[i].Tag=? любое кол-во значений
 одновременно, где  Tag=? это панель на динамической форме.
  for i:= 0 to NewForm[?].ComponentCount-1 do  //окно
         begin
           if NewForm[?].Components[i].Tag=? then    //панель
            begin
               if (NewForm[?].Components[i] as TPanel).Color=clBtnFace then
                  (NewForm[?].Components[i] as TPanel).Color:=clRed
                    else(NewForm[?].Components[i] as TPanel).Color:=clBtnFace;

            end;

         end;
end;
// может как-то через (Sender as TTimer).Tag  ? 
// Если создается таймер для NewForm[1] то тогда Tag=1   ?
 if NewForm[(Sender as TTimer).Tag].Components[i].Tag=? then    //панель
в дискуссии рождается истина

Последний раз редактировалось loom12; 17.09.2014 в 12:09.
loom12 вне форума Ответить с цитированием
Старый 18.09.2014, 16:17   #7
loom12
Пользователь
 
Регистрация: 05.09.2014
Сообщений: 24
По умолчанию

Что ни кто и не подскажет не опытному
Вот что надумал может кому-то тоже поможет в дальнейшем.

Когда появляются аварии, определяю их кол-во и кому принадлежат:
авария-1(NewForm[0],NewPanel[1]; //окно-1, панель-2
авария-2(NewForm[0],NewPanel[2]; //окно-1, панель-3
авария-3(NewForm[1],NewPanel[3]; //окно-2, панель-4
и т.д.
Код:

//---------------------Обработчик события My_Timer---------------------------
  type
  ..
    procedure My_TimerEvent_newform(Sender: TObject);
  end;

//-------------------Создаю дополнительное свойство для TMyTimer----------

  type
  TMyTimer=class(TTimer)
  protected

  public
    MyTimerTag: integer; 
  end;
 //-------------------объявление процедур-----------------------------------
  
procedure blinktimer_newform(IndxNewForm:Integer;IndxPanelNewForm:Integer);
procedure stopblinktimer_newform(NameT:string;IdxNewForm:integer;IdxNewPanel:integer);
//-------------------------------------------------------------------

var
  Form1: TForm1;
   My_Timer: TMyTimer; // Объявляю экземпляр класса TMyTimer

implementation
{$R *.dfm}
//-------------------------------------------------------------------

procedure blinktimer_newform(IndxNewForm:Integer;IndxPanelNewForm:Integer);
begin
   
   My_Timer:=TMyTimer.Create(Form1);
 My_Timer.Name:='IdxNewF'+IntToStr(IndxNewForm)+'IdxPanlNewF'+IntToStr(IndxPanelNewForm);//придумываю имя объекта
   My_Timer.OnTimer := Form1.My_TimerEvent_newform;//присв. обработчик
   My_Timer.Tag:=IndxNewForm;  //присваивается индекс NewForm
   My_Timer.MyTimerTag:=IndxPanelNewForm;//присв. индекс панели на NewForm
   My_Timer.Interval := 1000;
   My_Timer.Enabled:=True;
end;

//---------------------------------------------------------------------

procedure TForm1.My_TimerEvent_newform(Sender: TObject);
 var i:Integer;

begin
   Application.ProcessMessages;
         for i:=0 to NewForm[(Sender as TMyTimer).Tag].ComponentCount-2 do  //окно 
        begin //1
                 
         if (NewForm[(Sender as TMyTimer).Tag].Components[i].Tag=(Sender as TMyTimer).MyTimerTag)then    //панель
            begin //2

               if (NewForm[(Sender as TMyTimer).Tag].Components[i] as TPanel).Color=clBtnFace then
                  (NewForm[(Sender as TMyTimer).Tag].Components[i] as TPanel).Color:=clRed
                    else(NewForm[(Sender as TMyTimer).Tag].Components[i] as TPanel).Color:=clBtnFace;

            end; //2
        end; //1

end;

//---------------------------------------------------------------------
когда появились аварии вызываю
for i:=0 to CountAlarm-1 do
 ...
    blinktimer_newform(0,2); //Окно-1, Панель-3,  подставить значения
   
//--------------------------------------------------------------------

авария ушла, надо остановить мигание
   stopblinktimer_newform('IdxNewF0IdxPanlNewF2',0,2);

//--------------------------------------------------------------------
//для того чтобы остановить мигание надо удалить нужный объект My_Timer ищу по имени, наверно накрутил :)
procedure stopblinktimer_newform(NameT:string;IdxNewForm:integer;IdxNewPanel:integer);
var i:Integer;
  FindCmp: TComponent;
begin
  //FindCmp := Form1.FindComponent('T2');
  FindCmp := Form1.FindComponent(NameT);
  Assert(Assigned(FindCmp));
   // if FindCmp<>nil then ShowMessage(FindCmp.Name);
   // if FindCmp<>nil then ShowMessage(IntToStr(FindCmp.Tag));
  if FindCmp<>nil then
   begin
          for i:= 0 to NewForm[IdxNewForm].ComponentCount-2 do  //окно
        begin
          if NewForm[IdxNewForm].Components[i].Tag=IdxNewPanel then    //панель
            begin
             (NewForm[IdxNewForm].Components[i] as TPanel).Color:=clBtnFace;//закрасить перед удалением, чтобы не остался красный цвет

            end;
        end;


   end;
  FindCmp.Free; //удалить из памяти объект
end;
// НУ КАК-ТО ТАК
в дискуссии рождается истина

Последний раз редактировалось loom12; 18.09.2014 в 16:23.
loom12 вне форума Ответить с цитированием
Старый 18.09.2014, 17:02   #8
indexx
Заблокирован
 
Регистрация: 12.09.2014
Сообщений: 544
По умолчанию

>> Что ни кто и не подскажет не опытному
Подсказали бы. Но задача поставлена так, что в ней без пол литра не разобраться. А я увы в завязке
indexx вне форума Ответить с цитированием
Старый 18.09.2014, 18:20   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Что ни кто и не подскажет не опытному
Буду дома, если не забуду накропаю сюда то что имел ввиду.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.09.2014, 18:27   #10
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

А чем мой вариант-то не угодил?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработчик динамически созданных объектов Cruzel C++ Builder 1 09.06.2014 05:39
Изменение свойств динамически созданных CheckBox-ов. Lost7070 C# (си шарп) 1 24.10.2013 07:08
Взаимодействие динамически созданных кнопок Rilmeer Помощь студентам 5 07.06.2013 13:51
обработчик динамически созданных кнопок andir Общие вопросы Delphi 5 02.03.2013 18:11
перетаскивание динамически созданных объектов kaizer131 Общие вопросы Delphi 13 15.06.2011 07:59