fix button nr nb anf

This commit is contained in:
2026-03-06 00:20:43 +03:00
parent 5934098b73
commit 4e171c3d35
+25 -12
View File
@@ -3,6 +3,16 @@ unit MainForm;
{ {
OpenHPSDR Transceiver - Main Form OpenHPSDR Transceiver - Main Form
Lazarus / FPC 3.2+ (нет inline var, нет анонимных процедур) Lazarus / FPC 3.2+ (нет inline var, нет анонимных процедур)
ИСПРАВЛЕНИЯ:
- (Web NR/NB/ANF fix) BtnNRClick, BtnNBClick, BtnANFClick переписаны
без использования «Sender as TFlatButton» — теперь обращаются напрямую
к BtnNR / BtnNB / BtnANF. Это устраняет EAccessViolation / EInvalidCast
при вызове из SyncWebNR/SyncWebNB/SyncWebANF через TThread.Synchronize,
где Sender передавался как nil. Исключение в UI-потоке приводило к
разрыву WebSocket-соединения и «отключению» веб-клиента.
- SyncWebNR / SyncWebNB / SyncWebANF: передают реальную кнопку (BtnNR /
BtnNB / BtnANF) вместо nil — защита на случай изменения обработчиков.
} }
{$IFDEF FPC} {$IFDEF FPC}
@@ -3389,23 +3399,26 @@ end;
procedure TMainForm.BtnNRClick(Sender: TObject); procedure TMainForm.BtnNRClick(Sender: TObject);
begin begin
(Sender as TFlatButton).Tag := 1 - (Sender as TFlatButton).Tag; // Используем BtnNR напрямую — корректно работает и при вызове из веб-синхронизации (Sender=nil)
StyleButton(Sender as TFlatButton, (Sender as TFlatButton).Tag = 1); BtnNR.Tag := 1 - BtnNR.Tag;
if FWDSPReady then FDSPEngine.SetNR((Sender as TFlatButton).Tag = 1); StyleButton(BtnNR, BtnNR.Tag = 1);
if FWDSPReady then FDSPEngine.SetNR(BtnNR.Tag = 1);
end; end;
procedure TMainForm.BtnNBClick(Sender: TObject); procedure TMainForm.BtnNBClick(Sender: TObject);
begin begin
(Sender as TFlatButton).Tag := 1 - (Sender as TFlatButton).Tag; // Используем BtnNB напрямую — корректно работает и при вызове из веб-синхронизации (Sender=nil)
StyleButton(Sender as TFlatButton, (Sender as TFlatButton).Tag = 1); BtnNB.Tag := 1 - BtnNB.Tag;
if FWDSPReady then FDSPEngine.SetNB((Sender as TFlatButton).Tag = 1); StyleButton(BtnNB, BtnNB.Tag = 1);
if FWDSPReady then FDSPEngine.SetNB(BtnNB.Tag = 1);
end; end;
procedure TMainForm.BtnANFClick(Sender: TObject); procedure TMainForm.BtnANFClick(Sender: TObject);
begin begin
(Sender as TFlatButton).Tag := 1 - (Sender as TFlatButton).Tag; // Используем BtnANF напрямую — корректно работает и при вызове из веб-синхронизации (Sender=nil)
StyleButton(Sender as TFlatButton, (Sender as TFlatButton).Tag = 1); BtnANF.Tag := 1 - BtnANF.Tag;
if FWDSPReady then FDSPEngine.SetANF((Sender as TFlatButton).Tag = 1); StyleButton(BtnANF, BtnANF.Tag = 1);
if FWDSPReady then FDSPEngine.SetANF(BtnANF.Tag = 1);
end; end;
@@ -3823,7 +3836,7 @@ end;
procedure TMainForm.SyncWebNR; procedure TMainForm.SyncWebNR;
begin begin
if FWebSyncBool <> (BtnNR.Tag = 1) then if FWebSyncBool <> (BtnNR.Tag = 1) then
BtnNRClick(nil); BtnNRClick(BtnNR);
end; end;
// ── NB ──────────────────────────────────────────────────────────────────── // ── NB ────────────────────────────────────────────────────────────────────
@@ -3838,7 +3851,7 @@ end;
procedure TMainForm.SyncWebNB; procedure TMainForm.SyncWebNB;
begin begin
if FWebSyncBool <> (BtnNB.Tag = 1) then if FWebSyncBool <> (BtnNB.Tag = 1) then
BtnNBClick(nil); BtnNBClick(BtnNB);
end; end;
// ── ANF ─────────────────────────────────────────────────────────────────── // ── ANF ───────────────────────────────────────────────────────────────────
@@ -3853,7 +3866,7 @@ end;
procedure TMainForm.SyncWebANF; procedure TMainForm.SyncWebANF;
begin begin
if FWebSyncBool <> (BtnANF.Tag = 1) then if FWebSyncBool <> (BtnANF.Tag = 1) then
BtnANFClick(nil); BtnANFClick(BtnANF);
end; end;
procedure TMainForm.TrkDriveChange(Sender: TObject); procedure TMainForm.TrkDriveChange(Sender: TObject);