new layout

This commit is contained in:
2026-04-30 10:24:10 +03:00
parent 1b2fbfe2c8
commit ece5a70041
2 changed files with 173 additions and 98 deletions
+166 -93
View File
@@ -33,19 +33,20 @@ uses
SpectrumView;
const
CLR_BG = TColor($00101010);
CLR_PANEL = TColor($00181818);
CLR_BORDER = TColor($00303030);
CLR_FREQ = TColor($0000FF00);
CLR_FREQ_DIM = TColor($00008000);
CLR_AMBER = TColor($0000AAFF);
CLR_ACTIVE = TColor($00003300);
CLR_INACTIVE = TColor($00202020);
CLR_TEXT = TColor($00CCCCCC);
CLR_TEXTDIM = TColor($00666666);
CLR_METER_ON = TColor($0000CC44);
CLR_METER_OVR= TColor($000000CC);
CLR_SPECTRUM = TColor($0044FF44);
CLR_BG = TColor($00101010);
CLR_PANEL = TColor($00181818);
CLR_BORDER = TColor($00303030);
CLR_FREQ = TColor($0000FF00);
CLR_FREQ_DIM = TColor($00007800);
CLR_AMBER = TColor($0000AAFF);
CLR_ACTIVE = TColor($000C3010);
CLR_ACTIVE_BDR = TColor($00387838);
CLR_INACTIVE = TColor($001A1A1A);
CLR_TEXT = TColor($00CCCCCC);
CLR_TEXTDIM = TColor($00666666);
CLR_METER_ON = TColor($0000CC44);
CLR_METER_OVR = TColor($000000CC);
CLR_SPECTRUM = TColor($0044FF44);
WDSP_WISDOM_FILE = 'wdspWisdom00';
BAND_COUNT = 11;
@@ -261,6 +262,7 @@ type
BtnDiscover: TFlatButton;
BtnStartStop: TFlatButton; // START / STOP (connect+run в одном)
BtnSettings: TFlatButton; // открыть диалог настроек
PanelSep: TPanel; // 1px разделитель под тулбаром
// ---- Left panel ----
PanelLeft: TPanel;
@@ -1257,12 +1259,28 @@ begin
PanelToolbar.Align := alTop;
PanelToolbar.Height := 36;
PanelToolbar.BevelOuter := bvNone;
PanelToolbar.Color := CLR_PANEL;
X := 4;
BtnDiscover := MakeBtn(PanelToolbar, 'DISCOVER', X, 3, 80, BTN_H, BtnDiscoverClick);
BtnStartStop := MakeBtn(PanelToolbar, 'START', X+84, 3, 76, BTN_H, BtnStartStopClick);
BtnSettings := MakeBtn(PanelToolbar, 'SETUP', X+164, 3, 66, BTN_H, BtnSettingsClick);
// DISCOVER — синеватый акцент
BtnDiscover.ClrNorm := TColor($00101828);
BtnDiscover.ClrHot := TColor($00182038);
BtnDiscover.ClrActive := TColor($00182038);
BtnDiscover.ClrBorder := TColor($00304860);
BtnDiscover.ClrText := TColor($0090B8D0);
BtnDiscover.ClrTextAct := TColor($00B0D0F0);
// START/STOP — зелёный тон в обоих состояниях
BtnStartStop.ClrNorm := TColor($00101810);
BtnStartStop.ClrBorder := TColor($00304830);
BtnStartStop.ClrText := TColor($0090C090);
// ---- Separator line ----
// ---- Status bar ----
StatusBar1 := TStatusBar.Create(Self);
StatusBar1.Parent := Self;
@@ -1284,14 +1302,14 @@ begin
PanelLeft.Width := LEFT_W;
PanelLeft.BevelOuter := bvNone;
Y := 2;
Y := 38; // gap below separator: separator at y=66, content starts at y=74
// Compact top VFO group
PanelTopVfoGroup := TPanel.Create(Self);
PanelTopVfoGroup.Parent := Self;
PanelTopVfoGroup.SetBounds(0, 0, TOP_VFO_W * 2 + 64, 60);
PanelTopVfoGroup.BevelOuter := bvNone;
PanelTopVfoGroup.Color := CLR_PANEL;
PanelTopVfoGroup.Color := TColor($00181818);
// VFO A
PanelTopVfoA := TPanel.Create(Self);
@@ -1305,9 +1323,9 @@ begin
PanelVfoA.SetBounds(0, 0, TOP_VFO_W, TOP_VFO_FREQ_H);
PanelVfoA.BevelOuter := bvNone;
BtnTopVfoASelect := MakeBtn(PanelVfoA, 'A', 0, 7, 18, 16, BtnTopVfoASelectClick);
BtnTopVfoASelect := MakeBtn(PanelVfoA, 'A', 0, 5, 20, 18, BtnTopVfoASelectClick);
BtnTopVfoASelect.Font.Name := 'Courier New';
BtnTopVfoASelect.Font.Size := 6;
BtnTopVfoASelect.Font.Size := 7;
BtnTopVfoASelect.Font.Bold := True;
BtnTopVfoASelect.ClrNorm := TColor($00303030);
BtnTopVfoASelect.ClrHot := TColor($00404040);
@@ -1316,9 +1334,9 @@ begin
BtnTopVfoASelect.ClrText := CLR_TEXTDIM;
BtnTopVfoASelect.ClrTextAct := CLR_TEXT;
BtnTopVfoATX := MakeBtn(PanelVfoA, 'TX', 0, 25, 18, 16, BtnTopVfoATXClick);
BtnTopVfoATX := MakeBtn(PanelVfoA, 'TX', 0, 25, 20, 18, BtnTopVfoATXClick);
BtnTopVfoATX.Font.Name := 'Courier New';
BtnTopVfoATX.Font.Size := 6;
BtnTopVfoATX.Font.Size := 7;
BtnTopVfoATX.Font.Bold := True;
BtnTopVfoATX.ClrNorm := TColor($00303030);
BtnTopVfoATX.ClrHot := TColor($00404040);
@@ -1362,9 +1380,9 @@ begin
PanelVfoB.SetBounds(0, 0, TOP_VFO_W, TOP_VFO_FREQ_H);
PanelVfoB.BevelOuter := bvNone;
BtnTopVfoBSelect := MakeBtn(PanelVfoB, 'B', 0, 7, 18, 16, BtnTopVfoBSelectClick);
BtnTopVfoBSelect := MakeBtn(PanelVfoB, 'B', 0, 5, 20, 18, BtnTopVfoBSelectClick);
BtnTopVfoBSelect.Font.Name := 'Courier New';
BtnTopVfoBSelect.Font.Size := 6;
BtnTopVfoBSelect.Font.Size := 7;
BtnTopVfoBSelect.Font.Bold := True;
BtnTopVfoBSelect.ClrNorm := TColor($00303030);
BtnTopVfoBSelect.ClrHot := TColor($00404040);
@@ -1373,9 +1391,9 @@ begin
BtnTopVfoBSelect.ClrText := CLR_TEXTDIM;
BtnTopVfoBSelect.ClrTextAct := CLR_TEXT;
BtnTopVfoBTX := MakeBtn(PanelVfoB, 'TX', 0, 25, 18, 16, BtnTopVfoBTXClick);
BtnTopVfoBTX := MakeBtn(PanelVfoB, 'TX', 0, 25, 20, 18, BtnTopVfoBTXClick);
BtnTopVfoBTX.Font.Name := 'Courier New';
BtnTopVfoBTX.Font.Size := 6;
BtnTopVfoBTX.Font.Size := 7;
BtnTopVfoBTX.Font.Bold := True;
BtnTopVfoBTX.ClrNorm := TColor($00303030);
BtnTopVfoBTX.ClrHot := TColor($00404040);
@@ -1407,18 +1425,23 @@ begin
FreqDispB.OnChange := FreqDispBChanged;
FreqDispB.OnClick := FreqDispBClick;
// VFO transfer buttons (between A and B)
// VFO transfer buttons — горизонтальный ряд по центру
PanelVfoButtons := TPanel.Create(Self);
PanelVfoButtons.Parent := PanelTopVfoGroup;
PanelVfoButtons.SetBounds(0, 0, 56, 60);
PanelVfoButtons.SetBounds(0, 0, 140, 20);
PanelVfoButtons.BevelOuter := bvNone;
PanelVfoButtons.Color := TColor($00181818);
BtnVfoSwap := MakeBtn(PanelVfoButtons, 'A<>B', 0, 0, 52, TOP_VFO_BTN_H, BtnVfoSwapClick);
BtnVfoACopyB := MakeBtn(PanelVfoButtons, 'A>B', 0, 0, 52, TOP_VFO_BTN_H, BtnVfoACopyBClick);
BtnVfoBCopyA := MakeBtn(PanelVfoButtons, 'B>A', 0, 0, 52, TOP_VFO_BTN_H, BtnVfoBCopyAClick);
BtnVfoSwap.Font.Size := 6;
BtnVfoACopyB.Font.Size := 6;
BtnVfoBCopyA.Font.Size := 6;
BtnVfoACopyB := MakeBtn(PanelVfoButtons, 'A>B', 0, 0, 44, 20, BtnVfoACopyBClick);
BtnVfoSwap := MakeBtn(PanelVfoButtons, 'A<>B', 0, 0, 44, 20, BtnVfoSwapClick);
BtnVfoBCopyA := MakeBtn(PanelVfoButtons, 'B>A', 0, 0, 44, 20, BtnVfoBCopyAClick);
// Янтарный стиль, шрифт под размер кнопок
StyleSpanButton(BtnVfoACopyB, False);
StyleSpanButton(BtnVfoSwap, False);
StyleSpanButton(BtnVfoBCopyA, False);
BtnVfoACopyB.Font.Size := 7;
BtnVfoSwap.Font.Size := 7;
BtnVfoBCopyA.Font.Size := 7;
LayoutTopVfoBlock;
@@ -1598,7 +1621,7 @@ begin
PanelSpanButtons := TPanel.Create(Self);
PanelSpanButtons.Parent := PanelRight;
PanelSpanButtons.Align := alTop;
PanelSpanButtons.Height := 30;
PanelSpanButtons.Height := 38;
PanelSpanButtons.BevelOuter := bvNone;
LblSpan := TLabel.Create(Self);
@@ -1635,6 +1658,15 @@ begin
BtnHidePanel.ClrTextAct := TColor($00F0FAFF);
BtnHidePanel.BringToFront;
// Разделитель: на уровне формы, под всеми верхними элементами
PanelSep := TPanel.Create(Self);
PanelSep.Parent := Self;
PanelSep.Align := alNone;
PanelSep.BevelOuter := bvNone;
PanelSep.ParentColor := False;
PanelSep.Color := TColor($00606060);
PanelSep.SetBounds(0, PanelToolbar.Height + 30, ClientWidth, 2);
// Большой S-метр — на главной форме поверх двух панелей
// S-метр: Parent=Self, перекрывает Toolbar+SpanButtons вертикально
PanelSMeterRight := TPanel.Create(Self);
@@ -1798,33 +1830,24 @@ const
MARGIN = 4;
TOP_OFFSET = 2;
TOP_VFO_FREQ_H = 47;
VFO_BTN_W = 18;
VFO_BTN_W = 20;
VFO_BTN_FREQ_GAP = 4;
VFO_FREQ_LEFT_PAD = 2;
VFO_FREQ_RIGHT_PAD = 8;
TRANSFER_LEFT_GAP = 12;
TRANSFER_RIGHT_GAP = 24;
TRANSFER_W = 52;
TRANSFER_BTN_H = 16;
TRANSFER_BTN_GAP = 3;
SETTINGS_GAP = 4;
XFER_BTN_W = 44;
XFER_BTN_H = 20;
XFER_BTN_GAP = 4;
XFER_PANEL_W = XFER_BTN_W * 3 + XFER_BTN_GAP * 2; // = 140
XFER_SIDE_GAP = 14; // минимальный зазор между VFO и кнопками трансфера
SETTINGS_GAP = 8;
MAX_SPREAD = 100; // максимальный дополнительный отступ с каждой стороны при растяжении
// VFO-B получает левый отступ = правому паддингу VFO-A для симметрии зазоров
VFO_B_LEFT_PAD = VFO_FREQ_LEFT_PAD + VFO_FREQ_RIGHT_PAD; // = 10
var
BlockH: Integer;
BtnY: Integer;
FreqTop: Integer;
SafeLeft: Integer;
SafeRight: Integer;
GroupLeft: Integer;
GroupTop: Integer;
RightW: Integer;
SMW: Integer;
SMLeft: Integer;
TopVfoAW: Integer;
TopVfoBW: Integer;
NeedFreqAW: Integer;
NeedFreqBW: Integer;
FreqTextW: Integer;
GroupW: Integer;
BlockH, FreqTop, SafeLeft, SafeRight, GroupLeft, GroupTop: Integer;
RightW, SMW, SMLeft, AvailW, MinGroupW, ExtraPerSide, DynGap: Integer;
TopVfoAW, TopVfoBW, NeedFreqAW, NeedFreqBW, FreqTextW, GroupW: Integer;
XferX, XferY: Integer;
begin
if (PanelToolbar = nil) or (PanelSpanButtons = nil) or (PanelTopVfoGroup = nil) or
(PanelTopVfoA = nil) or (PanelTopVfoB = nil) then Exit;
@@ -1833,14 +1856,15 @@ begin
Canvas.Font.Size := FreqDispB.FontSize;
Canvas.Font.Style := [fsBold];
FreqDispA.Left := VFO_BTN_W + VFO_BTN_FREQ_GAP - VFO_FREQ_LEFT_PAD;
FreqDispB.Left := VFO_BTN_W + VFO_BTN_FREQ_GAP - VFO_FREQ_LEFT_PAD;
FreqTextW := Canvas.TextWidth('000.000.000');
FreqDispB.Left := VFO_B_LEFT_PAD + VFO_BTN_W + VFO_BTN_FREQ_GAP - VFO_FREQ_LEFT_PAD;
FreqTextW := Canvas.TextWidth('000.000.000');
NeedFreqAW := FreqDispA.Left + FreqTextW + VFO_FREQ_LEFT_PAD + VFO_FREQ_RIGHT_PAD;
NeedFreqBW := FreqDispB.Left + FreqTextW + VFO_FREQ_LEFT_PAD + VFO_FREQ_RIGHT_PAD;
TopVfoAW := NeedFreqAW;
TopVfoBW := NeedFreqBW;
GroupW := TopVfoAW + TRANSFER_LEFT_GAP + TRANSFER_W +
TRANSFER_RIGHT_GAP + TopVfoBW;
// Минимальная ширина компактной группы
MinGroupW := TopVfoAW + XFER_SIDE_GAP + XFER_PANEL_W + XFER_SIDE_GAP + TopVfoBW;
SafeLeft := MARGIN;
if BtnSettings <> nil then
@@ -1851,57 +1875,67 @@ begin
RightW := ClientWidth - PanelLeft.Width;
if RightW > 200 then
begin
SMW := Round(RightW * SMETER_WIDTH_RATIO);
SMW := Round(RightW * SMETER_WIDTH_RATIO);
SMLeft := ClientWidth - SMW - SMETER_MARGIN;
SafeRight := Min(SafeRight, SMLeft - TOP_SMETER_GAP);
end;
end;
if SafeLeft + GroupW > SafeRight then
AvailW := SafeRight - SafeLeft;
if AvailW < MinGroupW then
begin
PanelTopVfoGroup.Visible := False;
Exit;
end;
PanelTopVfoGroup.Visible := True;
PanelTopVfoA.Visible := True;
PanelTopVfoB.Visible := True;
BlockH := PanelToolbar.Height + PanelSpanButtons.Height - (MARGIN * 2);
// Динамический зазор: растёт с шириной окна, но не больше MAX_SPREAD
ExtraPerSide := Min((AvailW - MinGroupW) div 2, MAX_SPREAD);
DynGap := XFER_SIDE_GAP + ExtraPerSide;
GroupW := TopVfoAW + DynGap + XFER_PANEL_W + DynGap + TopVfoBW;
BlockH := PanelToolbar.Height + 30 - (MARGIN * 2); // 30 = span row content, not full PanelSpanButtons
if BlockH < 56 then BlockH := 56;
GroupLeft := SafeLeft + (SafeRight - SafeLeft - GroupW) div 2;
GroupTop := TOP_OFFSET;
// Центрируем группу в доступном пространстве
GroupLeft := SafeLeft + (AvailW - GroupW) div 2;
GroupTop := TOP_OFFSET;
PanelTopVfoGroup.SetBounds(GroupLeft, GroupTop, GroupW, BlockH);
PanelTopVfoGroup.Visible := True;
// VFO-A: левый край группы
PanelTopVfoA.SetBounds(0, 0, TopVfoAW, BlockH);
PanelTopVfoA.Visible := True;
PanelVfoA.SetBounds(0, 0, TopVfoAW, TOP_VFO_FREQ_H);
FreqTop := ((BtnTopVfoASelect.Top + BtnTopVfoASelect.Height +
BtnTopVfoATX.Top) div 2) - (TOP_VFO_FREQ_H div 2);
FreqDispA.SetBounds(FreqDispA.Left, FreqDispA.Top,
FreqDispA.SetBounds(FreqDispA.Left, FreqTop,
FreqTextW + VFO_FREQ_LEFT_PAD + VFO_FREQ_RIGHT_PAD, TOP_VFO_FREQ_H);
FreqDispA.Top := FreqTop;
BtnTopVfoASelect.Left := 0;
BtnTopVfoATX.Left := 0;
PanelVfoButtons.SetBounds(TopVfoAW + TRANSFER_LEFT_GAP, 0, TRANSFER_W, BlockH);
BtnY := (PanelVfoButtons.Height - (TRANSFER_BTN_H * 3 + TRANSFER_BTN_GAP * 2)) div 2;
if BtnY < 0 then BtnY := 0;
BtnVfoSwap.SetBounds(0, BtnY, TRANSFER_W, TRANSFER_BTN_H);
BtnVfoACopyB.SetBounds(0, BtnY + TRANSFER_BTN_H + TRANSFER_BTN_GAP,
TRANSFER_W, TRANSFER_BTN_H);
BtnVfoBCopyA.SetBounds(0, BtnY + (TRANSFER_BTN_H + TRANSFER_BTN_GAP) * 2,
TRANSFER_W, TRANSFER_BTN_H);
// Кнопки трансфера: горизонтальный ряд, вертикально по центру
XferX := TopVfoAW + DynGap;
XferY := (BlockH - XFER_BTN_H) div 2;
PanelVfoButtons.SetBounds(XferX, XferY, XFER_PANEL_W, XFER_BTN_H);
BtnVfoACopyB.SetBounds(0, 0, XFER_BTN_W, XFER_BTN_H);
BtnVfoSwap.SetBounds(XFER_BTN_W + XFER_BTN_GAP, 0, XFER_BTN_W, XFER_BTN_H);
BtnVfoBCopyA.SetBounds((XFER_BTN_W + XFER_BTN_GAP) * 2, 0, XFER_BTN_W, XFER_BTN_H);
PanelTopVfoB.SetBounds(TopVfoAW + TRANSFER_LEFT_GAP + TRANSFER_W +
TRANSFER_RIGHT_GAP,
0, TopVfoBW, BlockH);
// VFO-B: правый край группы
PanelTopVfoB.SetBounds(TopVfoAW + DynGap + XFER_PANEL_W + DynGap, 0, TopVfoBW, BlockH);
PanelTopVfoB.Visible := True;
PanelVfoB.SetBounds(0, 0, TopVfoBW, TOP_VFO_FREQ_H);
FreqTop := ((BtnTopVfoBSelect.Top + BtnTopVfoBSelect.Height +
BtnTopVfoBTX.Top) div 2) - (TOP_VFO_FREQ_H div 2);
FreqDispB.SetBounds(FreqDispB.Left, FreqDispB.Top,
FreqDispB.SetBounds(FreqDispB.Left, FreqTop,
FreqTextW + VFO_FREQ_LEFT_PAD + VFO_FREQ_RIGHT_PAD, TOP_VFO_FREQ_H);
FreqDispB.Top := FreqTop;
BtnTopVfoBSelect.Left := 0;
BtnTopVfoBTX.Left := 0;
BtnTopVfoBSelect.Left := VFO_B_LEFT_PAD;
BtnTopVfoBTX.Left := VFO_B_LEFT_PAD;
if PanelSep <> nil then
PanelSep.SetBounds(0, PanelToolbar.Height + 30, ClientWidth, 2);
PanelTopVfoGroup.BringToFront;
end;
@@ -1934,7 +1968,7 @@ begin
// Y: от верха формы+margin до низа PanelSpanButtons-margin
SMTop := SMETER_MARGIN;
SMBot := PanelToolbar.Height + PanelSpanButtons.Height - SMETER_MARGIN;
SMBot := PanelToolbar.Height + 30 - SMETER_MARGIN; // 30 = span row content, ends before separator
PanelSMeterRight.SetBounds(SMLeft, SMTop, SMW, SMBot - SMTop);
PanelSMeterRight.BringToFront;
@@ -2110,8 +2144,9 @@ begin
B.Active := Active;
B.ClrNorm := CLR_INACTIVE;
B.ClrActive := CLR_ACTIVE;
B.ClrHot := TColor($00323232);
B.ClrBorder := TColor($00505050);
B.ClrHot := TColor($00282828);
if Active then B.ClrBorder := CLR_ACTIVE_BDR
else B.ClrBorder := TColor($00444444);
B.ClrText := CLR_TEXT;
B.ClrTextAct := TColor($0000FF88);
B.Font.Name := 'Courier New';
@@ -2213,21 +2248,59 @@ begin
if FActiveVfo = 0 then
begin
// VFO-A активен: яркий зелёный
FreqDispA.ColorNormal := CLR_FREQ;
FreqDispB.ColorNormal := CLR_FREQ_DIM;
LblVfoALabel.Font.Color := CLR_FREQ;
LblVfoBLabel.Font.Color := CLR_TEXTDIM;
if BtnTopVfoASelect <> nil then StyleButton(BtnTopVfoASelect, True);
if BtnTopVfoBSelect <> nil then StyleButton(BtnTopVfoBSelect, False);
// Активный VFO-A: зелёный акцент
if BtnTopVfoASelect <> nil then begin
BtnTopVfoASelect.ClrNorm := TColor($00101C10);
BtnTopVfoASelect.ClrActive := TColor($00182818);
BtnTopVfoASelect.ClrHot := TColor($00182818);
BtnTopVfoASelect.ClrBorder := TColor($004A7A4A);
BtnTopVfoASelect.ClrText := TColor($0060B860);
BtnTopVfoASelect.ClrTextAct := TColor($0040FF60);
BtnTopVfoASelect.Active := True;
BtnTopVfoASelect.Invalidate;
end;
// Неактивный VFO-B: приглушённый
if BtnTopVfoBSelect <> nil then begin
BtnTopVfoBSelect.ClrNorm := TColor($001A1A1A);
BtnTopVfoBSelect.ClrActive := TColor($00282828);
BtnTopVfoBSelect.ClrHot := TColor($00252525);
BtnTopVfoBSelect.ClrBorder := TColor($00404040);
BtnTopVfoBSelect.ClrText := CLR_TEXTDIM;
BtnTopVfoBSelect.ClrTextAct := CLR_TEXT;
BtnTopVfoBSelect.Active := False;
BtnTopVfoBSelect.Invalidate;
end;
end else begin
// VFO-B активен: яркий зелёный
FreqDispA.ColorNormal := CLR_FREQ_DIM;
FreqDispB.ColorNormal := CLR_FREQ;
LblVfoALabel.Font.Color := CLR_TEXTDIM;
LblVfoBLabel.Font.Color := CLR_FREQ;
if BtnTopVfoASelect <> nil then StyleButton(BtnTopVfoASelect, False);
if BtnTopVfoBSelect <> nil then StyleButton(BtnTopVfoBSelect, True);
// Неактивный VFO-A: приглушённый
if BtnTopVfoASelect <> nil then begin
BtnTopVfoASelect.ClrNorm := TColor($001A1A1A);
BtnTopVfoASelect.ClrActive := TColor($00282828);
BtnTopVfoASelect.ClrHot := TColor($00252525);
BtnTopVfoASelect.ClrBorder := TColor($00404040);
BtnTopVfoASelect.ClrText := CLR_TEXTDIM;
BtnTopVfoASelect.ClrTextAct := CLR_TEXT;
BtnTopVfoASelect.Active := False;
BtnTopVfoASelect.Invalidate;
end;
// Активный VFO-B: зелёный акцент
if BtnTopVfoBSelect <> nil then begin
BtnTopVfoBSelect.ClrNorm := TColor($00101C10);
BtnTopVfoBSelect.ClrActive := TColor($00182818);
BtnTopVfoBSelect.ClrHot := TColor($00182818);
BtnTopVfoBSelect.ClrBorder := TColor($004A7A4A);
BtnTopVfoBSelect.ClrText := TColor($0060B860);
BtnTopVfoBSelect.ClrTextAct := TColor($0040FF60);
BtnTopVfoBSelect.Active := True;
BtnTopVfoBSelect.Invalidate;
end;
end;
if BtnTopVfoATX <> nil then
begin