La funcionalidad de una función (valga la redundancia) es para devolver "algo", es una mala practica utilizar una función como si fuese un método, o para modificar controles.
La solución es bien facil, en lugar de hacer algo como esto:
function MyFunc() as integer
main.control1.text "lo que sea"
main.control2.enabled = False
Return 0
end function
Deberías hacer:
main.Control1.text = MyFuncControl1
main.Control2.enabled = MyFuncControl2
Value = myFuncValue
Es un ejemplo pobre, pero creo que el contexto se entiende a la perfección, solo tienes que organizar mejor el código...
en esas funciones hay controles textbox, de barras de carga, y demás que me dan error, PE:
¿Vas a mencionar cual es el mensaje de la excepción?.
ese archivo no tiene acceso al form para modificar el estado de la barra, ¿como puedo hacerlo? ¿Hay otra alternativa? ¿Qué usáis habitualmente?
Sin saber de que errore hablas, intuyo que estás utilizando un thread para intentar modificar controles que no han sido creados desde dicho thread, sino desde el thread principal (el de la UI), y estás sufriendo un error del tipo
cross-threading exception precisamente por intentar hacer ese tipo de modificación ilegal, ya que no es una operación
thread-safe.
Solución:
VB:
If Me.ProgressBar1.InvokeRequired Then
Me.ProgressBar1.Invoke(Sub()
Me.ProgressBar1.PerformStep()
End Sub)
Else
Me.ProgressBar1.PerformStep()
End If
C#:
if (this.ProgressBar1.InvokeRequired) {
this.ProgressBar1.Invoke(() => { this.ProgressBar1.PerformStep(); });
} else {
this.ProgressBar1.PerformStep();
}
//=======================================================
//Service provided by Telerik (www.telerik.com)
//=======================================================
O bien puedes utilizar la misma solución pero dándole un uso más genérico:
VB:
' Invoke Control
' ( By Elektro )
'
' Usage Examples :
' InvokeControl(TextBox1, Sub(x As TextBox) x.AppendText("Hello"))
' InvokeControl(CheckBox1, Sub(x As CheckBox) x.Checked = True)
''' <summary>
''' Invokes an <see cref="T:Action"/> delegate on the specified control.
''' This method avoids cross-threading exceptions.
''' </summary>
''' <typeparam name="T"></typeparam>
''' <param name="control">The control to invoke.</param>
''' <param name="action">The encapsulated method.</param>
Public Sub InvokeControl(Of T As Control)(ByVal control As T, ByVal action As Action(Of T))
If control.InvokeRequired Then
control.Invoke(New Action(Of T, Action(Of T))(AddressOf InvokeControl),
New Object() {control, action})
Else
action(control)
End If
End Sub
' Begin Invoke Control
' ( By Elektro )
'
' Usage Examples :
' BeginInvokeControl(TextBox1, Sub(x As TextBox) x.AppendText("Hello"))
' BeginInvokeControl(CheckBox1, Sub(x As CheckBox) x.Checked = True)
''' <summary>
''' Invokes an asynchronous <see cref="T:Action"/> delegate on the specified control.
''' This method avoids cross-threading exceptions.
''' </summary>
''' <typeparam name="T"></typeparam>
''' <param name="control">The control to invoke.</param>
''' <param name="action">The encapsulated method.</param>
Public Sub BeginInvokeControl(Of T As Control)(ByVal control As T, ByVal action As Action(Of T))
If control.InvokeRequired Then
control.BeginInvoke(New Action(Of T, Action(Of T))(AddressOf BeginInvokeControl),
New Object() {control, action})
Else
action(control)
End If
End Sub
C#:
// Invoke Control
// ( By Elektro )
//
// Usage Examples :
// InvokeControl(TextBox1, Sub(x As TextBox) x.AppendText("Hello"))
// InvokeControl(CheckBox1, Sub(x As CheckBox) x.Checked = True)
/// <summary>
/// Invokes an <see cref="T:Action"/> delegate on the specified control.
/// This method avoids cross-threading exceptions.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="control">The control to invoke.</param>
/// <param name="action">The encapsulated method.</param>
public void InvokeControl<T>(T control, Action<T> action) where T : Control
{
if (control.InvokeRequired) {
control
.Invoke(new Action
<T, Action
<T
>>(InvokeControl
),
new object[] { control,
action
});
} else {
action(control);
}
}
// Begin Invoke Control
// ( By Elektro )
//
// Usage Examples :
// BeginInvokeControl(TextBox1, Sub(x As TextBox) x.AppendText("Hello"))
// BeginInvokeControl(CheckBox1, Sub(x As CheckBox) x.Checked = True)
/// <summary>
/// Invokes an asynchronous <see cref="T:Action"/> delegate on the specified control.
/// This method avoids cross-threading exceptions.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="control">The control to invoke.</param>
/// <param name="action">The encapsulated method.</param>
public void BeginInvokeControl<T>(T control, Action<T> action) where T : Control
{
if (control.InvokeRequired) {
control
.BeginInvoke(new Action
<T, Action
<T
>>(BeginInvokeControl
),
new object[] { control,
action
});
} else {
action(control);
}
}
//=======================================================
//Service provided by Telerik (www.telerik.com)
//=======================================================
⇲ Recursos que deberias leerSaludos!