Прогрессия внутри пользовательской формы

Ubuntu 16.04, версия ядра 4.4.0-116

Мое устройство -

>> lspci -knn | grep bt -A2; lsusb
[..]
Bus 003 Device 008: ID 04ca:3011 Lite-On Technology Corp. 
[..]

>> lspci | grep -i ath
07:00.0 Network controller: Qualcomm Atheros QCA6174 802.11ac Wireless Network Adapter (rev 20)

Мне пришлось сделать следующее (добавив идентификатор набора микросхем к btusb-driver- патч от Pilot6) для запуска моего адаптера Bluetooth на Acer Aspire V17 Nitro VN7-791G-72FC с Combo-картой Atheros с Bluetooth Chipset Lite-On:

wget https://launchpad.net/~hanipouspilot/+archive/ubuntu/bluetooth/+files/btusb-lp1542743-dkms_0.1_all.deb
mkdir tmp
dpkg-deb -R btusb-lp1542743-dkms_0.1_all.deb tmp
sudo nano tmp/usr/src/btusb-lp1542743-0.1/btusb.c 

в

"static const struct usb_device_id blacklist_table[] = {"

добавление новой строки со следующим кодом:

{ USB_DEVICE(0x04ca, 0x3011), .driver_info = BTUSB_QCA_ROME },

после компиляции, установки и перезагрузки:

sudo dpkg-deb -b tmp btusb-lp1542743-dkms_0.1_all_modifiedAdd3011.deb
sudo dpkg -i ./btusb-lp1542743-dkms_0.1_all_modifiedAdd3011.deb
sudo reboot

теперь все работает нормально. :-) Я счастлив.

2
задан 13 August 2018 в 14:48

1 ответ

В браузере объектов при поиске Repaint в библиотеке MSForm будет найден UserForm, но Frame. Поэтому, если вы хотите напрямую использовать прогресс в пользовательской форме, вы можете попытаться обернуть ваш Bar в MSForms.Frame, а когда требуется перерисовать, просто позвоните ему для этого фрейма. В этом случае остальная форма пользователя с его элементами управления не должна влиять на это, и только кадр должен быть перекрашен.

Me.Frame1.Repaint ' Me is the main user form
вместо того, чтобы иметь отдельный прогресс, потому что это кажется ненадежным в отношении, если оно будет сверху или в фоновом режиме.

Это можно легко решить с помощью отдельной модальной формы, которая покажет ход. Эта форма будет иметь кнопку отмены и будет увеличивать событие Start, когда она отображается, поэтому вызывающая форма может начать выполнять долгое задание и событие Cancel, когда пользователь нажал кнопку отмены, преждевременно отменив прецессию. Например, HTH.

вместо того, чтобы иметь отдельный прогресс, потому что это кажется ненадежным в отношении, если оно будет сверху или в фоновом режиме.

Option Explicit

Public Event Start()
Public Event Cancel(ByRef ignore As Boolean)

Private Sub CommandButtonCancel_Click()
    Dim ignoreCance As Boolean
    ignoreCance = False
    RaiseEvent Cancel(ignoreCance)
    If ignoreCance Then
        Exit Sub
    Else
        Unload Me
    End If
End Sub

Private Sub UserForm_Activate()
    Static isActivated As Boolean
    Me.Repaint
    If Not isActivated Then
        ' ensure only once activation
        isActivated = True
        RaiseEvent Start
        Unload Me
    End If
End Sub

Public Sub Update(ByVal newValue As Long)
    ' update progrress bar here
    ' Pseudo code: Me.Progress.Value = newValue etc.
    Me.Repaint
End Sub
UserFormMain
Option Explicit

Private WithEvents progress As UserFormProgress
Private cancelProgresForm As Boolean

Private Sub CommandButtonDoSomethingLongRunning_Click()
    Set progress = New UserFormProgress
    ' Set progress form
    ' progress.Caption = ...
    ' progress.MaxValue = 123456789
    progress.Show vbModal
End Sub

Private Sub progress_Start()
    ' Callback from progress form, here runs the lung running process
    ' calculate some complete status value
    Dim completeValue As Long
    completeValue = 0
    cancelProgresForm = False
    Do
        completeValue = completeValue + 1
        progress.Update completeValue
        DoEvents
    Loop While cancelProgresForm = False And completeValue < progres.MaxValue 
End Sub

Private Sub progress_Cancel(ignore As Boolean)
    If MsgBox("Do you want to cancel?", vbQuestion Or vbYesNo) = vbNo Then
        ignore = True
    Else
        ignore = False
        cancelProgresForm = True
    End If
End Sub
0
ответ дан 15 August 2018 в 17:02

Другие вопросы по тегам:

Похожие вопросы: