I recomend the use of callbacks. 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. In this case the method is placed in a module. Do you recomend transformin this to a class, declaring an delegat and an event? > In this case the method is placed in a module. Do you recomend transformin this to a class, declaring an delegat and an event? Hej, Om jag skall vara ärlig så förstår jag inte mycket av detta. 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. 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) 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: 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 Hej igenAnropa progressbar från en module
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 ZellSv: Anropa progressbar från en module
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
Sv:Anropa progressbar från en module
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=SearchSv: Anropa progressbar från en module
I'm intresstend in how to implement your sugestion. May you please present an implementation?Sv:Anropa progressbar från en module
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 inSv:Anropa progressbar från en module
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 ??Sv: Anropa progressbar från en module
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.
Sv: Anropa progressbar från en module
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));
}
Sv: Anropa progressbar från en module
<code>
public sub läsfil(grid AS Grid, progr AS ProgressBar)
</code>
/JohanSv: Anropa progressbar från en module
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.WaitCursorSv: Anropa progressbar från en module
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