Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Anropa progressbar från en module

Postades av 2006-04-12 12:51:38 - Alf Zell, i forum vb.net, Tråden har 11 Kommentarer och lästs av 737 personer


I have a problem with Net.
I have one form with a progressbar
I have one module that shall do something
and update the progressbar on the form
How shall I get a reference to the progressbar on the form from the module ?
In VB 6 I only use this code : "Form1.progressbar.value = 1" from the module


Alf Zell


Svara

Sv: Anropa progressbar från en module

Postades av 2006-04-12 13:47:59 - Andreas Hillqvist

I recomend the use of callbacks.

Create an interface to report progress:

Public Interface IProgress

    Sub Initialize(ByVal Max As Int32)

    Sub Progress(ByVal Value As Int32)

    Sub Finished(ByVal Value As Int32)

End Interface


Pass a reference of this interface to jor procedure that needs to report its progress:
    Public Sub DoStuffThatTakesLongTime(ByVal Progress As IProgress)
        Const count = 100
        Dim i As Int32

        Progress.Initialize(count)
        For i = 1 To count
            Progress.Progress(i)
            Thread.Sleep(100)
        Next

        Progress.Finished(count)
    End Sub


In your form implement the interface and take appropiate actions:
Public Class ExampleForm
    Inherits System.Windows.Forms.Form
    Implements IProgress

    Public Sub Finished(ByVal Value As Integer) Implements IProgress.Finished
        ProgressBar.Value = ProgressBar.Maximum
    End Sub

    Public Sub Initialize(ByVal Max As Integer) Implements IProgress.Initialize
        ProgressBar.Value = 0
        ProgressBar.Minimum = 0
        ProgressBar.Maximum = Max
    End Sub

    Public Sub Progress(ByVal Value As Integer) Implements IProgress.Progress
        ProgressBar.Value = Value
    End Sub

    Private Sub StartButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StartButton.Click
        DoStuffThatTakesLongTime(Me)
    End Sub

End Class


You can download this example:
Programarkivet:Callback för att uppdatera en progressbar från en modul


Svara

Sv:Anropa progressbar från en module

Postades av 2006-04-12 14:09:04 - Oskar Johansson

I wouldn't recomend callbacks in this case, instead, have a look on events. The reason for not using callbacks and interfaces is the fact that the code for using the component gets complicated.

This search on google should give you some hints http://www.google.com/search?hs=ead&hl=en&lr=&safe=off&client=firefox-a&rls=org.mozilla%3Aen-US%3Aofficial_s&q=vb.net+event+delegate&btnG=Search


Svara

Sv: Anropa progressbar från en module

Postades av 2006-04-12 14:33:21 - Andreas Hillqvist

In this case the method is placed in a module. Do you recomend transformin this to a class, declaring an delegat and an event?

I'm intresstend in how to implement your sugestion. May you please present an implementation?


Svara

Sv:Anropa progressbar från en module

Postades av 2006-04-12 15:06:06 - Oskar Johansson

> In this case the method is placed in a module. Do you recomend transformin this to a class, declaring an delegat and an event?

Yes, at lesat that's what I find most logical. Or you could pass delegates to the function, still using callbacks, but you are not limited to what name the callback should have, and you can easily have a lot of components using different callbacks.

> I'm intresstend in how to implement your sugestion. May you please present an implementation?

Well, I'm to lazy :P But it's pretty straightforward:

Ugly way:
* Declare one "universal" delegate taking one parameter; int value
* Declare three events with the "universal" delegate
When status has changed; check if event is null, if not: fire event
* Using: Add an eventhandler to your components events.

Better way:
* Create one or three classes inheriting from the baseclass EventArgs, add properties for the value (in case everyone takes only the value as parameter there's no need to have three different events.) Make the properties readonly and set the value in the constructor
* Declare one or three delegates taking the parameters "object sender" and "MyEventArgsIJustCreated e"
* Create three events for those delegates
* Create three methods with the same name as the events with the exception that you add the prefix "On" to the methodname. The parameters should be: [object sender], MyEventArgsUJustCreated e. The sender-part could be removed, just pass "this" as sender instead. In the method, check if the event is null or not. If not null, raise the event and pass "sender" (ev. this) and "e".
* When status has changed, call the apropriate OnXyz-method.
* Using: Add an eventhandler to the component's events you are interested in


Svara

Sv:Anropa progressbar från en module

Postades av 2006-04-12 16:17:17 - Alf Zell

Hej, Om jag skall vara ärlig så förstår jag inte mycket av detta.
Skall det vara så komplcerat att göra detta i VB.Net som var så enkelt i VB6 ?

jag har en modul som läser en fil

Vill visa hur långt jag kommit i filen via en progressbar
Skall samtidigt uppdatera en grid med värden från filen
både griden och progressbaren ligger på annan form


I VB6 såg det ut såhär
från formen gjorde jag detta anrop
call läsfil

Detta är från *.bas modulen
public Sub läsfil()
dim radnr as integer

öppnar filen
form1.progressbar.max=100
do
läser filen

form1.grid.additem 'lägger tiil några värden från filen till griden
radnr=radnr+1
form1.progressbar.value=radnr
loop

progressbar.visible=false
stänger filen

end sub


hur lösa detta ??


Svara

Sv: Anropa progressbar från en module

Postades av 2006-04-12 16:40:56 - Andreas Hillqvist

Det är inte snyggt att göra så då din funktion måste känna till hur formuläret är uppbygt. Vad vi förespråkar är att du gör på ett sätt vilket underlättar underhåll och förändring. Då du inte behöver ändra funktionen om formulärets ändras eller om koden anropas från andra ställen.

Jag avråder dig därför starkt från att göra som innan.
Men om du ändå vill göra det, ändra du bara Modefier för progressbaren från Friend till Public..
Efter det kan du komma åt din progress kontroll:

    Public Sub DoStuffThatTakesLongTime()
        Const count = 100
        Dim i As Int32
        Dim form As ExampleForm

        form = ExampleForm.ActiveForm
        form.ProgressBar.Maximum = count

        For i = 1 To count
            form.ProgressBar.Value = i
            Thread.Sleep(100)
        Next

    End Sub


Men det är dålig programmering.


Svara

Sv: Anropa progressbar från en module

Postades av 2006-04-12 16:44:34 - Oskar Johansson

Tja, om du vill ha det som en modul så kan man göra enligt följande (c#, kan inte syntaxen för vb.net i huvudet)

public delegate void StatusCallbackDelegate(int value);

public static void MinFunktion(StatusCallbackDelegate initializedCallback, StatusCallbackDelegate progressCallback, StatusCallbackDelegate finishedCallback)
{
//do some init
initializedCallback.DynamicInvoke(0);
//do something
for(int i=0; i < 100; i++)
{
//progress
progressCallback.DynamicInvoke(i);
}
//done
finishedCallback.DynamicInvoke(100);
}


Anrop:
private void init(int value) //Den här metoden kommer att anropas vid init
{
//Gör något
}

private void progress(int value) //Anropas när något hänt
{
//Gör något
}

private void finish(int value) //Anropas när det är klart
{
//Gör något
}

public void AnropaLångMetod()
{
MinFunktion(new StatusCallbackDelegate(this.init), new StatusCallbackDelegate(this.progress), new StatusCallbackDelegate(this.finish));
}


Svara

Sv: Anropa progressbar från en module

Postades av 2006-04-12 17:08:30 - Johan Djupmarker

Skillnaden med VB.NET är att du måste ha en referens till rätt instans av din progressbar, grid osv. En inte allt för snygg lösning är att skicka med det som parametrar till suben. Utan att ha helt koll på syntax och namnen på kontrolleran, så blir det något i denna stilen:

<code>
public sub läsfil(grid AS Grid, progr AS ProgressBar)
</code>

/Johan


Svara

Sv: Anropa progressbar från en module

Postades av 2006-04-12 17:53:59 - Alf Zell

Tack för all hjälp. valde nu givetvis det enklaste men skulle naturligtvis vilja lära mig hur jag gör det på ett riktigt sätt. Måste gag skapa en instance för varje control jag vill använda i modulen

Har ytterligare en fråga som antagligen gäller samma område
Vill ändra muspekaren i formen från modulen
i VB6 gjorde jag såhär:

frmHuvud.MousePointer = System.Windows.Forms.Cursors.WaitCursor


Svara

Sv: Anropa progressbar från en module

Postades av 2006-04-12 18:10:21 - Alf Zell

Hej igen

när jag använde VB.Net's convert från VB6 fick jag följande lösning på frågan.
Är denna ok.

Option Strict Off
Option Explicit On
Friend Class Form1
Inherits System.Windows.Forms.Form

#Region "Upgrade Support "
Private Shared m_vb6FormDefInstance As Form1
Private Shared m_InitializingDefInstance As Boolean
Public Shared Property DefInstance() As Form1
Get
If m_vb6FormDefInstance Is Nothing OrElse m_vb6FormDefInstance.IsDisposed Then
m_InitializingDefInstance = True
m_vb6FormDefInstance = New Form1()
m_InitializingDefInstance = False
End If
DefInstance = m_vb6FormDefInstance
End Get
Set
m_vb6FormDefInstance = Value
End Set
End Property
#End Region
End Class

Och för modulen:

Option Strict Off
Option Explicit On
Module Module1
Public Sub test()
Dim i As Short
Form1.DefInstance.Cursor = System.Windows.Forms.Cursors.WaitCursor
Form1.DefInstance.ProgressBar.Max = 100
For i = 1 To 100
Form1.DefInstance.ProgressBar.Value = i
Next i
Form1.DefInstance.Cursor = System.Windows.Forms.Cursors.Default
End Sub
End Module


Svara

Nyligen

  • 19:55 kick-off med fokus på hälsa?
  • 19:53 kick-off med fokus på hälsa?
  • 16:24 Föreslå en skönhetsklinik online
  • 16:23 Föreslå en skönhetsklinik online
  • 18:42 Hvor finder man håndlavede lamper
  • 18:41 Hvor finder man håndlavede lamper
  • 16:36 Allt du behöver veta om keramiskt
  • 16:14 Vem anlitar man egentligen när tak

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 725
27 958
271 751
462
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies