ProgressBar   zodpovězená otázka

VB.NET, WinForms

Preji krasny den. Mel bych jednu otazku mam projekt a k tomu projektu mam pripojenou knihovnu. V teto knihovne zpracovavam data a chtel bych umistit do formulare projektu progressbar, ktery by mi ukazoval status zpracovani v knihovne. Mam problem v tom, ze nevidim z knihovny objekt formulare a tudiz nemuzu nastavit hodnotu progressbaru. Jakekoliv napady rad prijmu. Dekuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ve třídě která obsahuje funkci pro zpracování dat zaveďte Public událost ProgressChanged která bude mít jako parametr stav zpracování (výborně se na to hodí System.ComponentModel.ProgressChangedEventHandler který používá BackgroundWorker). Tuto událost vyvolávejte během zpracování. Na tuto událost v klientské (Windows Forms) části napojte metodu která bude provádět aktualizaci ProgressBaru. Nezapomeňte na Invoke v případě že zpracování probíhá v samostatném vlákně.

'Třída v knihovně
Public Class Processor
  'Definice události odpovídající delegátu
  Public Event ProgressChanged As ProgressChangedEventHandler
  'Metoda pro zpracování dat
  Public Sub ProcessData
    For n As Integer = 1 To 4
      'Vyvolání události při změně stavu zpacování
      'Stav zpracování se nastavuje v konstruktoru ProgressChangedEventArgs
      RaiseEvent ProgressChanged(Me, New ProgressChangedEventArgs(n * 25, Nothing)
    Next
  End Sub
End Class

Private WithEvents proc As New Processor
'Metoda pro aktualizaci průběhu deklarativně napojená na událost
Private Sub UpdateProgress(ByVal sender As Object, ByVal e As ProgressChangedEventArgs) Handles proc.ProgressChanged
  If (InvokeRequired) Then
    'V případě potřeby přesunout do vlákna uživatelského rozhraní
    Invoke(New ProgressChangedEventHandler(AddressOf UpdateProgress), sender, e)
  Else
    'Aktualizovat uživatelské rozhraní (ProgressBar)
    ProgressBar1.Value = e.ProgressPercentage
  End If
End Sub
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Jsem pouze zacatecnik s invoke jsem se setkal poprve dnes chtel jsem se zeptat, proc mam InvokeRequired pri spusteni false.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Protože volání metody pochází ze stejného vlákna jako to, ze kterého bylo vytvořeno uživatelské rozhraní - tudíž není třeba provádět Invoke. Uváděl jsem to protože kdyby někdo chtěl zpracování z důvodu výkonnosti provádět ve vlastním vlákně, potom by InvokeRequired vracelo True.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ok dekuji jeste to trochu budu muset nastudovat.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zdravím.

Nepomohlo by v knižnici vytvoriť premennú, ktorá by menila svoju hodnotu na základe niečoho (neviem čo tá knižnica robí) a túto premennú len načítavať?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nevhodné řešení, protože byste musel zajišťovat periodické zjišťování této hodnoty a v případě vícevláknového zpracování ještě synchronizaci...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak to jsem necekal vyborne reseni hned se do toho poustim dekuji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback