PDA

Просмотр полной версии : Отобразить/Спрятать контрол ВФБ



Vinsen
15.12.2017, 11:14
Здравствуйте!
Хочу сделать визуальный функциональный блок, у которого будет вход "Отключен", если на этом входе ВКЛ - контрол отключен на мнемосхеме (не виден), если на входе ВЫКЛ - контрол включен на мнемосхеме.
Взял для примера ВФБ "Blinking" из папки где установлена MasterSCADA и переделал его следующим образом:



public partial class BlinkingControl : VisualControlBase
{
public BlinkingControl() : base()
{
InitializeComponent();
}

protected override void OnPaint(PaintEventArgs e)
{
if (FBConnector.DesignMode)
return;

if (FBConnector.GetPinValue<bool>(Blinking.VisualBlink))
this.Visible = false;
else
this.Visible = true;
}
}


При этом, если Вход ВКЛ - контрол исчезает, а если ВЫКЛ - он не появляется. К примеру, если просто менять цвета контрола, то все работает:



public partial class BlinkingControl : VisualControlBase
{
public BlinkingControl() : base()
{
InitializeComponent();
}

protected override void OnPaint(PaintEventArgs e)
{
if (FBConnector.DesignMode)
return;

if (FBConnector.GetPinValue<bool>(Blinking.VisualBlink))
this.BackColor = Color.Green;
else
this.BackColor = Color.Yellow;
}
}


Подскажите в чём может быть причина.

SCADAMaster
15.12.2017, 11:28
А зачем? Почему нельзя стандартный вход Отключен использовать? Он у всех контролов есть.

Vinsen
15.12.2017, 11:35
Много проектов, много мнемосхем, на каждой мнемосхеме будет минимум 10 таких контролов, к каждому привязывать очень долго. Думали сэкономить время.

SCADAMaster
15.12.2017, 12:08
Если контрол скрыт, то OnPaint он вызывать не будет.

Vinsen
18.12.2017, 06:09
Хорошо, какую функцию тогда можно использовать?

Vinsen
18.12.2017, 06:49
Так будет корректно?



public BlinkingControl() : base()
{
InitializeComponent();
FBConnector.PinChanged += new PinChangedHaldler(FBConnector_PinChanged);
}

void FBConnector_PinChanged(int pinID)
{
if (FBConnector.DesignMode)
return;

if (!FBConnector.GetPinValue<bool>(Blinking.VisualBlink))
this.Visible = true;
else
this.Visible = false;
}

SCADAMaster
18.12.2017, 12:43
С виду да - пробуйте.

Vinsen
19.12.2017, 04:15
Хорошо, спасибо!

Vinsen
21.12.2017, 10:25
А можно ли как-нибудь управлять приоритетом контролов на мнемосхеме в режиме исполнения? Дело в том, что когда переносишь новый контрол на мнемосхему, он всегда сверху тех, что уже есть на ней, а вот при запуске режима исполнения часть новых контролов прячется за старые - приходится удалять их с мнемосхемы и добавлять заново. Можно ли как-то одни контролы жёстко прописать сверху остальных?

SCADAMaster
21.12.2017, 10:36
Нет, только безоконные.
ActiveX контролы Z порядку не подчиняются.