diff --git a/MainForm.pas b/MainForm.pas index a686116..42182ed 100644 --- a/MainForm.pas +++ b/MainForm.pas @@ -3,6 +3,16 @@ unit MainForm; { OpenHPSDR Transceiver - Main Form 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} @@ -3389,23 +3399,26 @@ end; procedure TMainForm.BtnNRClick(Sender: TObject); begin - (Sender as TFlatButton).Tag := 1 - (Sender as TFlatButton).Tag; - StyleButton(Sender as TFlatButton, (Sender as TFlatButton).Tag = 1); - if FWDSPReady then FDSPEngine.SetNR((Sender as TFlatButton).Tag = 1); + // Используем BtnNR напрямую — корректно работает и при вызове из веб-синхронизации (Sender=nil) + BtnNR.Tag := 1 - BtnNR.Tag; + StyleButton(BtnNR, BtnNR.Tag = 1); + if FWDSPReady then FDSPEngine.SetNR(BtnNR.Tag = 1); end; procedure TMainForm.BtnNBClick(Sender: TObject); begin - (Sender as TFlatButton).Tag := 1 - (Sender as TFlatButton).Tag; - StyleButton(Sender as TFlatButton, (Sender as TFlatButton).Tag = 1); - if FWDSPReady then FDSPEngine.SetNB((Sender as TFlatButton).Tag = 1); + // Используем BtnNB напрямую — корректно работает и при вызове из веб-синхронизации (Sender=nil) + BtnNB.Tag := 1 - BtnNB.Tag; + StyleButton(BtnNB, BtnNB.Tag = 1); + if FWDSPReady then FDSPEngine.SetNB(BtnNB.Tag = 1); end; procedure TMainForm.BtnANFClick(Sender: TObject); begin - (Sender as TFlatButton).Tag := 1 - (Sender as TFlatButton).Tag; - StyleButton(Sender as TFlatButton, (Sender as TFlatButton).Tag = 1); - if FWDSPReady then FDSPEngine.SetANF((Sender as TFlatButton).Tag = 1); + // Используем BtnANF напрямую — корректно работает и при вызове из веб-синхронизации (Sender=nil) + BtnANF.Tag := 1 - BtnANF.Tag; + StyleButton(BtnANF, BtnANF.Tag = 1); + if FWDSPReady then FDSPEngine.SetANF(BtnANF.Tag = 1); end; @@ -3823,7 +3836,7 @@ end; procedure TMainForm.SyncWebNR; begin if FWebSyncBool <> (BtnNR.Tag = 1) then - BtnNRClick(nil); + BtnNRClick(BtnNR); end; // ── NB ──────────────────────────────────────────────────────────────────── @@ -3838,7 +3851,7 @@ end; procedure TMainForm.SyncWebNB; begin if FWebSyncBool <> (BtnNB.Tag = 1) then - BtnNBClick(nil); + BtnNBClick(BtnNB); end; // ── ANF ─────────────────────────────────────────────────────────────────── @@ -3853,7 +3866,7 @@ end; procedure TMainForm.SyncWebANF; begin if FWebSyncBool <> (BtnANF.Tag = 1) then - BtnANFClick(nil); + BtnANFClick(BtnANF); end; procedure TMainForm.TrkDriveChange(Sender: TObject);